2013-03-19 57 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