Как исправить цикл / f в пакетном файле для запуска нескольких скриптов PowerShell в каталоге - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь заставить следующую команду запустить несколько файлов сценариев powershell, расположенных в указанном каталоге:

@echo off
for /F %%f in ('dir /b "C:\ProgramData\MyScripts\"') do Powershell.exe -ExecutionPolicy Bypass -NoLogo -WindowStyle Hidden -File C:\ProgramData\Scripts\%%f
pause

Он отлично работает в командной строке, однако не работает в командном файле (хотя "%" был изменен на "%%"). Любые идеи, как я могу сделать эту работу?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Я предлагаю вам реструктурировать свой подход, чтобы избежать дублирования пути к каталогу сценариев - который может стать источником вашей проблемы:

Пусть PowerShell выполняет перечисление файлов :

@echo off
powershell -ExecutionPolicy Bypass -WindowStyle Hidden -Command ^
  "dir C:\ProgramData\MyScripts\*.ps1 | foreach { & $_ }"
pause

Обратите внимание, что переключение с -File на -Command было необходимо для подачи всей команды PowerShell; -NoLogo тогда не нужно.

Также рассмотрите возможность добавления -NoProfile для подавления загрузки файла вашего профиля.

Что касается команды PowerShell:

  • dir используется для краткости, но обратите внимание, что это псевдоним , а именно для команды Get-ChildItem.
  • foreach - псевдоним для командлета ForEach-Object, который запускает связанный блок сценария ({ ... }) для каждого входного объекта (файла), отраженный в автоматической переменной $_.
  • & - оператор вызова, необходимый для вызова команды (имя или путь), хранящейся в переменной.

Если вы предпочитаете придерживаться своего первоначального подхода и хотите это исправить, см. Полезный ответ Compo .

1 голос
/ 27 марта 2019

Ниже приведен метод, который я бы посоветовал вам попробовать:

@If Exist "C:\ProgramData\MyScripts\*.ps1" For %%A In (
    "C:\ProgramData\MyScripts\*.ps1"
)Do @Powershell -NoP -NoL -Ex Bypass -W Hidden -F "C:\ProgramData\MyScripts\%%A"

Я отфильтровал, чтобы обеспечить синтаксический анализ только .ps1 файлов, , чтобы исключить запуск любых сценариев не PowerShell .Я также изменил расположение файлов для запуска, поскольку оказалось, что вы анализируете файлы в одном каталоге, C:\ProgramData\MyScripts, но пытаетесь запустить их в другом, C:\ProgramData\Scripts.

. Обратите внимание, что этоне будет запускать все файлы в каталоге, те, которые, например, скрыты, не будут проанализированы.Для этого вам лучше использовать цикл For /F и выбирать файлы с помощью команды Dir:

@For /F Delims^=^ EOL^= %%A In ('
    Dir /B/A-D-L "C:\ProgramData\MyScripts\*.ps1" 2^>Nul
')Do @Powershell -NoP -NoL -Ex Bypass -W Hidden -F "C:\ProgramData\MyScripts\%%A"

Пожалуйста, примите во внимание, что каждый скрипт будет запускаться послепредыдущий закончился, если вы хотите запустить каждый сразу после начала предыдущего, я бы предложил вам открыть окно командной строки и взглянуть на справочную информацию, выводимую из Start /?, для способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...