全部,
我是 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
}