2016-05-11 85 views
3

我正在編寫一個簡短腳本,用於比較在我們的虛擬機上運行的操作系統與我們手動輸入到CMDB中的操作系統。下面是一些測試代碼刪除預期值後的字符串

foreach ($r in $SQL) { 
    if ((Get-VMGuest $r.name).OSFullName -eq $r.OS) { 
    Write-Host "Match" 
    } else { 
    Write-Host "Not matching" 
    } 
} 

下面是一些例子輸出

VM Output = Microsoft Windows Server 2003 Standard (32-bit) 
SQL Output = Microsoft Windows Server 2003, Standard Edition 

VM Output = Microsoft Windows Server 2012 (64-bit) 
SQL Output = Microsoft Windows Server 2012 Standard 

由於結果是輸出我從來沒有得到,即使操作系統是相同的比賽方式。

有沒有辦法在服務器年後或其他方式來解決這個問題?

回答

1

我會傾向於嘗試和規範兩個字符串,然後比較規範化的版本;此功能是一個開始,你可以適應您的具體情況:

function NormalizeOS([string]$RawOs) { 
    $output = $RawOs -Replace 'Edition', '' ` 
    -Replace ',', '' ` 
    -Replace '(64-bit)', '' ` 
    -Replace '(32-bit)', ''; 

    return $output.trim(); 
} 

然後,您可以適應您的原始if聲明:

if (NormalizeOS((Get-VMGuest $r.name.OSFullName)) -eq NormalizeOS($r.OS)) 

這裏的技術是嘗試剝離出從無關信息這兩個字符串只留下您關心的細節。

+0

是啊,多數民衆贊成eacly我想要完成的任務。你的函數運行正常,但if語句不會,NormalizeOS($ r.OS))部分不會工作,是否有一個括號丟失或什麼? – Notumlord

+0

嗯,是的括號是在錯誤的地方,試試看。 –

1

拆分使用regular expression

精確地跟隨您的定義字符串「服務器後折斷」:

($r.OS -Split "(?<=\WServer\W)")[0] 
+0

我實際上是指服務器年份/版本,但它沒有出現,因爲我在<>中寫入它。原始帖子已更新 – Notumlord

+0

在這種情況下,您可能需要如下所示:'($ r.OS -Split「(?<= \ WServer \ d \ d \ d \ d \ d \ W)」)[0]' – iRon

+0

或if你只想把所有東西都放到一個不是單詞字符或空格的東西上(像逗號或左括號):'($ r.OS -Split「[^ \ w]」)[0] ' – iRon