Определение, запущен ли процесс
Все,
Я новичок в сценариях Power Shell, и мой второй сценарий не работает на 100%. Я не уверен, что происходит.
Цель:
- Проверьте, запущен ли определенный процесс или нет.
- Если он работает, отправьте электронное письмо с советами.
- Если он не запущен, попробуйте запустить процесс.
- Если вы пытаетесь запустить процесс, перепроверьте, чтобы увидеть, запущен процесс или нет.
Выпуск:
- Если я изменю местоположение каталога скрипта (чтобы убедиться, что он неверный), я получу правильное письмо.
- Если процесс запущен, я получаю правильное письмо.
- Если процесс не запущен, сценарий запускает процесс правильно, но отправляет и отправляет электронное сообщение о том, что процесс не запущен, хотя на самом деле он запущен.
Автор сценария:
# Date and Date/Time stamping for files and logs.
$FileDateTimeStamp = get-date -uformat "%m%d%Y-%H%M%S"
$FileDateStamp = get-date -uformat "%m%d%Y"
# Logs directory.
$LogsDirectory = "C:\logs\"
# AS2 file information.
$AS2 = "C:\Program Files\nsoftware\AS2 Connector V2\as2app\bin\nsoftware.AS2Connector.exe"
$AS2ParentDirectory = "C:\Program Files\nsoftware\AS2 Connector V2"
$ProcessNameToCheck = "nsoftware.AS2Connector"
$ProcessIsRunning = Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue
$StartTheProcess = start-process -filepath $AS2
$SleepTime = 2
# Exchange information for sending emails.
$EmailServer = "email.me.com"
$EmailFrom = "me@me.com"
$AuthUser = "username"
$AuthPass = "password"
$EmailPort = 25
$MaxRetries = 1
# Blat log file location/name.
$BlatLogFile = $LogsDirectory + "BlatLog-" + $FileDateStamp + ".log"
# Blat information.
#$EmailTo = "smaguire@varietydistributors.com,abarnes@varietydistributors.com,tmalcom@varietydistributors.com"
$EmailTo = "smaguire@varietydistributors.com"
$EmailToSubjectSuccess = "AS2 Connector is running."
$EmailToBodySuccess = "The process check for AS2 Connector on OSPC was successful. AS2 Connector is running."
$EmailToSubjectFail = "AS2 Connector is NOT running."
$EmailToBodyFail = "The process check for AS2 Connector on OSPC was unsuccessful. Attempted to start the application which was also unsuccessful. AS2 Connector is NOT currently running on OSPC."
$EmailToSubjectNotInstalled = "AS2 Connector Installation Not Found."
$EmailToBodyNotInstalled = "The process check for AS2 Connector on OSPC failed because AS2 Connector does not seem to be installed."
$XHeaderInfo = "Email sent from OSPC"
function WriteLogFile {
#Code snippet obtained from: http://poshcode.org/2566
[cmdletbinding()]
Param(
[Parameter(ValueFromPipeline=$true,Mandatory=$true)] [ValidateNotNullOrEmpty()]
[string] $Message,
[Parameter()] [ValidateSet(“Error”, “Warn”, “Info”)]
[string] $Level = “Info”,
[Parameter()] [ValidateRange(1,30)]
[Int16] $Indent = 0,
[Parameter()]
[IO.FileInfo] $ScriptLogFile = $LogsDirectory + "ScriptLog-" + $FileDateStamp + ".log",
[Parameter()]
[Switch] $Clobber,
[Parameter()]
[String] $EventLogName,
[Parameter()]
[String] $EventSource = ([IO.FileInfo] $MyInvocation.ScriptName).Name,
[Parameter()]
[Int32] $EventID = 1
)
Begin {}
Process {
try {
$msg = '{0}{1} : {2} : {3}' -f (" " * $Indent), (Get-Date -Format “yyyy-MM-dd HH:mm:ss”), $Level.ToUpper(), $Message
switch ($Level) {
'Error' { Write-Error $Message }
'Warn' { Write-Warning $Message }
'Info' { Write-Host ('{0}{1}' -f (" " * $Indent), $Message) -ForegroundColor White}
}
if ($Clobber) {
$msg | Out-File -FilePath $ScriptLogFile
} else {
$msg | Out-File -FilePath $ScriptLogFile -Append
}
if ($EventLogName) {
if(-not [Diagnostics.EventLog]::SourceExists($EventSource)) {
[Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
}
$log = New-Object System.Diagnostics.EventLog
$log.set_log($EventLogName)
$log.set_source($EventSource)
switch ($Level) {
“Error” { $log.WriteEntry($Message, 'Error', $EventID) }
“Warn” { $log.WriteEntry($Message, 'Warning', $EventID) }
“Info” { $log.WriteEntry($Message, 'Information', $EventID) }
}
}
} catch {
throw “Failed to create log entry in: ‘$ScriptLogFile’. The error was: ‘$_’.”
}
}
End {}
}
if (test-path $AS2ParentDirectory) {
# AS2 is installed on this machine.
# Check for the running process.
if (!($ProcessIsRunning)) {
# Process is not found = not runing.
# Try to start the process.
# Once start attempt is complete, recheck to make sure failed or succeeded.
# Failed: send an alert email through blat.
# Succeeded: Send an alert email through blat.
write-host "AS2 Connector is not running. Attempting to start."
WriteLogFile -message "Script Line #142: AS2 Conenctor is not running. Attempting to start." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
$StartTheProcess
# Give the process a little time to start before checking. Wait X seconds.
write-host "Going to sleep for $SleepTime seconds."
WriteLogFile -message "Script Line #147: Going to sleep for $SleepTime seconds." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
start-sleep -s $SleepTime
# Now, let's go ahead and recheck to see if the process started or not.
if (!($ProcessIsRunning)) {
# Process did not start successfully.
write-host "AS2 Connector did not start successfully. Sending an email to advise."
WriteLogFile -message "Script Line #162: AS2 Conenctor did not start successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodyFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectFail -i $EmailFrom -body $EmailToBodyFail -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
} else {
# Process started successfully.
write-host "AS2 Connector started successfully. Sending an email to advise."
WriteLogFile -message "Script Line #154: AS2 Conenctor started successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
}
} else {
# Process is found = running.
# Send an email advising of running status.
write-host "Verified AS2 Connector is running. Sending an email to advise."
WriteLogFile -message "Script Line #130: Verified AS2 Conenctor is running. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
}
} else {
# AS2 is not installed on this machine.
# Send an email advising that there is a potential problem.
write-host "AS2 Connector does not seem to be installed or is corrupt. Sending an email to advise."
WriteLogFile -message "Script Line #173: AS2 Conenctor does not seem to be installed or is corrupt. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectNotInstalled" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodyNotInstalled" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectNotInstalled -i $EmailFrom -body $EmailToBodyNotInstalled -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
}
Часть кода, которая идет не так:
# Now, let's go ahead and recheck to see if the process started or not.
if (!($ProcessIsRunning)) {
# Process did not start successfully.
write-host "AS2 Connector did not start successfully. Sending an email to advise."
WriteLogFile -message "Script Line #162: AS2 Conenctor did not start successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodyFail" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectFail -i $EmailFrom -body $EmailToBodyFail -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
} else {
# Process started successfully.
write-host "AS2 Connector started successfully. Sending an email to advise."
WriteLogFile -message "Script Line #154: AS2 Conenctor started successfully. Sending an email to advise." -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Sending an email to: $EmailTo" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Subject: $EmailToSubjectSuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
WriteLogFile -message "Email Body: $EmailToBodySuccess" -level Info -EventID 3 -Indent 2 -EventLogName 'Application' -EventSource "AS2Check.ps1"
C:\blat\blat.exe -to $EmailTo -s $EmailToSubjectSuccess -i $EmailFrom -body $EmailToBodySuccess -server $EmailServer -f $EmailFrom -u $AuthUser -pw $AuthPass -port $EmailPort -try $MaxRetries -debug -log $BlatLogFile -timestamp -x $XHeaderInfo
}
2 ответа
$ProcessIsRunning = Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue
$StartTheProcess = start-process -filepath $AS2
Когда вы запускаете эти строки, команды выполняются немедленно, а результат сохраняется в переменной. Так что, если процесс не был запущен в начале сценария, $ProcessIsRunning
всегда будет нулевым (не работает).
Решение состоит в том, чтобы удалить обе строки сверху и заменить каждый экземпляр следующих переменных ниже в вашем скрипте:
$ProcessIsRunning
с(Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue)
, Ex.if(!(Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue)) { "not running" } else { "running" }
,$StartTheProcess
сStart-Process -Filepath $AS2
Вы также можете попробовать этот подход, который, вероятно, был тем, что вы изначально планировали:
$ProcessIsRunning = { Get-Process notepad -ErrorAction SilentlyContinue }
$StartTheProcess = { Start-Process notepad }
#Run the start-process command
$StartTheProcess.Invoke()
#This will run the get-process command whenever you call it by using the Invoke() method.
if(!$ProcessIsRunning.Invoke()) {
"Not running"
} else {
"Running"
}
Ouput:
Running
Это $StartTheProcess = start-process -filepath $AS2
сохраняет результаты запуска start-process. Если у вас есть строка кода в вашем скрипте, которая говорит $StartTheProcess
(как и вы) не ожидайте, что он выполнит команду; он будет отображать только тот результат, который был сохранен изначально.
Либо позвони start-process
в соответствующем месте, или используйте функцию.
Изменить: Как говорится в комментарии (и я пропустил), вам также необходимо перепроверить, работает ли процесс. Повторите эту строку, прежде чем проверять во второй раз.
$ProcessIsRunning = Get-Process $ProcessNameToCheck -ErrorAction SilentlyContinue