Как вызвать пакетный файл из Powershell, используя для его запуска пользовательский файл .cmd?

#powershell

Вопрос:

Мне нужно запустить следующий пакетный файл:

 cd ..
msbuild reve_host.vcxproj
 

Для того, чтобы msbuild работал, его необходимо запустить через определенную оболочку. Его путь хранится в $executorPath в моем сценарии Powershell, который выглядит следующим образом:

 $executorPath = 'C:ProgramDataMicrosoftWindowsStart MenuProgramsVisual Studio 2019Visual Studio ToolsVCx64 Native Tools Command Prompt for VS 2019'
Write-Host "STAGE: CLEAN."
 

Вот несколько способов выполнения, которые я пробовал, но которые не сработали:

  1. Invoke-Command '$executorPath "BUILD.bat"'
  2. Invoke-Command '$executorPath ".BUILD.bat"'
  3. Invoke-Command -ScriptBlock {amp; $executorPath 'BUILD.bat'}
  4. Invoke-Command -ScriptBlock {amp; $executorPath '.BUILD.bat'}
  5. $($executorPath 'BUILD.bat')
  6. $($executorPath '.BUILD.bat')

С 1 и 2 я получаю:

Набор параметров не может быть разрешен с использованием указанных именованных параметров. Один или несколько выданных параметров не могут использоваться вместе или было предоставлено недостаточное количество параметров.

С 3 и 4 я получаю:

Термин ‘C:ProgramDataMicrosoftWindowsStart МенюПрограммыVisual Studio 2019Инструменты Visual StudioVCx64 Собственные средства Командная строка для VS 2019″ не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или, если был указан путь, убедитесь, что он правильный, и повторите попытку.

Ничего из этого не работает. Как мне это запустить?

Комментарии:

1. Прежде всего — вы должны объединить путь и имя файла с обратной косой чертой, чтобы сделать его полным путем. И второе — a *.bat не является исполняемым файлом — CMD.exe есть. И bat должен быть указан в качестве второго аргумента после /c , если вы хотите его запустить. В противном случае вам нужно было бы использовать Invoke-Expression 😉

2. Попробуйте . (Join-Path -Path $executorPath -ChildPath BUILD.bat) или (другой подход) amp; "$(Join-Path -Path $executorPath -ChildPath BUILD.bat)" или что-то подобное.

3. @Olaf Я не уверен, что понимаю, что вы подразумеваете под объединением пути и имени файла. Как вы думаете, вы могли бы дать полный ответ, более подробно объясняющий ваше решение? Я совсем новичок в этом 🙂

4. Попробуйте рекомендацию Джозефа! 😉

5. Я имею в виду, что это "C:randomPathwithSubfolder" "fileName.bat" не одно и то же "C:randomPathwithSubfolderfileName.bat" . Только второй-действительный полный путь.; -)

Ответ №1:

Я нашел альтернативное решение. Использование этого модуля позволяет вызывать MSBuild непосредственно из Powershell и избавляет от необходимости вручную вызывать правильную оболочку. Это обходит проблему, вместо того, чтобы решать ее.

Комментарии:

1. ОМГ 😉 … правда? 😉

Ответ №2:

Или Просто:

 #Test cmd file:
@Echo off
for %%i in (1,2,3,4,5,6,7,8,9,10) DO Echo. Hello there
exit /B 200
 
 PS> amp; G:BEKDocsBatchbatch1.cmd
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there

#To Use your example code:

PS> $ExecutionPath = "G:BEKDocsBatchbatch1.cmd"

PS> amp; $ExecutionPath
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there
 Hello there

PS> 
 

РЕДАКТИРОВАТЬ: Это также работает, если расширение .bat!