Почему мой скрипт Powershell проверяет, запущен ли процесс, и выдает ошибку, если он не может найти процесс? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть следующий скрипт ps1:

 $process_check = Get-Service "Process" | findstr -i "Process" 
echo $process_check

При выполнении он находит мой процесс с именем «process» и выдает на выходе

*output*
Running  Process        Process_displayName

Я хочу убедиться, что мой скриптдает мне ожидаемый результат, если «Процесс» не работает. Чтобы проверить это, я создал новую переменную, на этот раз проверяя процесс "QWERTY", поэтому мой полный сценарий:

$process_check = Get-Service "Process" | findstr -i "Process" 
$qwerty_check = Get-Service "QWERTY" | findstr -i "QWERTY" 
echo $process_check
echo $qwerty_check

Это выводит следующее:

*output*
Running  Process        Process_displayName

Get-Service : Cannot find any service with service name 'qwerty'.
At C:\Users\proc_checks.ps1:5 char:14
+ $qwerty_check = Get-Service "qwerty" | findstr -i "qwerty"
+              ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (qwerty:String) [Get-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand 

Есть ли способ, которым яможет быть сценарий не ошибкой, если он не может найти процесс по моему заданному имени процесса (в данном случае «Process» и «qwerty»)

Возможно, мне нужна проверка if для проверки нуля, прежде чем я назначу свои переменные

Ответы [ 3 ]

1 голос
/ 18 октября 2019

У Scepticalist есть то, что я бы использовал - ваш ответ, кажется, показывает, что вы не знакомы с блоком try / catch. Вы можете выполнить поиск по «try catch block» или «обработка исключений», чтобы узнать больше.

Проще говоря, код Scepticalist пытается выполнить проверку процесса. Если все идет хорошо, код внутри catch никогда не выполняется. Однако, если есть ошибка, код внутри catch «перехватывает» эту ошибку и пытается что-то с ней сделать. Существует также необязательное «Наконец-то», которое всегда будет выполняться независимо от ошибок.

Итак, если вы хотите, чтобы эти данные были в переменной, присвойте их этой переменной в блоке перехвата.

# Name of the process to check for
$ProcessRequest = 'OUTLOOK'

# Check for process by name
Try {
    $Process_Check = Get-Process -Name $ProcessRequest -ErrorAction Stop
    Write-Host "This line of code will not execute if the process check fails- execution immediately jumps to the catch"
}
Catch {
    #This code only executes if the code in try encounters an error
    $Process_Check = "Process not found for $ProcessRequest`nError: $_"
    Write-Host $Process_Check
}
Finally
{
    Write-Host "This code always runs, regardless of errors"
}

# The result of the query is now held in the $Process_Check object
# Output the object - you can pick any fields you need rather than *

$Process_Check | Select *

1 голос
/ 18 октября 2019

Get-Process ошибки по проекту, если он ничего не находит. Чтобы изменить это поведение, вы можете использовать параметр -ErrorAction SilentlyContinue.

$process_check = Get-Service "Process" -ErrorAction SilentlyContinue | findstr -i "Process" 
echo $process_check

Обратите внимание, что -ErrorAction является общим параметром и будет работать с любым командлетом.

0 голосов
/ 18 октября 2019

Как подсказывает Ансгар, иди и узнай, как использовать Powershell, потому что смешивание его с командной строкой / партией никогда не сделает твой сценарий надежным или эффективным.

# Name of the process to check for
$ProcessRequest = 'OUTLOOK'

# Check for process by name
Try {
    $Process_Check = Get-Process -Name $ProcessRequest -ErrorAction Stop
}
Catch {
    Write-Host "Process not found for $ProcessRequest`nError: $_"
}

# The result of the query is now held in the $Process_Check object
# Output the object - you can pick any fields you need rather than *

$Process_Check | Select *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...