Start-Transcript c:\scripts\InstallUpdates.log -Append # -NoClobber
$SourceMSUFiles = (get-content install-list.txt | where {$_ -like "*.msu"})
#Install MSU files
foreach($file in $SourceMSUFiles)
{
$Argument= "$Files",' /quiet',' /norestart'
& start wusa -ArgumentList @Argument -Wait # -RedirectStandardOutput "c:\scripts\InstallUpdates.log"
Write-Host "Installing $file" `n
}
stop-transcript
В нормальной cmd строке это работало бы как это:
wusa $files /quiet /norestart
Я хочу использовать Powershell, чтобы сделать то, что я обычно делал бы с командной строкой.
В PowerShell вы называете это так же, как в CMD. Нет необходимости использовать Start-Process
.
Фактически вы можете просто использовать ту же команду. Или вы искали чего-то более идиоматичного? Я думаю, что проще запускать исполняемые файлы, используя синтаксис CMD, если вы не видите каких-то странных ошибок ( K.I.S.S. ). Даже перенаправление работает:
Get-Content install-list.txt | Where-Object {$_ -like "*.msu} | Foreach-Object {
wusa $_ /quiet /norestart >> "c:\script\installupdates.log" | Wait-Process
}
Когда я пробовал это против поддельных обновлений, файл журнала был пуст. Думаю, дело в тихом варианте. В командной строке тоже вроде тихо!
Ответ Джонса решил проблему.
Final Code
Get-Content install-list.txt | Where-Object {$_ -like "*.msu"} | Foreach-Object {
wusa $_ /quiet /norestart >> "c:\script\installupdates.log" | Wait-Process
}
Write-Host "Installed patches on"
((get-date -DisplayHint Date))
get-hotfix|where {$_.InstalledOn -gt ((get-Date).AddDays(-1))}|Select HotfixId