title: Determining if a process is running
body: <p>all,</p>
  
  <p>I am new to Power Shell scripting and my second script is not working 100%. I am not sure what is going on.</p>
  
  <p>Purpose:</p>
  
  <ol>
  <li>Check to see if a specific process is running or not.</li>
  <li>If it is running, send an email advising.</li>
  <li>If it is not running, attempt to start the process.</li>
  <li>If attempting to start the process, recheck to see if process started or not.</li>
  </ol>
  
  <p>Issue:</p>
  
  <ul>
  <li>If I change the directory location of the script (to make sure it is wrong), I get the right email.</li>
  <li>If the process is running, I get the right email.</li>
  <li>If the process is not running, the script starts the process correctly, but sends and email saying the process is not running when in fact it is running.</li>
  </ul>
  
  <p>Script:</p>
  
  <pre><code># 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
  }
  </code></pre>
  
  <p>The portion of code that is going wrong is:</p>
  
  <pre><code>    # 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            
      }
  </code></pre>