【问题标题】:variables in strings with powershell带有powershell的字符串中的变量
【发布时间】:2013-03-08 07:44:07
【问题描述】:

我正在尝试构建一个由其他几个变量组成的变量,然后包括,例如:

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

Get-VM | Where $myString

我已经尝试了 $($myString)、$myString、${$myString} 等所有可能的组合... 它仍然列出所有计算机,就好像没有过滤器一样。如果我 ECHO Get-VM... 它看起来非常好,如果我剪切粘贴它就可以了。

有人知道吗?

【问题讨论】:

  • 你不能这样使用字符串,你需要一个脚本块。

标签: powershell scripting vmware


【解决方案1】:

Where-Object 过滤器是脚本块。脚本块在运行前编译,然后将其中的变量引用固定在脚本块中。一种延迟的方法是在设置局部变量之后使用 [scriptblock]::create 创建脚本块,就在使用它之前。

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

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

Get-VM | Where $filter

【讨论】:

  • 我的救星!感谢 ScriptBlocks 的解释和解决方案!像魅力一样工作。 :)
【解决方案2】:

您应该使用脚本块。每次调用它时它都会扩展变量。我自己安装了 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

【讨论】:

  • 感谢 CB 和 Graimer,问题是我可以是我想要过滤的 1、5、14 台计算机,所以我必须根据计算机的数量动态构建 $_.Name -like我想过滤这就是为什么我在字符串中构建的原因,我在原始帖子中没有提到的是我根据计算机数量进行了循环构建字符串。
  • 查看更新后的答案。如果您确实需要构建字符串($computers 比您想要获得的 VM 更多),您应该使用 mjolinor 的答案。就我个人而言,我会让脚本与-contains 一起工作:)
  • 疯了,我所拥有的是 ForEach($VM in (Get-VM | where $mywherestatement)) { 和 -contains它是空的,我会尝试 mjolionr 的答案,看看它是否会更好......
  • 很抱歉,如果它不起作用,那是你没有正确使用它。我的答案中的最后一个示例完美运行,使用-contains 与ForEach($VM in (Get-VM | where { $Computer -contains $_.Name })) { 完美匹配。
  • 无需抱歉@Graimer,非常感谢您的帮助。可能是因为我在$Computer-array 中使用了通配符吗?如果尝试使用-contains,这是我的结果:Where-Object : Cannot convert 'dc-cust* ' to the type System.Management.Automation.ScriptBlock' required by parameter 'FilterScript'. Specified method is not supported.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2011-01-10
相关资源
最近更新 更多