从VBScript向批处理文件传递参数

4

你好,我有一个问题要在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

我该如何传递参数?我已经搜索了,但是没有找到适用于我的任何内容。我要么在运行过程中出现错误,要么参数无法传递。

2个回答

4
假设您是这样调用 VBScript 的......
假设您是以这种方式调用 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。
祝您好运。

1

如果您以更系统化的方式处理构建复杂命令行的问题,就需要更少的运气:

checkdir.bat:

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

check.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"'

(保留“引号”让我感到惊讶)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接