Как отправить несколько операторов в один и тот же экземпляр .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.cmd .\zipper.ps1

    .\ гарантирует, что powershell будет искать сценарии в активном каталоге.

или,

  1. .\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'

или,

  1. .\ps4 'GC .\zipper.ps1 | iex'

    Да, как и # 2 выше. Мы передаем script внешнему script и обходим ограничение безопасности в одном простом заявлении. Для его терпения это был бы мой предпочтительный ответ, но моя забота о методе GC заключается в том, действительно ли мы выполняем отдельные заявления? Или просто одна большая струна? Если это только одна большая строка, то это не удовлетворяет OP.

Обратите внимание: plz не помещает этот ответ в качестве "уязвимости безопасности" -

Microsoft никогда не предполагала [политику выполнения] быть элементом управления безопасностью. Вот почему есть так много вариантов обхода этого. Microsoft была достаточно хороша, чтобы предоставить некоторые собственные опции https://diigo.com/08xzeu