基本 Powershell 脚本的奇怪行为

基本 Powershell 脚本的奇怪行为

我有一段小脚本。我想用“If, else 语句”来测试它。我有相同的值变量,但当尝试比较它时,它给出了 else 条件,但它应该给出 true 条件。以下是我的变量及其结果。

$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 "不等于"}

上面的小脚本返回“不相等”条件,但实际上这些变量是相等的。你知道我做错了什么吗?

答案1

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"
}

答案2

-readcount 0 的作用与通过管道传输到 out-string 相同。
通过管道传输 out-string 或 get-content 到 select-string 会给您的脚本带来瓶颈。

$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"
}

相关内容