![基本 Powershell 脚本的奇怪行为](https://linux22.com/image/739499/%E5%9F%BA%E6%9C%AC%20Powershell%20%E8%84%9A%E6%9C%AC%E7%9A%84%E5%A5%87%E6%80%AA%E8%A1%8C%E4%B8%BA.png)
我有一段小脚本。我想用“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"
}