Энди дал мне несколько хороших советов, но я хотел сделать это еще чище.Не говоря уже о том, что с помощью метода 2>&1 >>
PowerShell жаловался мне на доступ к файлу журнала другим процессом, т. Е. И stderr, и stdout, пытающимися заблокировать файл для доступа, я полагаю.Итак, вот как я с этим справился.
Сначала давайте сгенерируем красивое имя файла, но это на самом деле просто для педантизма:
$name = "sync_common"
$currdate = get-date -f yyyy-MM-dd
$logfile = "c:\scripts\$name\log\$name-$currdate.txt"
И вот тут начинается трюк:
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
С помощью start-transcript
и stop-transcript
вы можете перенаправить ВСЕ выходные команды PowerShell в один файл, но не работает правильно с внешними командами .Так что давайте просто перенаправим все выходные данные на стандартный вывод PS и позволим транскрипту делать все остальное.
На самом деле, я понятия не имею, почему инженеры MS говорят, что они еще не исправили это "из-завысокая стоимость и технические сложности, связанные с «когда это можно обойти таким простым способом.
В любом случае, выполнение каждой отдельной команды с start-process
- это громоздкий ИМХО, но с этим методом все, что вам нужноdo добавляет код 2>&1 | Write-Output
к каждой строке, в которой выполняются внешние команды.