批处理文件调用VBS,参数中带有“引用空格”

时间:2014-03-13 01:55:38

标签: file batch-file parameters spaces

我正在尝试创建批处理文件以从TXT文件重新启动多台计算机。只要/ c"在这里评论"参数没有空格。如果我通过"测试"作为评论,我得到"测试"在弹出窗口中重启,如预期的那样。如果我通过"测试空间"作为评论,我仍然只能得到"测试"在弹出窗口中。关于@echo,我已经验证了注释在传递给VBS时保留了空格,所以我认为问题是我正在运行" invisible.vbs"脚本以防止另一个CMD窗口打开并挂起原始BAT脚本。

我希望能够运行类似于:

的最终命令

shutdown / r / m \\ 127.0.0.1 / t 120 / c"您的计算机将在两分钟内关闭维护任务"

非常感谢任何帮助!

restart.bat的重要部分:

for /f "tokens=1-3" %%c in (%FilePath%) do WScript /nologo "%windir%\myscripts\invisible.vbs" "shutdown /r /m \\%%c /t %delay% /c %message%"

我还尝试在%message%附近添加额外的引号但没有成功:

for /f "tokens=1-3" %%c in (%FilePath%) do WScript /nologo "%windir%\myscripts\invisible.vbs" "shutdown /r /m \\%%c /t %delay% /c "%message%""

invisible.vbs脚本(在StackExchange上找到):

CreateObject("Wscript.Shell").Run "" & WScript.Arguments(0) & "", 0, False

非常感谢任何帮助!

编辑:使用建议的第三种方法,我收到一个脚本错误:

Script:    C:\Windows\myscripts\invisible.vbs
Line:      1
Char:      46
Error:     The system cannot find the file specified
Code:      80070002
Source:    (null)

编辑2:我也尝试了第一种方法,现在我得到一个vbscript echo弹出窗口,其中包含我希望发送的正确命令,但命令不会被发送。我离程序员很远,我用过的唯一的VBS就是我在网上发现的东西。我非常感谢你到目前为止所提供的帮助,但我仍然无法让它发挥作用。

2 个答案:

答案 0 :(得分:3)

你不能这样做。 WScript中Arguments对象背后的逻辑似乎删除了引号。

所以,我至少可以考虑三种选择

1)最简单:使用另一个字符作为引用的指示符,并将其替换为vbs脚本中的引用

cmd code : cscript myscript.vbs "shutdown /r /m \\%%c /t %delay% /c '%message%'"
vbs code : WScript.CreateObject("WScript.Shell").Run replace(WScript.Arguments(0),"'",""""), 0, False

唯一的问题是,在某些时候,您可能需要将占位符作为真实角色使用。

2)最复杂:使用wmi检索当前进程ID,并从此处检索脚本的原始命令行。很多代码,如果有兴趣的话,在StackOverflow这里有一些不错的样本。

3)简单,快速,不寻常。使用环境变量。将命令保存到变量中,并将变量的名称传递给脚本。从中,检索变量内容并使用它

cmd code : set "runVar=shutdown /r /m \\%%c /t %delay% /c "%message%""
           wscript //nologo "%windir%\myscripts\runInvisible.vbs" runVar

vbs code : With WScript.CreateObject("WScript.Shell") : .Run .ExpandEnvironmentStrings("%" & WScript.Arguments(0) & "%"), 0, False : End With

答案 1 :(得分:0)

cmd code or bat code:
wscript //nologo invisible.vbs "hello world" 0

某种程度上,结尾处的零会导致引号之间的部分被视为一个参数

享受