Andy đã cho tôi một số gợi ý tốt, nhưng tôi muốn làm điều đó một cách rõ ràng hơn. Chưa kể rằng với phương pháp 2>&1 >>
, PowerShell đã phàn nàn với tôi về tệp nhật ký đang được truy cập bởi một quy trình khác, tức là cả stderr và stdout đang cố khóa tệp để truy cập, tôi đoán vậy. Vì vậy, đây là cách tôi làm việc xung quanh.
Đầu tiên chúng ta hãy tạo ra một tên tập tin tốt đẹp, nhưng đó là thực sự chỉ vì đã pedantic:
$name = "sync_common"
$currdate = get-date -f yyyy-MM-dd
$logfile = "c:\scripts\$name\log\$name-$currdate.txt"
Và đây là nơi lừa bắt đầu:
start-transcript -append -path $logfile
write-output "starting sync"
robocopy /mir /copyall S:\common \\10.0.0.2\common 2>&1 | Write-Output
some_other.exe /exeparams 2>&1 | Write-Output
...
write-output "ending sync"
stop-transcript
Với start-transcript
và stop-transcript
bạn có thể chuyển hướng tất cả sản lượng của Lệnh PowerShell vào một tệp, nhưng it doesn't work correctly with external commands. Vì vậy, chúng ta hãy chuyển hướng tất cả các đầu ra của những người đến stdout của PS và để cho bảng điểm làm phần còn lại. Trong thực tế, tôi không biết tại sao các kỹ sư MS nói rằng họ chưa sửa lỗi này "do chi phí cao và phức tạp kỹ thuật liên quan" khi nó có thể được làm việc xung quanh một cách đơn giản như vậy. "Cả hai cách, chạy mọi lệnh đơn lẻ với start-process
là một IMHO lộn xộn rất lớn, nhưng với phương pháp này, tất cả những gì bạn phải làm là nối thêm mã 2>&1 | Write-Output
vào mỗi dòng chạy các lệnh bên ngoài.
Great câu trả lời. Nhưng có vẻ như với tôi rằng có một lỗi trong cách đầu tiên. Thay vì -errirectoutput tôi nghĩ rằng nó phải là -RedirectStandardError. – Grigory
Bắt tốt! Đã sửa lỗi :-) –
Nó có hoạt động cho Powershell Remoting không? Tôi đã thử nghiệm, tôi nghĩ rằng chỉ có cách thứ hai hoạt động cho PS Remoting. – Kiquenet