DOSコマンドの実行
DOSコマンドの実行
こんにちは
ABから、DOSコマンドを実行するにはどのように記述したらいいんでしょうか。
例えば、
NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord
をABで実行したいのですが...。
ABから、DOSコマンドを実行するにはどのように記述したらいいんでしょうか。
例えば、
NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord
をABで実行したいのですが...。
Execなどが簡単ですが、コマンドプロンプトが表示されます。
それが嫌ならば、CreateProcessを使います。
フラグのDETACHED_PROCESSがコンソールを表示させない指定です。
それが嫌ならば、CreateProcessを使います。
コード: 全て選択
Dim CmdLine As String
CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
If CreateProcess(0, StrPtr(CmdLine), ByVal 0, ByVal 0, FALSE, DETACHED_PROCESS, 0, 0, si, pi) Then
CloseHandle(pi.hProcess)
CloseHandle(pi.hThread)
End If
Re: DOSコマンドの実行
すいませんが、「NET USE」というコマンドに詳しくないので、> ABから、DOSコマンドを実行するにはどのように記述したらいいんでしょうか。
> 例えば、
> NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord
> をABで実行したいのですが...。
「dir hoge* >> hoge.txt」というDOSコマンドを実行する、の例で書きます。
コード: 全て選択
'バッチファイルに、実行するDOSコマンドを書き出す。
Open "DosCommandTemp.bat" For Output As #1
Print #1, "dir hoge* >> hoge.txt"
Colse #1
'書き出したDOSコマンドを実行する。
Exec "DosCommandTemp.bat"
それが気になる場合には、以下のような方法で解決できると思います。
コード: 全て選択
Dim strTempBat As String
'バッチファイルに、実行するDOSコマンドを書き出す。
strTempBat = "DosCommandTemp.bat"
Open strTempBat For Output As #1
Print #1, "dir hoge* >> hoge.txt"
Colse #1
'書き出したDOSコマンドを実行し、終了まで待機する。
ExecAndWait( StrPtr(strTempBat) )
'動作の終了したバッチファイルを削除する。
Kill strTempBat
'指定されたパスの実行し、動作が終了するまで待機する関数。
'※BackSearchABから転載。「他の起動」で検索した一件目を参照。
Sub ExecAndWait( pszAppPath As BytePtr )
Dim si As STARTUPINFO, pi As PROCESS_INFORMATION
si.cb = Len(si)
CreateProcess( NULL, pszAppPath, ByVal NULL, ByVal NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, si, pi)
CloseHandle(pi.hThread)
WaitForSingleObject(pi.hProcess, INFINITE)
CloseHandle(pi.hProcess)
End Sub
それを使わない場合であれば、
こちらのクラスWsFileReadWriteを使って(とコレは宣伝^^;)、
以下のような書き方もあります。
コード: 全て選択
/*
※N88BASICコマンドを使わないVer。
上記の関数ExecAndWait()の定義と、クラスWsFileReadWriteの定義を、
コードのどこかにコピーして置いてください。
*/
Dim strTempBat As String
Dim rw As WsFileReadWrite '簡易テキスト読み書き用クラス
Dim retAns As Long
'バッチファイルに、実行するDOSコマンドを書き出す。
strTempBat = "DosCommandTemp.bat"
retAns = rw.SetContents( "dir hoge* >> hoge.txt" ) '書く内容をセット
retAns = rw.WriteContents( StrPtr(strTempBat) ) 'ファイルに書き出す。
'書き出したDOSコマンドを実行し、終了まで待機する。
ExecAndWait( StrPtr(strTempBat) )
'動作の終了したバッチファイルを削除する。
retAns = DeleteFile( StrPtr(strTempBat) )
・・・私でしたら、以上のようなコードでDOSコマンドを扱いますが、
他にもっと簡単な扱い方もあるかもしれませんね^^;
Re: DOSコマンドの実行
おっと、時間差でイグトランスさんが書き込まれてましたね。
しかもずっと簡単な方法を(^^;)。
CreateProcess()でパス指定(cmd.exe)無しでDOSコマンドを実行できるとは
知りませんでした・・・。
というか、今気づきましたが
とするだけで、
指定されたコマンドを実行してくれるんですね、cmd.exeって^^;
・・・cmd記述はWin2000/XP専用ですか?汗
しかもずっと簡単な方法を(^^;)。
CreateProcess()でパス指定(cmd.exe)無しでDOSコマンドを実行できるとは
知りませんでした・・・。
というか、今気づきましたが
コード: 全て選択
Exec Ex"cmd.exe /C \qdir hoge* >> hoge.txt\q"
指定されたコマンドを実行してくれるんですね、cmd.exeって^^;
・・・cmd記述はWin2000/XP専用ですか?汗
みなさん、ありがとうございます
助かりました。
皆さんが提示してくださった記述を試してみました。
イグトランスさんが提示してくださった記述が一番簡単そうでしたので、
そちらでやってみました
結果、ドライブのマップが可能になりました。
ありがとうございました。
あと、1点教えてください。
Username を %USERNAME% の形式で受け取って、それを以下のコマンドに受け渡すにはどのようにすればよろしいのでしょうか。
CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"
皆さんが提示してくださった記述を試してみました。
イグトランスさんが提示してくださった記述が一番簡単そうでしたので、
そちらでやってみました
結果、ドライブのマップが可能になりました。
ありがとうございました。
あと、1点教えてください。
Username を %USERNAME% の形式で受け取って、それを以下のコマンドに受け渡すにはどのようにすればよろしいのでしょうか。
CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"
Usernameの部分を環境変数USERNAMEから読み取って当てはめたいということでよいですよね?
ExpandEnvironmentStringsという%~%の形式で環境変数を参照している文字列を展開してくれる関数があります。
ついでにString型を使用するようにラップしたExpandEnvironmentStrings$関数を用意してみました。
それを使うとこういう風になります。
CmdLineはさっきと同じようにCreateProcessの引数に指定します。
これはExpandEnvironmentStringsの宣言とExpandEnvironmentStrings$の本体です。
ソースコードのどこかに書いておいてください。
ExpandEnvironmentStringsという%~%の形式で環境変数を参照している文字列を展開してくれる関数があります。
ついでにString型を使用するようにラップしたExpandEnvironmentStrings$関数を用意してみました。
それを使うとこういう風になります。
コード: 全て選択
Dim CmdLine As String
CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:%USERNAME% PassWord"
CmdLine = ExpandEnvironmentStrings$(StrPtr(CmdLine))
これはExpandEnvironmentStringsの宣言とExpandEnvironmentStrings$の本体です。
ソースコードのどこかに書いておいてください。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Declare Function ExpandEnvironmentStrings Lib "kernel32" Alias "ExpandEnvironmentStringsA" (
pName As BytePtr,
pBuffer As BytePtr,
nSize As DWord) As DWord
Function ExpandEnvironmentStrings$(name As BytePtr) As String
Dim length As DWord
length = ExpandEnvironmentStrings(name, 0, 0)
ExpandEnvironmentStrings$ = ZeroString(length)
length = ExpandEnvironmentStrings(name, StrPtr(ExpandEnvironmentStrings$), length + 1)
SetDWord(StrPtr(ExpandEnvironmentStrings$) As VoidPtr - SizeOf (DWord), length - 1)
End Function
出遅れたけど一行で。
コード: 全て選択
ShellExecute(0,0,"cmd.exe","NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord",0,SW_HIDE)
おはようございます。
早速色々と実験していますが、以下のコードを実行した場合に、実在しない
または権限の無いフォルダを指定した場合に何らかのエラーコードを取得
することは可能でしょうか。
> Dim CmdLine As String
> CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"
>
> Dim si As STARTUPINFO
> Dim pi As PROCESS_INFORMATION
> If CreateProcess(0, StrPtr(CmdLine), ByVal 0, ByVal 0, FALSE, DETACHED_PROCESS, 0, 0, si, pi) Then
> CloseHandle(pi.hProcess)
> CloseHandle(pi.hThread)
> End If
早速色々と実験していますが、以下のコードを実行した場合に、実在しない
または権限の無いフォルダを指定した場合に何らかのエラーコードを取得
することは可能でしょうか。
> Dim CmdLine As String
> CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"
>
> Dim si As STARTUPINFO
> Dim pi As PROCESS_INFORMATION
> If CreateProcess(0, StrPtr(CmdLine), ByVal 0, ByVal 0, FALSE, DETACHED_PROCESS, 0, 0, si, pi) Then
> CloseHandle(pi.hProcess)
> CloseHandle(pi.hThread)
> End If
NETコマンドの仕様にもよりますが...> 早速色々と実験していますが、以下のコードを実行した場合に、実在しない
> または権限の無いフォルダを指定した場合に何らかのエラーコードを取得
> することは可能でしょうか。
プロセスの終了コードで判定できるかも?
GetExitCodeProcess関数
コード: 全て選択
Dim dwExitCode As DWord
'プロセス終了待ち
WaitForSingleObject(pi.hProcess, INFINITE)
'終了コードを取得
GetExitCodeProcess(pi.hProcess, dwExitCode)
Print "終了コード:", dwExitCode