Cách an toàn nhất để chạy tệp BAT từ tập lệnh Powershell


79

Tôi không thể tải tập lệnh powershell để thực thi trực tiếp tệp bat. Ví dụ, điều này hoạt động trên dòng lệnh:

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

Khi tôi thêm lệnh này vào một tập lệnh, nó sẽ xuất ra:

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.

Tôi cũng đã thử những cách sau, với kết quả tương tự:

& .\\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"

Lưu ý: Nó phải trả về lastexitcode vì tôi cần xác minh sự thành công của hàng loạt.


Hai dấu gạch chéo ngược biểu thị chia sẻ máy chủ.
js2010

Câu trả lời:


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

Làm cách nào để thêm đối số vào tệp bat ở đây? Cụ thể nếu đối số là một biến? Tôi đã thử [Start-Process "cmd.exe" "/B /C test.bat $inputFilePath"] này, nhưng nó cho biết:" Không thể tìm thấy tham số vị trí chấp nhận đối số 'test.bat'. "
Horizon

35

Để chạy .bat và có quyền truy cập vào mã thoát cuối cùng, hãy chạy nó dưới dạng:

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

Điều đó chỉ hoạt động khi my-appở trong đường dẫn tương đối hoặc tôi sử dụng ký tự ổ đĩa. Tôi đã cố gắng tránh ràng buộc tập lệnh vào một ổ đĩa cụ thể.
cmcginty 19/1213

1
@Casey Tôi đoán tôi đã hiểu lầm. Vì vậy, my-appmột thư mục nằm ở gốc của bất kỳ ổ đĩa nào bạn đang làm việc? Nếu vậy, & \my-app\my-file.batlàm việc cho tôi. Bạn đang gọi tập lệnh .ps1 như thế nào?
Rynant

26

Hãy thử điều này, nguồn chấm của bạn đã bị lỗi một chút. Chỉnh sửa, thêm bit lastexitcode cho OP.

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

thêm -WindowStyle Hiddencho lô vô hình.


Điều đó đã hiệu quả. Điều này cũng sẽ trả lại trạng thái thoát trong LastExitCode?
cmcginty 17/12/13

để truy cập $ lastexitcode từ start-process, bạn sẽ cần gán lệnh cho một biến và sử dụng công tắc passthru, sau đó đọc exitcode từ biến.
Knuckle-Dragger

2

Giả sử ứng dụng của tôi là một thư mục con trong thư mục hiện tại. $ LASTEXITCODE sẽ ở đó từ lệnh cuối cùng:

.\my-app\my-fle.bat

Nếu đó là từ chia sẻ tệp:

\\server\my-file.bat

0

Giải pháp của @Rynant đã làm việc cho tôi. Tuy nhiên, tôi có một số yêu cầu bổ sung:

  1. Đừng dừng lại nếu gặp trong tệp dơi
  2. Theo tùy chọn, nối đầu ra tệp dơi vào tệp nhật ký

Đây là những gì tôi đã làm việc (cuối cùng):

[Mã tập lệnh 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.