Tôi nghĩ rằng nếu bạn chạy một lệnh theo cách đó trên máy chủ khác thì không có cách nào bạn có thể nhận được ở mã trả về của tập lệnh tại đó. Điều này là do Invoke-Command
chỉ cần chạy một lệnh trên máy từ xa, có thể trong một phiên tạm thời và bạn không thể kết nối lại với phiên đó.
Điều bạn có thể làm, tuy nhiên, là tạo phiên trên máy tính từ xa và gọi tập lệnh của bạn trong phiên đó. Sau đó bạn chỉ có thể kiểm tra giá trị trả về trong phiên đó một lần nữa. Vì vậy, một cái gì đó dọc theo dòng:
$s = New-PSSession -ComputerName <server_name>
Invoke-Command -Session $s -ScriptBlock { ... }
Invoke-Command -Session $s -ScriptBlock { $? }
có thể hoạt động. Bằng cách này, bạn có thể truy cập vào cùng một trạng thái và các biến như Invoke-Command
đầu tiên trên máy từ xa.
Ngoài ra Invoke-Command
rất khó vượt qua giá trị trả về của lệnh từ xa. Làm thế nào bạn sẽ tìm ra sau đó rằng Invoke-Command
chính nó không thành công?
ETA: Ok, tôi đã hiểu sai bạn về "mã trả lại". Tôi đã giả sử bạn có nghĩa là $?
. Dù sao, theo các tài liệu bạn có thể chạy một kịch bản trên một máy tính từ xa như sau:
Để chạy một kịch bản cục bộ trên máy tính từ xa, sử dụng FilePath
tham số của Invoke-Command
.
Ví dụ, lệnh sau chạy Sample.ps1
kịch bản trên các máy tính S1
và S2
:
invoke-command -computername S1, S2 -filepath C:\Test\Sample.ps1
Kết quả của kịch bản được trả lại cho máy tính cục bộ. Bạn không cần sao chép bất kỳ tệp nào.
điều lạ trong lệnh Gọi khi chạy trong ngữ cảnh Jenkins, mã trả về như $ returnCode = Invoke-command -file somescript.ps1 này sẽ trả về mọi từ somescript.ps1. nếu chạy trong một cửa sổ lệnh, giá trị trả lại được trả về đúng. bất cứ ai có bất kỳ ý tưởng? – koo9
@ koo9: '$ returnCode' sẽ nhận được _pipeline output_ của tệp tập lệnh. Không phải là mã thoát. – Joey
được cho là nhưng khi chạy tập lệnh trong công việc Jenkins, bằng cách nào đó $ returncode bắt tất cả đầu ra từ tập lệnh ps1 – koo9