带引号的任务计划程序参数不起作用

Posted

技术标签:

【中文标题】带引号的任务计划程序参数不起作用【英文标题】:Task Scheduler arguments with quotes not working 【发布时间】:2018-01-18 14:45:04 【问题描述】:

示例 run.bat 文件

echo "Test"
echo %1
echo %2
set /p DUMMY=Hit ENTER to continue...

所以这个 bat 文件将打印给它们的前两个参数。参数可能包含也可能不包含空格。为此,我用双引号对它们进行了转义。

run.bat -test "arg2 d"

当通过命令行调用时,它工作得非常好。

我想通过 Task Scheduler 安排那个 bat。但是任务调度器会打开​​一个cmd窗口并立即关闭。

不工作

工作

注意参数中的引号。这就是问题所在。那么我怎样才能用空格来逃避这个论点。

此外,如果输入的程序/脚本文件位置不带引号,则参数有效。但为此脚本必须位于没有空格的文件夹中。

操作错误

那么如何在文件路径中创建一个带有空格的任务以及带有空格的参数。

它只发生在 Windows 10 中。顺便说一句,它在 Windows 7 中运行良好。

【问题讨论】:

我在任务调度服务的 svchost.exe 进程上附加了一个调试器,断点设置在CreateProcessAsUserW。事实证明,它将命令行重写为"C:\Windows\SYSTEM32\cmd.exe /c """PATH\TO\BAT"" -test "arg2 d"""。这不仅是错误的(注意""PATH\TO\BAT"" 中的双引号)而且很奇怪,因为CreateProcess 已经知道如何通过%ComSpec% /c 直接运行.bat 或.cmd 脚本。 作为一种解决方法,将程序设置为cmd.exe,并将参数设置为/c ""D:\Test Space\run.bat" -test "arg2 d"" @eryksun 谢谢。 哇,还有其他解决方法吗? 类似问题。我让我的 Windows 2008 调度程序运行 .vbs 文件。在我将任务导出/导入到 Windows 2016 服务器后,我必须删除引号。否则,它只会卡在“运行”状态。一旦我删除了引号,它就可以正常工作了。 【参考方案1】:

我遇到了类似的问题。我在 Server 2012 R2 上运行计划任务。我不得不将任务的下拉菜单更改为 Windows 2012 而不是 2008,它似乎可以工作。也许Win10也需要在任务中选择2012。

【讨论】:

【参考方案2】:

简短回答:使用整个命令行,就像在命令提示符中键入一样,并在其周围加上引号。 不要转义任何内部引号,只需在命令行的开头和结尾加上一个额外的引号即可。

然后将计划程序设置为 cmd.exe 并将参数设置为 /c(引用的命令行)

长答案:根据 cmd.exe 的文档(在 'cmd /?' 中找到)

如果指定了 /C 或 /K,则命令行后面的剩余部分 开关作为命令行处理,其中以下逻辑 用于处理引号 (") 字符:

    如果满足以下所有条件,则保留命令行中的引号字符:
没有 /S 开关 正好两个引号字符 两个引号字符之间没有特殊字符,其中 special 是以下之一:&()@^| 两个引号字符之间有一个或多个空白字符 两个引号字符之间的字符串是可执行文件的名称。
    否则,旧的行为是查看第一个字符是否是引号字符,如果是,去除前导字符并删除 命令行上的最后一个引号字符,保留后面的任何文本 最后一个引号字符。

【讨论】:

以上是关于带引号的任务计划程序参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

设置为以系统帐户运行时计划任务不起作用

Windows的计划任务启动程序参数怎么设置

入口点的 ECS 计划任务容器覆盖不起作用

计划任务在路径中有空格

为啥计划任务执行固定速率中的代码不起作用?

使用节点运行脚本的计划任务将不起作用