DOSコマンドの実行

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: DOSコマンドの実行

by Tomorrow » 2006年4月10日(月) 17:03

> 早速色々と実験していますが、以下のコードを実行した場合に、実在しない
> または権限の無いフォルダを指定した場合に何らかのエラーコードを取得
> することは可能でしょうか。
NETコマンドの仕様にもよりますが...
プロセスの終了コードで判定できるかも?

GetExitCodeProcess関数

コード: 全て選択

Dim dwExitCode As DWord

'プロセス終了待ち
WaitForSingleObject(pi.hProcess, INFINITE)

'終了コードを取得
GetExitCodeProcess(pi.hProcess, dwExitCode)
Print "終了コード:", dwExitCode

by » 2006年4月10日(月) 09:06

おはようございます。

早速色々と実験していますが、以下のコードを実行した場合に、実在しない
または権限の無いフォルダを指定した場合に何らかのエラーコードを取得
することは可能でしょうか。

> 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

by » 2006年4月08日(土) 09:50

またまた みなさん、ありがとうございます。

自宅では環境が整いませんので、月曜日に会社で実験してみます。
また結果報告します。

by みどるべあ » 2006年4月07日(金) 22:18

出遅れたけど一行で。

コード: 全て選択

ShellExecute(0,0,"cmd.exe","NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord",0,SW_HIDE)

by イグトランス » 2006年4月07日(金) 22:14

Usernameの部分を環境変数USERNAMEから読み取って当てはめたいということでよいですよね?

ExpandEnvironmentStringsという%~%の形式で環境変数を参照している文字列を展開してくれる関数があります。
ついでにString型を使用するようにラップしたExpandEnvironmentStrings$関数を用意してみました。
それを使うとこういう風になります。

コード: 全て選択

Dim CmdLine As String
CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:%USERNAME% PassWord"
CmdLine = ExpandEnvironmentStrings$(StrPtr(CmdLine))
CmdLineはさっきと同じようにCreateProcessの引数に指定します。

これはExpandEnvironmentStringsの宣言とExpandEnvironmentStrings$の本体です。
ソースコードのどこかに書いておいてください。

みなさん、ありがとうございます

by » 2006年4月07日(金) 18:15

助かりました。

皆さんが提示してくださった記述を試してみました。
イグトランスさんが提示してくださった記述が一番簡単そうでしたので、
そちらでやってみました
結果、ドライブのマップが可能になりました。
ありがとうございました。

あと、1点教えてください。

Username を %USERNAME% の形式で受け取って、それを以下のコマンドに受け渡すにはどのようにすればよろしいのでしょうか。

CmdLine = "NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord"

Re: DOSコマンドの実行

by 淡幻星 » 2006年4月07日(金) 17:25

おっと、時間差でイグトランスさんが書き込まれてましたね。
しかもずっと簡単な方法を(^^;)。

CreateProcess()でパス指定(cmd.exe)無しでDOSコマンドを実行できるとは
知りませんでした・・・。
というか、今気づきましたが

コード: 全て選択

Exec Ex"cmd.exe /C \qdir hoge* >> hoge.txt\q"
とするだけで、
指定されたコマンドを実行してくれるんですね、cmd.exeって^^;
・・・cmd記述はWin2000/XP専用ですか?汗

Re: DOSコマンドの実行

by 淡幻星 » 2006年4月07日(金) 17:17

> ABから、DOSコマンドを実行するにはどのように記述したらいいんでしょうか。
> 例えば、
> NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord
> をABで実行したいのですが...。
すいませんが、「NET USE」というコマンドに詳しくないので、
「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"
しかし、このコードですと書き出した一時ファイル「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
もしくは、上記はN88BASICのコマンド(Openなど)をフルに使ってますので、
それを使わない場合であれば、
こちらのクラス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コマンドを扱いますが、
他にもっと簡単な扱い方もあるかもしれませんね^^;

by イグトランス » 2006年4月07日(金) 17:02

Execなどが簡単ですが、コマンドプロンプトが表示されます。
それが嫌ならば、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
フラグのDETACHED_PROCESSがコンソールを表示させない指定です。

DOSコマンドの実行

by » 2006年4月07日(金) 13:40

こんにちは

ABから、DOSコマンドを実行するにはどのように記述したらいいんでしょうか。
例えば、
NET USE Q: \\SV01\Appli /PERSISTENT:YES /USER:Username PassWord
をABで実行したいのですが...。

ページトップ