tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWHSのRunメソッドにおけるコマンドライン引数に関して
記事No11913
投稿日: 2008/03/27(Thu) 16:40
投稿者コマ
WHSのRunメソッドにおけるコマンドライン引数に関して

あるソフトをWHSのRunメソッドで、コマンドライン引数を渡して起動したいのですが、
例えば、メモ帳でファイルを開く場合、
次のようにするとエラーは出ないのですが、
Private Sub Command1_Click()
    Dim Shell
    Set Shell = CreateObject("Wscript.Shell")
    Call Shell.Run("C:\notepad.exe C:\aaa.txt", 1, True)
End Sub

下のようにするとエラーが出ます。
Private Sub Command1_Click()
    Dim Shell
    Set Shell = CreateObject("Wscript.Shell")
    Call Shell.Run("C:\notepad.exe C:\Documents and Settings\Taro\
デスクトップ\aaa.txt", 1, True)    
End Sub

ファイルのパスに空白がある場合はChr(34)でくくらないといけないというのを、
ネットで調べて知ることが出来たので、
    Call Shell.Run(Chr(34) & "C:\notepad.exe C:\Documents and Settings\Taro\
デスクトップ\aaa.txt" & Chr(34), 1, True)    
としてみたのですが、やはりエラーが出てしまいます。

ちなみに下の場合はエラーは出ませんでした。
    Call Shell.Run(Chr(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe" & Chr(34), 1, True)

コマンドライン引数の文字列の中に空白がある場合は、どうしたらうまくいくのでしょうか?
ご教授のほど宜しくお願い致します。

[ツリー表示へ]
タイトルRe: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11914
投稿日: 2008/03/27(Thu) 17:12
投稿者そんなはずない
もし
Call Shell.Run("C:\notepad.exe C:\aaa.txt", 1, True)
でうごくなら
    Call Shell.Run("C:\notepad.exe C:\Documents and Settings\Taro\
デスクトップ\aaa.txt", 1, True)    
でもうごくはず

[ツリー表示へ]
タイトルRe^2: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11915
投稿日: 2008/03/27(Thu) 17:31
投稿者コマ
早速のご回答ありがとうございます。

> もし
> Call Shell.Run("C:\notepad.exe C:\aaa.txt", 1, True)
> でうごくなら
>     Call Shell.Run("C:\notepad.exe C:\Documents and Settings\Taro\
> デスクトップ\aaa.txt", 1, True)    
> でもうごくはず

失礼しました。確かに動きました。いろんなパターンを試していたのでコピペでミスしてしまいました;;

動かないのは次のパターンでした。
   Call Shell.Run("C:\Documents and Settings\Taro\デスクトップ\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

「'Run' メソッドは失敗しました: 'IWshShell3' オブジェクト」
というエラーが出ました。

Chr(34)でくくってもだめでした。
    Call Shell.Run(Chr(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt" & Chr(34), 1, True)

お手数おかけしました。
宜しくお願い致します。

[ツリー表示へ]
タイトルRe^3: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11917
投稿日: 2008/03/27(Thu) 17:50
投稿者よねKEN
> Chr(34)でくくってもだめでした。
>     Call Shell.Run(Chr(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt" & Chr(34), 1, True)

#notepad.exeのパスがおかしいのは花ちゃんが指摘されている通りだと思うのでおいといて

Chr(34)(「""」のように「"」を2回重ねることで文字列中の「"」を表現できます)の付け方が間違っています。付けるなら以下のような感じで、実行コマンドとコマンドライン引数とでそれぞれで囲む必要がありますね。

"""C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and Settings\Taro\デスクトップ\aaa.txt"""

[ツリー表示へ]
タイトルRe^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11919
投稿日: 2008/03/27(Thu) 18:17
投稿者コマ
ありがとうございます。

> Chr(34)(「""」のように「"」を2回重ねることで文字列中の「"」を表現できます)の
> 付け方が間違っています。付けるなら以下のような感じで、
> 実行コマンドとコマンドライン引数とでそれぞれで囲む必要がありますね。
>
> """C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and
> Settings\Taro\デスクトップ\aaa.txt"""

早速、次のように試させて頂いたのですが、
Call Shell.Run("""C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and Settings\Taro\デスクトップ\aaa.txt""", 1, True)

やはり同じエラーが出ました。
「'Run' メソッドは失敗しました: 'IWshShell3' オブジェクト」

何度もすいませんが宜しくお願い致します。

[ツリー表示へ]
タイトルRe^5: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11922
投稿日: 2008/03/27(Thu) 19:38
投稿者そんなはずない
> 早速、次のように試させて頂いたのですが、
> Call Shell.Run("""C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and Settings\Taro\デスクトップ\aaa.txt""", 1, True)
>
> やはり同じエラーが出ました。
> 「'Run' メソッドは失敗しました: 'IWshShell3' オブジェクト」

あなたはそのコードの意味を理解しているのですか?
意味も分からず文字を並び変えても無駄ですが?

例えば、WHSってなんですか?

[ツリー表示へ]
タイトルRe^5: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11931
投稿日: 2008/03/28(Fri) 09:49
投稿者よねKEN
> 早速、次のように試させて頂いたのですが、
> Call Shell.Run("""C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and Settings\Taro\デスクトップ\aaa.txt""", 1, True)
>
> やはり同じエラーが出ました。
> 「'Run' メソッドは失敗しました: 'IWshShell3' オブジェクト」

VB6環境が手元にないので、VBScriptで以下のようなコードを書いて確認しましたが、
問題なく起動できました。

Dim Shell
Set Shell = CreateObject("Wscript.Shell")
Call Shell.Run("""C:\Documents and Settings\Taro\デスクトップ\notepad.exe"" ""C:\Documents and Settings\Taro\デスクトップ\aaa.txt""", 1, True)

#・notepad.exeをデスクトップに予めコピーしました。
#・Call Shell.Run〜の部分は提示のコードをコピペして、Taroの部分は自分のアカウントに書き換えて試しています。

> 何度もすいませんが宜しくお願い致します。

何ででしょうね。同じオブジェクトを使っているので、
VBScriptとVB6等の環境違いとは考えにくいのですが、
環境違いが何か影響しているのでしょうか。。。

[ツリー表示へ]
タイトルRe: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11916
投稿日: 2008/03/27(Thu) 17:40
投稿者花ちゃん
>Call Shell.Run("C:\notepad.exe C:\Documents and Settings\Taro\デスクトップaaa.txt", 1, True)

notepad.exe のパスが間違っている事はありませんか?
試した限りでは、問題なく起動できました。
VB6.0(SP6) WindowsXP

Call Shell.Run("C:\windows\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

[ツリー表示へ]
タイトルRe^2: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11918
投稿日: 2008/03/27(Thu) 18:16
投稿者コマ
ご回答ありがとうございます。

失礼しました。コピペでミスしていました;;

> Call Shell.Run("C:\windows\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True
このコードは私の場合も動きました。

メモ帳がデスクトップにある場合(メモ帳のパスに空白があるの場合)、下記のようにするとエラーが出ました。
   Call Shell.Run("C:\Documents and Settings\Taro\デスクトップ\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

何卒よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11920
投稿日: 2008/03/27(Thu) 18:55
投稿者花ちゃん
>    Call Shell.Run("C:\Documents and Settings\Taro\デスクトップ\notepad.exe C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

下記で起動するはずですが(但し、notepad.exe がデスクトップ上にペーストされていれば)
Call Shell.Run(Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe " & Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

[ツリー表示へ]
タイトル解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11923
投稿日: 2008/03/27(Thu) 19:52
投稿者コマ
度々ありがとうございます。

> 下記で起動するはずですが(但し、notepad.exe がデスクトップ上にペーストされていれば)
> Call Shell.Run(Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe " &
> Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

見事動きました!!感動です。
大変助かりました。どうもありがとうございました。

[ツリー表示へ]
タイトルRe: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11924
投稿日: 2008/03/27(Thu) 20:04
投稿者そんなはずない
> 度々ありがとうございます。
>
> > 下記で起動するはずですが(但し、notepad.exe がデスクトップ上にペーストされていれば)
> > Call Shell.Run(Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe " &
> > Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)
>
> 見事動きました!!感動です。
> 大変助かりました。どうもありがとうございました。

えーっ?なんで?意味からすると動きそうにない。動くはずないのに。。。

[ツリー表示へ]
タイトルRe^2: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11925
投稿日: 2008/03/27(Thu) 20:46
投稿者花ちゃん
> えーっ?なんで?意味からすると動きそうにない。動くはずないのに。。。

その前に試して見れば。

[ツリー表示へ]
タイトルRe^3: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11929
投稿日: 2008/03/28(Fri) 09:41
投稿者よねKEN
> > えーっ?なんで?意味からすると動きそうにない。動くはずないのに。。。
>
> その前に試して見れば。

私も「そんなはずない」さんと同じように考えました。
試してみると確かに動きますが、私にはどうして動くのか説明できません。
#Wscript.ShellのRunメソッドでいろいろ独自なパースが行われているのでしょうかね。
なぜ動くのかご存知でしたらご教示いただければ幸いです。

ちなみに、花ちゃん提示のソースのコマンド文字列だと「ファイル名を指定して実行」では動かないんですよね。

私が思うところの正しい記述は以下のようなものと思うのですが。

Call Shell.Run(Chr(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe" & Chr(34) & " " & Chr(34) & "C:\Documents and Settings\Taro\デスクトップ\aaa.txt" & Chr(34), 1, True)

#後半のChr(34)の2つはnotepad.exeの場合は省略も可。

[ツリー表示へ]
タイトルRe^4: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11935
投稿日: 2008/03/28(Fri) 11:42
投稿者花ちゃん
下記コードを試して見て下さい。

Private Sub Command1_Click()
   Shell "MSPAINT.EXE C:\Documents and Settings\UserName\My Documents\test.bmp", vbNormalNoFocus
End Sub
Private Sub Command2_Click()
   Shell "MSPAINT.EXE " & Chr$(34) & "C:\Documents and Settings\UserName\My Documents\test.bmp" & Chr$(34), vbNormalNoFocus
End Sub

空白を使用したフォルダー等はShell 関数では使用できません。
(MS-DOS 流ルールにより)そこでファイル名にChr(34) & "ファイル名" & Chr(34) を
追加することで空白入りファイルが使えるようになります。

と VB5.0 Win95 の頃によく聞いた記憶があります。

http://hanatyan.sakura.ne.jp/vbhlp/tap_shell.htm

上記より下記の ファイルの指定を保護する 項以下の解説と同じ理由ではないでしょうか?
http://msdn2.microsoft.com/ja-jp/library/xe736fyk.aspx

[ツリー表示へ]
タイトルRe^5: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11936
投稿日: 2008/03/28(Fri) 12:45
投稿者よねKEN
意図がうまく伝わらなかったようで、すみません。

No.11920 で花ちゃんが提示されたコードで作成されるコマンドラインに渡る文字列は、

「"C:\Documents and Settings\Taro\デスクトップ\notepad.exe "C:\Documents and
Settings\Taro\デスクトップ\aaa.txt」

という風になります。
このときのダブルクォートで括るその括り方が私の知っている知識(※)と照らしあわせると奇妙で、動かないだろうと予想したのです。
(コマンドとコマンドライン引数の間の区切りの空白がコマンドの""の中に入っています。)
でも、実際に動かしてみると動作しています。

※私の知っている知識・・・No.11935で花ちゃんが提示されている内容そのものです。

No.11920で書こうとされたコードですが、

> Call Shell.Run(Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe " & Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)


本当は以下のようなつもりで書かれたのではないでしょうか?

Call Shell.Run(Chr$(34) & "C:\Documents and Settings\Taro\デスクトップ\notepad.exe" & Chr$(34) & " C:\Documents and Settings\Taro\デスクトップ\aaa.txt", 1, True)

#コマンドとコマンドライン引数の間の空白の位置が""の中ではなく外

[ツリー表示へ]
タイトルRe^6: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11938
投稿日: 2008/03/28(Fri) 17:44
投稿者そんなはずない
>(コマンドとコマンドライン引数の間の区切りの空白がコマンドの""の中に入っています。)

これは引っ掛けですね。実はその空白は区切りではなく、
一般のシンタクスでも" .exe "と書いて無視されるもののようです。
区切りは2つ目の"でその後の空白が必要ないのです。
run """  .exe""引数"
で実行できるようです。

[ツリー表示へ]
タイトルRe^7: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11939
投稿日: 2008/03/28(Fri) 20:39
投稿者よねKEN
> >(コマンドとコマンドライン引数の間の区切りの空白がコマンドの""の中に入っています。)
>
> これは引っ掛けですね。実はその空白は区切りではなく、
> 一般のシンタクスでも" .exe "と書いて無視されるもののようです。
> 区切りは2つ目の"でその後の空白が必要ないのです。
> run """  .exe""引数"
> で実行できるようです。

フォローありがとうございます。
Runメソッドでは「"」の存在が、「 」(空白)がなくても、コマンドとコマンドライン引数を分けてくれるようですね。

[ツリー表示へ]
タイトルRe^4: 解決Re^4: WHSのRunメソッドにおけるコマンドライン引数に関して
記事No11937
投稿日: 2008/03/28(Fri) 17:37
投稿者そんなはずない
> #Wscript.ShellのRunメソッドでいろいろ独自なパースが行われているのでしょうかね。

そうですね。

> ちなみに、花ちゃん提示のソースのコマンド文字列だと「ファイル名を指定して実行」では動かないんですよね。

こちらは一般的なパーズですね。

> 私が思うところの正しい記述は以下のようなものと思うのですが。

通常は、こちらを他人に推奨しますね。

[ツリー表示へ]