2013-08-23 40 views
21

Tôi cần chạy tập lệnh với PowerShell -Command "& tên mã" và tôi thực sự thích mã nếu mã thoát mà tôi nhận được từ PowerShell giống như mã thoát đã tự quay trở lại. Thật không may, PowerShell trả về 0 nếu kịch bản trả về 0 và 1 nếu kịch bản trả bất kỳ khác không có giá trị như minh họa dưới đây:-Mã thoát của mã lệnh không giống như mã thoát của mã lệnh

PS C:\test> cat foo.ps1 
exit 42 
PS C:\test> ./foo.ps1 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "exit 42" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> powershell -Command "& ./foo.ps1" 
PS C:\test> echo $lastexitcode 
1 
PS C:\test> 

Sử dụng [Môi trường] :: Exit (42) gần như hoạt động:

PS C:\test> cat .\baz.ps1 
[Environment]::Exit(42) 
PS C:\test> powershell -Command "& ./baz.ps1" 
PS C:\test> echo $lastexitcode 
42 
PS C:\test> 

Ngoại trừ khi tập lệnh được chạy tương tác, nó sẽ thoát khỏi toàn bộ hệ vỏ. Bất kỳ đề xuất?

+1

Tôi nghĩ bạn muốn thoát bằng 'exit $ lastexitcode' trong tập lệnh' -command' – ProfessionalAmateur

Trả lời

26

Nếu bạn nhìn vào phần bạn đang gửi tới -Command dưới dạng tập lệnh, bạn sẽ thấy nó sẽ không bao giờ hoạt động. Tập lệnh chạy tập lệnh 'foo.ps1' không có lệnh gọi để thoát, vì vậy tập lệnh không trả về mã thoát.

Nếu bạn trả lại mã thoát, nó sẽ làm những gì bạn muốn. Cũng thay đổi nó từ "đến', nếu không $ lastexitcode sẽ được giải quyết trước khi bạn 'gửi' chuỗi với PowerShell thứ hai nếu bạn chạy nó từ PowerShell

PS C:\test> powershell -Command './foo.ps1; exit $LASTEXITCODE' 
PS C:\test> echo $lastexitcode 
42 

PS:. Ngoài ra kiểm tra các tham số -File nếu bạn chỉ muốn chạy một kịch bản. Nhưng cũng biết nó không trả lại 1 nếu bạn có một lỗi chấm dứt như -Command nào. Xem here để biết thêm về chủ đề đó trước.

PS C:\test> powershell -File './foo.ps1' 
PS C:\test> echo $lastexitcode 
42 
+0

Cảm ơn sự giúp đỡ của bạn! Điều này gần như giải quyết được vấn đề của tôi. Giải pháp này hoạt động trên dòng lệnh, đó là cách ban đầu vấn đề được đặt ra, vì vậy tôi sẽ chấp nhận câu trả lời. Thật không may, tôi thực sự bắn ra một quá trình powershell từ một quá trình java bằng cách sử dụng Runtime.exec, và không có vấn đề làm thế nào tôi trích dẫn nó, tôi nhận được một mã thoát của số không. Tôi cũng đã cố gắng thoát $ trên $ lastexitcode với một backtick ('), và điều đó không hoạt động hoặc. – ediven

+0

Cảm ơn. Bạn đã thử sử dụng -File thay vì -Command như trong ví dụ thứ hai của tôi? –

+0

Sử dụng -File Sẽ không hoạt động nếu không có một số phẫu thuật khác vì chúng tôi sử dụng cùng một mã để khởi động các quy trình không có quyền hạn. Có vẻ như trích dẫn đang bị xáo trộn bởi mã Java cố tự động trích dẫn mọi thứ khi cần. Tôi nghĩ rằng nó sẽ làm việc một khi tôi sắp xếp ra. Cảm ơn một lần nữa! – ediven

1

How are you gọi kịch bản của bạn tương tác?

Tôi đã thử cách này và có vẻ như hoạt động OK, nhưng tôi gọi nó từ DOS, không nằm trong PowerShell

C:\Temp>type foo.ps1 
exit 42 


C:\Temp>powershell -noprofile -nologo -noninteractive -executionpolicy Bypass -file .\foo.ps1 

C:\Temp>echo %errorlevel% 
42 

c:\Temp> 
+0

Nó hoạt động vì bạn sử dụng -Gửi thay vì -Command như trong câu hỏi –

4

caveat: Nếu kịch bản PowerShell bạn trả exitcodes cao hơn 65535, họ cuộn qua:

$exitCode = 65536 
Exit $exitCode 

Nếu CMD sau gọi PS1 này kịch bản trên, bạn sẽ nhận được một% errorlevel% của

Powershell.exe "& 'MyPowershellScript.ps1' "; exit $LASTEXITCODE 
SET ERR=%ERRORLEVEL% 

và exit code của 65.537 sẽ cung cấp cho bạn một% errorlevel% trong tổng số 1, v.v.

Trong khi đó, nếu CMD gọi một mã khác và tập lệnh con trả lại lỗi lỗi cao hơn 65535, mã sẽ chuyển thành tốt.

Cmd /c exit 86666 

CMD sẽ trả về% errorlevel% của 86666 như mong đợi.

XỬ LÝ tất cả những điều này: Hiện tại điều này đang diễn ra và không có lý do rõ ràng.