3

こんにちは、vbscript を介してバッチ ファイルにパラメータを渡す際に問題が発生しています。私はプログラミングがあまり得意ではないので、ばかげたことを見逃しているだけだと確信しています。とにかく、vbscript を使用して目に見えないバッチ ファイルを実行しています。

vbscript は次のように呼び出されます。"C:\Program Files (x86)\scripts\check.vbs" %S "%D"

%S は状態、%D はディレクトリです。

"C:\Program Files (x86)\scripts\checkdir.bat" %S "%D"迷惑なdosウィンドウがポップアップすることを除いて、すべてが正常に機能するため、バッチファイルを直接呼び出すと。

それで、インターネットを見回して、バッチファイルをサイレントに実行できるこのvbscriptを見つけました。実際にはサイレントに実行されますが、パラメータはバッチ ファイルに渡されません。

vbscript は次のとおりです。

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & "C:\Program Files (x86)\scripts\checkdir.bat" & Chr(34), 0
Set WshShell = Nothing

パラメータを渡すにはどうすればよいですか?検索しましたが、うまくいくものは何も見つかりませんでした。実行時にエラーが発生するか、パラメーターが渡されませんでした。

4

2 に答える 2

4

この方法で VBScript を呼び出していると仮定すると...

wscript myscript.vbs ArgumentS ArgumentD

次に、2行目をこれに交換するとうまくいくはずです...

WshShell.Run """C:\Program Files (x86)\scripts\checkdir.bat"" " & WScript.Arguments.Item(0) & " """ & WScript.Arguments.Item(1) & """", 0

引数 D を二重引用符で囲んで渡す必要があると想定しているため、それらを含めていることに注意してください。文字列内では、VBScript は二重引用符を単一二重引用符に置き換えます。うまくいかない場合は、WshShell.Run を wscript.echo に変更すると、VBScript が渡そうとしているものを正確に確認できるはずです。正しくない場合は、調整して WshShell.Run で再試行してください。

幸運を。

于 2013-05-23T19:58:06.660 に答える
1

より体系的な方法で複雑なコマンド ラインを構築するという問題に取り組む場合、運はそれほど必要ありません。

checkdir.bat:

@echo off
echo '%1' '%2' > checkdir.log

チェック.vbs:

Option Explicit

Dim oFS  : Set oFS  = CreateObject("Scripting.FileSystemObject")
Dim oWAU : Set oWAU = WScript.Arguments.Unnamed
Dim oWS : Set oWS = CreateObject("WScript.Shell")

Dim S : S = "state"
If oWAU.Count >= 1 Then S = oWAU(0)
Dim D : D = "directory"
If oWAU.Count >= 2 Then D = oWAU(1)

Dim sBFspec : sBFSpec = oFS.GetAbsolutePathName(".\checkdir.bat")

' One way of building a command from parts that need quoting
' Replacing placeholders in a template is another one
' Everything is better than concatenating, cf:
' """C:\Program Files (x86)\scripts\checkdir.bat"" " & WScript.Arguments.Item(0) & " """ & WScript.Arguments.Item(1) & """", 0
Dim sCmd    : sCmd    = Join(Array( _
      qq(sBFSpec) _
    , qq(S) _
    , qq(D) _
))

' sanity check
WScript.Echo "About to call:"
WScript.Echo sCmd
WScript.Echo "Your last chance to check!"

Dim iRet : iRet = oWS.Run(sCmd, 0, True)
If 0 = iRet Then
   WScript.Echo "looks ok:"
   WScript.Echo oFS.OpenTextFile(".\checkdir.log").ReadAll()
Else
   WScript.Echo "looks bad:", iRet
End If

WScript.Quit 0

Function qq(s) : qq = """" & s & """" : End Function

出力:

cscript check.vbs
About to call:
"E:\trials\SoTrials\answers\16722567\vbs\checkdir.bat" "state" "directory"
Your last chance to check!
looks ok:
'"state"' '"directory"'

cscript check.vbs "i don't care" "c:\ \ \simsalabim"
About to call:
"E:\trials\SoTrials\answers\16722567\vbs\checkdir.bat" "i don't care" "c:\ \ \simsalabim"
Your last chance to check!
looks ok:
'"i don't care"' '"c:\ \ \simsalabim"'

また:

checkdir.bat "i don't care" "c:\ \ \simsalabim"

type  checkdir.log
'"i don't care"' '"c:\ \ \simsalabim"'

( " 引用符の保存は私にとって驚きでした)

于 2013-05-23T20:25:38.207 に答える