writing a Powershell script to monitor a log file and have a condition for a fail over to a redundant connection that needs a service to be restarted.
$cond = "WARN: Attempting auto reconnect to Host"
$lfil = "c:\temp_logs\error.log"
Get-Content $lfil -wait | Select-String -Quiet $cond
if(true) {
write-host "restarting due to fail over "
Stop-service "Outbound HL7"
Rename-Item -Path $lfil -NewName "c:temp_logs\error_restart.log"
Start-sleep 2
Start-Service "Outbound HL7"
} else {
write-host "no match"
}
in the ISE i get a line when the condition is met True, but cant enter in the if condition, tried the $_. I know this has to be really simple but very new to Powershell and looking things up is pointing me in a bunch of different directions. Any guidance would be greatly apprciated.
Joe
CodePudding user response:
In PowerShell the literal term true
has no meaning. The PowerShell version of the True/true
constants many other languages use is instead $true
.
if ($true) { Write-Host 'True' }
That being said you also can use other values that can be cast to the true
boolean value to satisfy an if condition such as
if (1) { Write-Host 'True' }
and
if ('non-empty string') { Write-Host 'True' }
just to name a few
CodePudding user response:
You're looking to operate on whether or not your Select-String
found a match.
Adding -Quiet
outputs a Boolean that indicates that; it does not set an exit code in the manner that calls to external programs do.
Thus, instead of trying to test for the outcome after the Select-String
call, directly evaluate the call itself:
if (Get-Content $lfil -wait | Select-String -Quiet $cond) {
...
}
As for what you tried:
if (true) { ...
true
is interpreted as a command in this case; there is no such command built into PowerShell, so it'll look for an external program named true
, which is unlikely to exist on Windows, but does exist on Unix-like platforms, where it produces no output and only sets an exit code; however, if
only acts on output, and empty output is considered falsey, so the conditional is always false.
If you wanted to operate on the most recent command's success status, PowerShell's automatic $?
variable reflects that: however, unlike in POSIX-like shells such as bash
, where it contains the most recent statement's exit code, in PowerShell it is an abstract indicator reflecting either $true
or $false
(PowerShell's Boolean constants).
$?
is rarely used in PowerShell, and it doesn't quite operate the same way that it does in POSIX-compatible shells, because native PowerShell commands do not use exit codes to communicate success vs. failure. Thus, $?
usually just tells you whether a genuine error occurred, not whether a condition was met or not. E.g., after executing 'a' | Select-String 'b'
, $?
still contains $true
, since no error occurred during execution (the string was simply not found). As with Select-String -Quiet
, PowerShell-native commands in general indicate success vs. failure via a Boolean output value, as the Test-*
cmdlets such as Test-Path
do.
However, for commands that do set (process) exit codes - external programs and potentially also .ps1
script (primarily if they're called from outside PowerShell) - it is reflected in the automatic $LastExitCode
variable.