Одиночные кавычки в команде schtasks

Я пытаюсь использовать SCHTASKS для создания запланированного задания в Windows. Параметры включают одинарные кавычки. Если я создаю свою задачу вручную, она работает. В графическом интерфейсе планировщика задач Windows "Сведения" (на вкладке действия) отображаются следующим образом:

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

Затем это появляется в графическом интерфейсе (обратите внимание на интерпретацию одинарной кавычки двойной кавычке на первом, но не на втором экземпляре:

powershell (New-Object System.Net.WebClient).DownloadString ("http://mywebserver/myscript.ps1\') | powershell.exe -noprofile -

Я пытался избежать его и т. Д. (Который отлично работает для двойных кавычек, но не для одинарных), но не могу понять это..?!

Заранее большое спасибо за любые предложения.

6 ответов

Я наткнулся на ту же проблему в последнее время.

Мне нужно было добавить действие в задачу с помощью этой команды:

 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\\\`"))\`""

Это, по сути, еще один уровень выхода из кавычек: кавычки необходимо экранировать обратным трюком.

Моя голова начинает кружиться, но я рад, что приручил зверя:)

PowerShell использует неудачный обратный удар (`) в качестве escape-символа. Обратная косая черта не имеет особого значения. Еще лучше, малоизвестный трюк, используйте -%.

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, запустите его и передайте все, что следует после" -% ", ТОЧНО как есть".

Основываясь на подходе XML, если вам действительно нужны одинарные кавычки в последнем аргументе задачи, моим обходным решением было создать задачу без аргументов, требующих одинарных кавычек, затем экспортировать задачу XML (/query /xml /tn), удалить задачу ( / delete / tn /f), обновите XML-файл с помощью аргументов и создайте снова (/ create / xml). Определенно окольный путь, но единственный способ заставить его работать

Использование /XML-ключа schtasks.exe - еще один способ обойти эту проблему; в зависимости от ваших потребностей, вам может понадобиться создать XML-файл на лету. Я просто создал задачу вручную, экспортировал ее, адаптировал xml-файл и изменил строку schtasks с /TR на /XML.

Следующее может дать вам то, что вам нужно. Но он будет запускаться как одна команда, а не как команда с аргументами.

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

Тогда я бы предложил сделать это вместо:

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-путь, необходимы соответствующие разрешения.

Другие вопросы по тегам