【问题标题】:Batch file call VBS with "quoted spaces" in argument批处理文件调用 VBS,参数中带有“带引号的空格”
【发布时间】:2014-04-17 12:53:34
【问题描述】:

我正在尝试创建一个批处理文件以从一个 TXT 文件重新启动多台计算机。只要 /c "comment here" 参数没有空格,一切正常。如果我通过“测试”作为评论,我会在弹出窗口中看到“测试”以重新启动,正如预期的那样。如果我通过“测试空间”作为评论,我仍然只会在弹出窗口中得到“测试”。关闭@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 回显弹出窗口,其中包含我希望发送的正确命令,但该命令未发送。我远不是程序员,我使用的唯一 VBS 是我在网上找到的东西。我非常感谢您迄今为止提供的帮助,但我仍然无法使其正常工作。

【问题讨论】:

    标签: file batch-file parameters spaces


    【解决方案1】:

    你做不到。 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
    

    【讨论】:

    • 我选择尝试您的第三种方法,但出现脚本错误。编辑了我原来的帖子。
    • 尝试了第一个选项也没有成功。
    • @MakoHunter,没有看到您的代码,我无法说明为什么您在第三种情况下会出错,对我来说它有效。对于第一个示例,WScript.Echo 是显示弹出窗口的内容。它的目的是作为一个样本。我已经根据您的情况调整了代码。
    【解决方案2】:
    cmd code or bat code:
    wscript //nologo invisible.vbs "hello world" 0
    

    不知何故,最后的零导致引号之间的部分仍然被视为一个参数

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 2015-07-21
      • 2019-04-15
      • 2012-09-27
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      相关资源
      最近更新 更多