Я использую Powershell для скрипта удаления принтеров и их драйверов. Я вызываю , Printing_admin_scripts
которые находятся в папке System32 в Windows 7+. Эти скрипты генерируют МНОГО выходных данных, и я хотел бы захватить выходные данные (выбросить большую их часть) и сгенерировать собственные выходные данные в зависимости от статуса.
Почему вы не можете использовать
$LASTEXITCODE
?
Потому что эти скрипты не генерируют никаких кодов выхода! Они всегда представляют 0.
Моя цель — найти "0x80041002"
в выводе команды. Если да, то сделайте это... Если нет, то сделайте то. Ниже приведено то, что я пытался сделать, но не получилось:
.\prnmngr.vbs -d -p "$_" | findstr "0x80041002" | out-null
If ($LASTEXITCODE = 0) {
Write-Host "$_ does not exist"
} else {
Write-Host "$_ removed"
}
Я также попробовал:
& .\prnmngr.vbs -d -p "$_".ToString() | findstr "0x80041002" | out-null
If ($LASTEXITCODE = 0) {
Write-Host "$_ does not exist"
} else {
Write-Host "$_ removed"
}
Это скрывает вывод, но всегда выводит сообщение о том, что принтер был удален, даже если он не существовал (что обычно выводит "0x80041002"). Моя цель — найти эту строку, даже если она не записана на хост (надеюсь), затем написать свой собственный текст на месте и продолжить.
решение1
Просто изменитеPowerShellлогика для использования -eq
, а не =
внутриеслиусловие. Это поможет гарантировать, что ваши условные команды будут выполняться так, как ожидается, на основе $LASTEXITCODE
.
Синтаксис команды If
If ($LASTEXITCODE -eq 0) {
Write-Host "$_ does not exist"
} else {
Write-Host "$_ removed"
}
Дополнительные ресурсы
решение2
Мне помогает сохранение результата в массиве:
$script = "C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs"
$result = cscript $script -g
if($result -match 'foo') {
write-host "match"
}
else {
write-host "no match"
}