Назад | Перейти на главную страницу

Странное поведение базового сценария Powershell

У меня есть небольшой сценарий. Что я хочу проверить с помощью «If, else statement». У меня такие же значения переменных, но когда я пытаюсь их сравнить, это дает другое условие, но оно должно давать истинное условие. Ниже мои вары с результатами.

$ASE1=Get-Content -path "C:\Program Files\Kratos\Tools\ASE\cnf\_ASE.cnf" | out-string -Stream | Select-String "VERSION"

Версия 85

$ASE2=Get-Content -path "C:\ProgramData\Kratos\Tools\NaCl\Files\xASE.cnf"| out-string -Stream | Select-String "VERSION"

Версия 85

if ($ ASE1 -eq $ ASE2) {echo "равно"} else {echo "не равно"}

Этот небольшой скрипт выше возвращает мне условие "не равно", но на самом деле эти переменные равны друг другу. Вы знаете, что я делаю не так?

-readcount 0 работает так же, как конвейер к исходящей строке.
Передача по конвейеру из строки или получения содержимого в строку выбора создает узкое место в вашем сценарии.

$ASE1 = Get-Content "C:\Program Files\Kratos\Tools\ASE\cnf\_ASE.cnf" -ReadCount 0
$ASE2 = Get-Content "C:\ProgramData\Kratos\Tools\NaCl\Files\xASE.cnf" -ReadCount 0
[regex]$Pattern = 'Version\s\d+'
if ($Pattern.Matches($ASE1).value -eq $Pattern.Matches($ASE2).value) { 
    "equal"
}
else {
    "not equal"
}

Select-String возвращает не строку, а Microsoft.PowerShell.Commands.MatchInfo Объект

  • Как эти Objects отличаться ваш результат ожидается. (просмотреть вывод $ASE1,$ASE2)
  • И Get-Content, и Out-String из вашего примера излишни.
  • Поскольку шаблон основан на RegEx, вы можете использовать (группу захвата), чтобы просто получить цифры вашей версии.
$Pattern = 'Version (\d+)'
$ASE1 = Select-String -Pattern $Pattern -Path "C:\Program Files\Kratos\Tools\ASE\cnf\_ASE.cnf"
$ASE2 = Selcet-String -Pattern $Pattern -Path "C:\ProgramData\Kratos\Tools\NaCl\Files\xASE.cnf"
if($ASE1.Matches.Groups[1].Value -eq $ASE2.Matches.Groups[1].Value) { 
    "equal"
} else {
    "not equal"
}