2013-03-19 75 views
2

我試着去建立一個由其他幾個變量的一個變量,然後包括,例如:變量在使用PowerShell字符串

$myString = "{$_.Name -like " 
$myString += $computer[0] 
$myString += " -Or $_.Name -like " 
$myString += $computer[1]+"}" 

Get-VM | Where $myString 

我試着$($ myString的),$ myString的,$所有可能的組合{$ myString}等... 它仍然列出所有計算機,就好像沒有過濾器一樣。如果我ECHO的Get-VM ...它看起來非常好,如果我砍'n'paste它的作品。

任何一個有線索?

+0

你不能以這種方式使用字符串,你需要一個腳本塊。 – 2013-03-19 14:59:28

回答

3

Where-Object過濾器是scriptblocks。腳本塊在運行前被編譯,然後它們中的變量引用在scriptblock中被修復。一種延遲的方法是在使用之前使用[scriptblock] :: create在設置局部變量之後創建腳本塊。

$myString = "$_.Name -like " 
$myString += $computer[0] 
$myString += " -Or $_.Name -like " 
$myString += $computer[1] 

$filter = [scriptblock]::create($myString) 

Get-VM | Where $filter 
+0

我的救主!感謝ScriptBlocks和解決方案的解釋!像魅力一樣工作。 :) – Jocke 2013-03-19 15:33:15

1

您應該使用一個腳本塊。它會在你每次調用它時擴展變量。我的Hyper-V安裝自己,所以我做了一個例子:

PS > $computer = "DC", "SQL" 

$mywherestatement = { $_.Name -like $Computer[0] -or $_.Name -like $Computer[1] } 

Get-VM | Where $mywherestatement 

Name State CPUUsage(%) MemoryAssigned(M) Uptime Status 
---- ----- ----------- ----------------- ------ ------ 
DC Saved 0   0     00:00:00 Operating normally 
SQL Saved 0   0     00:00:00 Operating normally 



PS > $computer = "CLIENT", "WebDev" 

Get-VM | Where $mywherestatement 

Name State CPUUsage(%) MemoryAssigned(M) Uptime Status 
---- ----- ----------- ----------------- ------ ------    
CLIENT Saved 0   0     00:00:00 Operating normally 
WebDev Saved 0   0     00:00:00 Operating normally 

如果您$computer數組只包含您要檢查的名字,我會使用-contains代替,因爲它會隨着陣列工作任何尺寸。例如:

PS > $computer = "DC", "SQL", "CLIENT", "WebDev" 

Get-VM | Where { $Computer -contains $_.Name } 

Name State CPUUsage(%) MemoryAssigned(M) Uptime Status    
---- ----- ----------- ----------------- ------ ------    
CLIENT Saved 0   0     00:00:00 Operating normally 
DC  Saved 0   0     00:00:00 Operating normally 
SQL Saved 0   0     00:00:00 Operating normally 
WebDev Saved 0   0     00:00:00 Operating normally 
+0

謝謝CB和Graimer,問題是我可以是1,5,14電腦我想過濾,所以我必須dynamicaly建立$ _。名字般的根據計算機數量我想過濾多數民衆贊成爲什麼IM建在一個字符串,我沒有在我的原始文章中提到的是,我做一個循環根據計算機的數量建立字符串。 – Jocke 2013-03-19 15:11:50

+0

查看更新的答案。如果你真的需要構建字符串('$ computers'具有更多的虛擬機,那麼你應該使用mjolinor的答案。我個人已經和'-contains' :) – 2013-03-19 15:14:17

+0

要瘋了劇本的工作,我有什麼是'的ForEach($ VM中(GET-VM |其中$ mywherestatement)){'用'-contains'it來我會和mjolionr的回答一起去看看它是否會變得更好... – Jocke 2013-03-19 15:29:31