Поиск переменной для строки, а затем выполнение условного оператора в PowerShell - PullRequest
2 голосов
/ 04 мая 2011

Я довольно новичок в PowerShell. Недавно мне было поручено создать всплывающее сообщение об ошибке, которое помогло бы локальному пользователю определить, работает ли слияние БД MS SQL по требованию или нет. Я написал скрипт, который сделал бы следующее:

Запустить пакетный файл, который провел слияние Считать результаты файла текстового журнала в переменную Проверьте переменную на наличие вхождений слова «ОШИБКА» и откройте диалоговое окно об успехе или неудаче в зависимости от того, было ли найдено слово ошибка в файле журнала.

Я думал быстро и просто, но мне кажется, что я борюсь с условным утверждением. Вот сценарий:

cmd /c c:\users\PERSON\desktop\merge.bat

$c = get-content c:\replmerg.log

if ($c -contains ("ERROR"))
{
    $a = new-object -comobject wscript.shell
    $b = $a.popup(“ERROR - Database Merge“,0,”Please Contact Support”,1)
}

else
{
    $a = new-object -comobject wscript.shell
    $b = $a.popup(“SUCCESS - Database Merge“,0,”Good Job!”,1)
}

Сейчас происходит то, что скрипт запускается и просто переходит к сообщению об успехе. Я могу подтвердить, что простое выполнение команды 'get-content' в powershell само по себе создаст переменную, которую я затем смогу вызвать, и покажет содержимое файла журнала. Однако мой скрипт не выглядит так, как будто он на самом деле проверяет переменную $ c на наличие слова и затем выдает сообщение об ошибке, как и предполагалось. Что мне здесь не хватает?

Ответы [ 5 ]

4 голосов
/ 04 мая 2011

Христианский ответ правильный.Вы также можете использовать оператор -match .Например:

if ((Get-Content c:\replmerg.log) -match "ERROR")
{
    'do error stuff'
}
else
{
    'do success stuff'
}

Вы можете использовать -cmatch , если хотите сравнение с учетом регистра.

2 голосов
/ 04 мая 2011

На самом деле вам вообще не нужно использовать Get-Content.Select-String может принимать параметр -path.Я создал два очень простых текстовых файла, один из которых содержит слово ERROR, а другой - не

PS C:\> cat .\noerror.txt
not in here
PS C:\> cat .\haserror.txt
ERROR in here
this has ERROR in here
PS C:\> if ( Select-String  -Path .\noerror.txt -Pattern ERROR) {"Has Error"}
PS C:\> if ( Select-String  -Path .\haserror.txt -Pattern ERROR) {"Has Error"}
Has Error
PS C:\>

. Единственное, что может сбить вас с толку, это то, что -pattern на самом деле принимает регулярное выражение, поэтому будьте осторожныо том, что вы используете для вашего шаблона.Это найдет ОШИБКУ в любом месте файла журнала, даже если есть несколько экземпляров, как в моем файле "haserror.txt".

1 голос
/ 06 мая 2011

Вы можете использовать ключ -quiet select-string, если вы просто хотите проверить наличие строки в файле.

select-string -path c:\replmerg.log -pattern "ERROR" -casesensetive -quiet

Вернет $ true, если строка найдена вфайл и $ false, если это не так.

1 голос
/ 04 мая 2011

Оператор -contains используется для поиска точного совпадения в списке (или массиве).Как показывают другие ответы, вы должны использовать -match, -like или -eq для сравнения строк.

0 голосов
/ 04 мая 2011

содержит проверку оператора только идентичное значение (не является частью значения).

Вы можете попробовать это

$c = get-content c:\replmerg.log | select-string "ERROR" -casesensitive

if ($c.length -gt 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...