schtasks 命令中的单引号
Posted
技术标签:
【中文标题】schtasks 命令中的单引号【英文标题】:Single quotes in schtasks command 【发布时间】:2014-12-11 14:24:05 【问题描述】:我正在尝试使用 SCHTASKS 在 Windows 上创建计划任务。 参数包括单引号。如果我手动创建任务,它可以工作。 在 Windows 任务计划程序 GUI 中,“详细信息”(在操作选项卡中)显示如下:
powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -
但是,当我输入我的 SCHTASKS 命令时...
schtasks.exe /Create /TN "My Task" /TR "powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -" /SC MINUTE /mo 60 /RL HIGHEST
然后这会出现在 GUI 中(注意在第一个实例中将单引号解释为双引号,而不是在第二个实例中:
powershell (New-Object System.Net.WebClient).DownloadString ("http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -
我尝试过转义它等(这对双引号有效,但对单引号无效)但似乎无法弄清楚..?!
非常感谢您的任何建议。
【问题讨论】:
问题出在schtasks.exe
运行时库命令参数解析中。可能没有任何方法可以从命令行执行此操作。尝试改用task scheduler API。
【参考方案1】:
我最近偶然发现了同样的问题。
我需要使用此命令向任务添加操作:
Powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object Net.WebClient).DownloadString('https://url/to/script.ps1'))"
完全可以使用此命令手动创建任务,但使用schtasks
命令,显然不可能在任务的参数字段中呈现单引号(至少不能在它前面没有反斜杠,这使它无法使用)。
所以经过一番折腾,我找到了一种使用单引号不使用来指定参数的方法:
Powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object Net.WebClient).DownloadString(\"https://url/to/script.ps1\"))"
这也适用于任务管理器...耶!
这需要更多的摆弄,但我手动使用 schtasks
命令(在命令提示符中,而不是在 powershell 中)让它工作,如下所示:
schtasks /Create /TN "My Task Name" /RU SYSTEM /SC DAILY /ST 23:00 /TR "Powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((New-Object Net.WebClient).DownloadString(\\\"https://url/to/script.ps1\\\""))\""
是的,这些是 url 周围的三个反斜杠...基本上,引号需要用反斜杠转义,反斜杠需要用另一个反斜杠转义。
现在开始让它在 powershell 中工作......稍后再摆弄,我得出了这个结果:
schtasks /Create /TN "My Task Name" /RU SYSTEM /SC DAILY /ST 23:00 /TR "Powershell -NoProfile -ExecutionPolicy Bypass -Command \`"iex ((New-Object Net.WebClient).DownloadString(\\\`"https://url/to/script.ps1\\\`"))\`""
这基本上是另一层转义:引号需要用反引号转义。
我的头开始旋转,但我很高兴我驯服了这头野兽 :)
【讨论】:
【参考方案2】:PowerShell 使用不幸的反引号 (`) 作为转义字符。反斜杠没有特殊含义。 更好的是,鲜为人知的技巧,使用 --%。
schtasks.exe --% /F /Create /TN "My Task" /TR "powershell (New-Object System.Net.WebClient).DownloadString('http://mywebserver/myscript.ps1') | powershell.exe -noprofile" /SC MINUTE /mo 60 /RL HIGHEST
这基本上意味着,“亲爱的 PowerShell 解析器,在路径中找到 schtasks.exe,运行它并将 '--%' 之后的任何内容按原样传递。”
【讨论】:
嗨,不幸的是,这些方法都不起作用。 :( 就像添加任何其他字符一样添加反引号,并且 --% 方法只是错误:“错误:无效的参数/选项 -'--%'。 您没有在 PowerShell 中运行它,是吗?您在 cmd.exe 中运行它。那我的坏。我会回来的;) 是的,抱歉.. 通过批处理添加 schtask(用于 GPO)。感谢您的帮助。 为什么不在策略本身内使用新计划任务? technet.microsoft.com/en-us/library/cc725745.aspx 因为我们的域控制器仍然停留在 2003 模式。【参考方案3】:那么我建议这样做:
schtasks.exe /F /Create /TN "My Task" /SC MINUTE /mo 60 /RL HIGHEST /TR "powershell.exe -ExecutionPolicy Bypass -NoProfile -File \\UNC\to\Script.ps1"
并在 .ps1 中执行所有操作。
请注意,您将以“NT AUTHORITY\SYSTEM”的身份进入该 UNC 路径,因此需要适当的权限。
【讨论】:
【参考方案4】:以下内容可以满足您的需求。但它将作为单个命令而不是带有 args 的命令运行。
schtasks.exe /Create /TN "My Task" /TR ""\""powershell (New-Object System.Net.WebClient).DownloadString ('http://mywebserver/myscript.ps1\') "|" powershell.exe -noprofile -\"" /SC MINUTE /mo 60 /RL HIGHEST
【讨论】:
【参考方案5】:使用 schtasks.exe 的 /XML 开关是解决此问题的另一种方法;根据您的需要,您可能需要动态创建 xml 文件。我只是手动创建任务,将其导出,调整 xml 文件并将 schtasks 行从使用 /TR 更改为使用 /XML。
【讨论】:
【参考方案6】:在 XML 方法的基础上,如果您在最终任务参数中确实需要单引号,我的解决方法是创建不需要单引号的参数的任务,然后导出任务 XML (/query /xml /tn),删除任务 (/delete /tn /f),使用 args 更新 XML 文件并再次创建 (/create /xml)。绝对是环形交叉路口,但我可以让它工作的唯一方法
【讨论】:
以上是关于schtasks 命令中的单引号的主要内容,如果未能解决你的问题,请参考以下文章