Parameters 将参数从vbscript传递到批处理文件

Parameters 将参数从vbscript传递到批处理文件,parameters,batch-file,vbscript,Parameters,Batch File,Vbscript,您好,我在通过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以不可见的方式运行批处理文件

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

我将如何传递参数?我已经搜索过了,但找不到任何适合我的方法,我可能会在运行时出错,或者参数无法通过。

假设您以这种方式调用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重试


祝你好运。

如果你以一种更系统的方式处理构建复杂命令行的问题,那么你需要更少的运气:

checkdir.bat:

@echo off
echo '%1' '%2' > checkdir.log
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
检查.vbs:

@echo off
echo '%1' '%2' > checkdir.log
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"'
或:


(保留“引用”令我惊讶)

谢谢这并没有解决我的问题,但却是一个很好的学习练习。