Powershell - проверить, существует ли файл и содержит ли он строковый шаблон - PullRequest
0 голосов
/ 13 февраля 2019

написал эту небольшую часть кода, чтобы проверить, существует ли файл и содержит ли он строковый шаблон

try {
$SEL = Select-String -Path \\$serversPing\c$\Scripts\compare_result.txt -Pattern "no differences encountered" -ErrorAction SilentlyCOntinue
}catch{
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
}
Finally {
if ($SEL | Test-Path -ErrorAction SilentlyContinue){
    #write-host $serversPing $SEL.Pattern
    #write-host $serversPing $SEL
    if ($SEL.Pattern -eq "no differences encountered")
    {
       $SoftCheckResult = "ok"
    }
    else
    {
        $SoftCheckResult ="Verify"
    }

}
else{
    $SoftCheckResult =  "NotInScope"
}
}

Но он не делает то, что должен.Во-первых, он частично распознает, что путь существует, и, во-вторых, он частично распознает шаблон в текстовом файле.Не могли бы вы мне помочь?

Я подозреваю, что PATTER частично распознается на сервере с несколькими серверами (пробелы и т. Д.), Даже если как пропустить это?

Странно думать, что он не видит, что шаблон отсутствует в файле, онвместо этого верните NotinScope. Проверьте файл ниже без этого шаблона

enter image description here

А ниже вы можете увидеть нормальный шаблон

enter image description here

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019

Поскольку вы используете множественное число в $serversPing, я подозреваю, что эта переменная происходит из более ранней части вашего кода и содержит КОЛЛЕКЦИЮ серверов.

Я бы изменил порядок проверок и начал бы с проверки наПосмотрим, существует ли файл на этом сервере или нет:

# As you mentioned a possible whitespace problem the pattern below uses regex `\s+` so multiple whitespace characters are allowed betwen the words.
$pattern = "no\s+differences\s+encountered"
foreach ($server in $serversPing) {
    if (Test-Connection $server -Count 1 -Quiet) {
        $filePath = Join-Path -Path "\\$server" -ChildPath 'c$\Scripts\compare_result.txt'
        if (Test-Path $filePath -PathType Leaf) {
            # -Quiet:       Indicates that the cmdlet returns a Boolean value (True or False), instead of a MatchInfo object. 
            #               The value is True if the pattern is found; otherwise, the value is False.
            if (Select-String -Path $filePath -Pattern $pattern -Quiet) {
                Write-Host "Pattern '$pattern' found in '$filePath'"
                $SoftCheckResult = "ok"
            }
            else {
                Write-Host "Pattern '$pattern' not found in '$filePath'"
                $SoftCheckResult = "Verify"
            }
        }
        else {
            Write-Host "File '$filePath' not found"
            $SoftCheckResult ="NotInScope"
        }
    }
    else {
            Write-Host "Server '$server' is off-line."
            $SoftCheckResult ="OffLine"
    }
}

Я добавил Test-Connection в цикл foreach, чтобы сначала увидеть, подключен сервер или нет.Если вы уже проверяли это и переменная $serversPing содержит только те серверы, которые находятся в сети и доступны, вы можете пропустить это.

0 голосов
/ 13 февраля 2019

Пожалуйста, попробуйте как ниже:

$SEL = "Fiile path location"
if ($SEL | Test-Path -ErrorAction SilentlyContinue){

if ($SEL Get-Content | Select-String -pattern "no differences encountered")
{

}
....
}
0 голосов
/ 13 февраля 2019
try
{
    $SEL = $null
    $SEL = Select-String -Path \\$serversPing\c$\Scripts\compare_result.txt -Pattern "no differences encountered" -ErrorAction Stop
    if ($SEL)
    {
        $SoftCheckResult = "ok"
    }
    else
    {
        $SoftCheckResult = "Verify"
    }
}
catch
{
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
    $SoftCheckResult = "NotInScope"
}
return $softCheckResult 
0 голосов
/ 13 февраля 2019

Относительно -Path командлета Select-String вы должны указать значение между "":

$SEL = Select-String -Path "\\$serversPing\c$\Scripts\compare_result.txt" -Pattern "no differences encountered" -ErrorAction SilentlyCOntinue

EDIT

Это должно помочь:

try {
    $SEL = Select-String -Path \\$serversPing\c$\Scripts\compare_result.txt -Pattern "no differences encountered" -ErrorAction SilentlyCOntinue
}catch{
    $ErrorMessage = $_.Exception.Message
    $FailedItem = $_.Exception.ItemName
}
Finally {
    if ($SEL){
        $SoftCheckResult = "ok"
    }
    else
    {
        $SoftCheckResult ="Verify"
    }
}
...