Как отправить несколько операторов в один и тот же экземпляр .cmd?
Как я могу отправить несколько команд в один и тот же экземпляр .cmd script? Это делается с помощью cmd или powershell.
Я не пытаюсь отправить несколько команд в один конкатенированный оператор. Символьные лимиты могут быть фактором с очень большими сценариями. Скорее, я хочу отправить несколько команд, как отдельных операторов, в запущенный .cmd script. Когда я говорю ".cmd", я не имею в виду "cmd.exe" - я имею в виду пользовательскую оболочку script, сохраненную на диске с расширением .cmd
.
В частности, этот пост показывает, как создать файл powershell4.cmd script, который запускает .Net 4.0 PowerShell. Я хочу отправить последовательность команд в эту оболочку.
Например, можно ли получить дескриптор этой новой оболочки, чтобы отправить ему дополнительные команды?
Ответы
Ответ 1
Другой подход может заключаться в том, чтобы поместить сохранение команд, которые вы хотите отправить в файле (например, test.in
), а затем использовать следующую команду:
Start-Process -RedirectStandardInput test.in cmd
Рассмотрим добавление -Wait
и -NoNewWindow
. Вам нужно будет поэкспериментировать, чтобы увидеть, как это взаимодействует с пакетом script.
Я не считаю, что PowerShell изначально поддерживает перенаправление на канал, но это может быть выполнимо, вызвав среду выполнения .NET.
Ответ 2
Вот простой способ отправки нескольких команд в один экземпляр cmd.exe:
cmd /c "echo before & pwd & echo after"
Хотя возможно создание процесса, выполняющего cmd с перенаправленным стандартным входом, может быть значительно сложнее.
P.S. Если в качестве разделителя команд используются двойные амперсанды, более поздняя команда будет выполняться только в том случае, если предыдущая команда вернет код выхода успеха.
Ответ 3
Здесь ответ, в командной строке Windows:
powershell .\ps4.cmd 'PowerShell.exe -ExecutionPolicy Bypass -File .\zipper.ps1'
Объяснение:
Мое решение основано на размещении script в файле script и выполнении. В приведенном ниже коде ps4.cmd
есть PowerShell script, упомянутый в OP. Команды, приведенные ниже, выполняются в командной строке командной строки:
или,
-
.\ps4 'Get-Content .\zipper.ps1 | Invoke-Expression'
эквивалентно:
.\ps4 'GC .\zipper.ps1 | iex'
Политика выполнения
По умолчанию Windows ExecutionPolicy "ограничена", что предотвратит запуск любых скриптов. Для изменения всей системы ExecutionPolicy требуется доступ администратора. Я включаю обходные пути для этого, поскольку в моем случае использования это критический блокиратор, даже если вы измените политику безопасности для powershell, которая может не применяться к среде ps4.cmd.
Вот несколько способов обойти ограничение безопасности без доступа администратора:
-
PowerShell.exe -ExecutionPolicy Bypass -File .\zipper.ps1
Итак, как мы можем передать script в ps4.cmd и обходить безопасность?
.\ps4.cmd 'PowerShell.exe -ExecutionPolicy Bypass -File .\zipper.ps1'
-
одиночные кавычки не требуются, если в ваших script именах или путях нет пробелов.
-
Для запуска из командной строки Windows (желаю, чтобы я смог сделать этот терьер, но это ответ):
powershell .\ps4.cmd 'PowerShell.exe -ExecutionPolicy Bypass -File .\zipper.ps1'
или,
-
.\ps4 'GC .\zipper.ps1 | iex'
Да, как и # 2 выше. Мы передаем script внешнему script и обходим ограничение безопасности в одном простом заявлении. Для его терпения это был бы мой предпочтительный ответ, но моя забота о методе GC заключается в том, действительно ли мы выполняем отдельные заявления? Или просто одна большая струна? Если это только одна большая строка, то это не удовлетворяет OP.
Обратите внимание: plz не помещает этот ответ в качестве "уязвимости безопасности" -
Microsoft никогда не предполагала [политику выполнения] быть элементом управления безопасностью. Вот почему есть так много вариантов обхода этого. Microsoft была достаточно хороша, чтобы предоставить некоторые собственные опции https://diigo.com/08xzeu