Найбезпечніший спосіб запуску файлу BAT із сценарію Powershell


79

Я не можу отримати скрипт PowerShell для безпосереднього запуску файлу bat. Наприклад, це працює в командному рядку:

.\\my-app\my-fle.bat

Коли я додаю цю команду до сценарію, вона видає:

The term '.\\my-app\my-file.bat' is not recognized as the 
name of a cmdlet, function, script file, or operable program. 
Check the spelling of the name, or if a path was included, 
verify that the path is correct and try again.

Я також спробував наступне, з тим самим результатом:

& .\\my-app\my-fle.bat
& ".\\my-app\my-fle.bat"
\my-app\my-fle.bat
& \my-app\my-fle.bat
& "\my-app\my-fle.bat"

Примітка: Він повинен повернути код ластекситу, оскільки мені потрібно підтвердити успіх партії.


Дві зворотні скісні риски вказують на спільний доступ до сервера.
js2010,

Відповіді:


98
cmd.exe /c '\my-app\my-file.bat'

Як тут додати аргумент у файл bat? Зокрема, якщо аргумент є змінною? Я спробував це [Start-Process "cmd.exe" "/B /C test.bat $inputFilePath»], але там сказано:« Не вдається знайти позиційний параметр, який приймає аргумент 'test.bat'. »
Horizon

35

Щоб запустити .bat і мати доступ до останнього коду виходу, запустіть його як:

 & .\my-app\my-fle.bat

Це працює лише тоді, коли my-appзнаходиться у відносному шляху або я використовую букву диска. Я намагався уникнути прив'язки сценарію до конкретного диска.
cmcginty

1
@Casey Здається, я неправильно зрозумів. Тож my-appпапка знаходиться в корені будь-якого диска, з яким ви працюєте? Якщо так, це & \my-app\my-file.batпрацює для мене. Як ви називаєте сценарій .ps1?
Rynant

26

Спробуйте це, ваше джерело точок було трохи відключене. Редагуйте, додаючи біти ластексит-коду для OP.

$A = Start-Process -FilePath .\my-app\my-fle.bat -Wait -passthru;$a.ExitCode

додати -WindowStyle Hiddenдля невидимої партії.


Це спрацювало. Це також поверне статус виходу в LastExitCode?
cmcginty

щоб отримати доступ до $ lastexitcode із стартового процесу, вам потрібно буде додати команду до змінної та використовувати перемикач passthru, а потім прочитати код виходу зі змінної.
Knuckle-Dragger

2

Припускаючи, що my-app є підкаталогом поточного каталогу. $ LASTEXITCODE повинен бути там з останньої команди:

.\my-app\my-fle.bat

Якщо це було з файлового шару:

\\server\my-file.bat

0

Рішення @Rynant спрацювало для мене. Однак у мене було кілька додаткових вимог:

  1. Не ПРИПАВЛЮЙТЕ, якщо у файлі bat виявлено
  2. За бажанням, додайте вихідні дані файлу bat до журналу

Ось що я отримав (нарешті):

[Код скрипта PS]

& runner.bat bat_to_run.bat logfile.txt

[runner.bat]

@echo OFF

REM This script can be executed from within a powershell script so that the bat file
REM passed as %1 will not cause execution to halt if PAUSE is encountered.
REM If {logfile} is included, bat file output will be appended to logfile.
REM
REM Usage:
REM runner.bat [path of bat script to execute] {logfile}

if not [%2] == [] GOTO APPEND_OUTPUT
@echo | call %1
GOTO EXIT

:APPEND_OUTPUT
@echo | call %1  1> %2 2>&1

:EXIT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.