我已经冒险进入Powershell领域,发现自己陷入了应该是一项简单的任务。我想比较两个包含两个不同文件版本号的字符串。出于某种原因,我的比较总是返回false:
$DLFilePath = "$PSScriptRoot\Download\Update.ini"
$SRCFilePath = "$PSScriptRoot\Original\Update.ini"
#Get File Versions
$DLVersion = Select-String $DLFilePath -pattern "\bVersion" |select line
$SRCVersion = Select-String $SRCFilePath -pattern "\bVersion" |select line
Write-Output "DL Version: " $DLVersion
Write-Output "SRC Version: " $SRCVersion
if($DLVersion -eq $SRCVersion){
Write-Output "Files match"
}else {
Write-Output "Files don't match."
}
--------------Output---------------
DL Version:
Line
----
Version=4.5.2.1233
SRC Version:
Version=4.5.2.1233
Files don't match
知道比较失败的原因吗?我原本以为是因为“\ n Line \ n ----”?对于第一个变量,但我无法弄清楚它来自何处。它只出现在我第一次打印其中一个变量时(如果我连续两次打印相同的变量,它将不再显示第二次),所以我认为它与输出函数有关而不是变量本身?此外,如果我逐步完成调试并手动打印出两个变量,它会出现在两个变量上:
[DBG]: PS C:\Users\usr\Desktop>> $DLVersion
Line
----
Version=4.5.2.1233
[DBG]: PS C:\Users\usr\Desktop>> $SRCVersion
Line
----
Version=4.5.2.1233
答案 0 :(得分:0)
写下@PetSerAl的评论作为答案。
问题是Select-Object
默认情况下返回一个或多个PSCustomObject,其相同属性仅设置为使用您选择的属性进行格式化。然后比较最终成为参考比较,而不是值比较。
要使其仅返回您选择的属性的值,您需要使用-ExpandProperty
。
以下是更新代码:
$DLFilePath = "$PSScriptRoot\Download\Update.ini"
$SRCFilePath = "$PSScriptRoot\Original\Update.ini"
#Get File Versions
$DLVersion = Select-String $DLFilePath -pattern "\bVersion" |Select-Object -ExpandProperty line
$SRCVersion = Select-String $SRCFilePath -pattern "\bVersion" |Select-Object -ExpandProperty line
Write-Output "DL Version: " $DLVersion
Write-Output "SRC Version: " $SRCVersion
if($DLVersion -eq $SRCVersion){
Write-Output "Files match."
}else {
Write-Output "Files don't match."
}