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, чтобы делать то, что я обычно делал бы с командной строкой.
На самом деле вы можете просто использовать ту же команду. Или вы искали чего-то более идиоматичного? Я думаю, что проще запускать исполняемые файлы, используя синтаксис CMD, если вы не видите каких-то странных ошибок (ПОЦЕЛУЙ.). Даже перенаправление работает:
Get-Content install-list.txt | Where-Object {$_ -like "*.msu} | Foreach-Object {
wusa $_ /quiet /norestart >> "c:\script\installupdates.log" | Wait-Process
}
Когда я попробовал это против поддельных обновлений, файл журнала был пуст. Думаю, дело в тихом варианте. В командной строке тоже вроде тихо!
В PowerShell вы называете это так же, как в CMD. Не нужно использовать Start-Process
.
Ответ Джонса решил проблему.
Окончательный код
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