我需要将虚拟硬盘添加到多个虚拟机,所以我最终使用它来执行此操作:
get-vm server[2..3..6][1-3].domain.com | new-harddisk -CapacityGB 10
这为服务器添加了一个10gig硬盘:
server21.domain.com
server22.domain.com
server23.domain.com
server31.domain.com
server32.domain.com
server33.domain.com
server61.domain.com
server62.domain.com
server63.domain.com
这就是我想要的......但我使用的语法是否正确?我知道1..3通常会扩展到1 2 3,但在这种情况下,这并不是为什么我在第二部分使用1-3而2..3..6最终只执行2 3 6。 / p>
有人可以验证吗?
答案 0 :(得分:2)
1..3
是用于生成数组的PowerShell数组语法,但在Get-VM xyz[1..3]
的上下文中却不是。您可以从PowerShell ISE中的着色中看到:
如果您通过解析器运行它并查看它是如何被读取的,您也可以看到它:
{get-vm server[1..3..5]}.Ast.FindAll({$true}, $true)
# includes output
StringConstantType : BareWord
Value : server[1..3..5]
StaticType : System.String
VS
{get-vm $server[1..3..5]}.Ast.FindAll({$true}, $true)
Operator : DotDot
Left : 1
Right : 3
Value : 1
StaticType : System.Int32
Value : 3
StaticType : System.Int32
Value : 5
StaticType : System.Int32
换句话说,你的语法对于PowerShell数组扩展是错误的(它们不能链接在一起),但这些不是PowerShell数组文字,它们是作为参数传递给Get-VM cmdlet的文字字符串,是(据推测)以某种方式将它们视为通配符。
Hyper-V Get-VM
表示它不支持通配符。
VMware Get-VM
确实在其示例中展示了通配符。
从使用PowerCLI开始,看起来..
被忽略,[236]
表示“ 2,3或6在此位置”并且[1-3]
表示“此位置中1到3之间的数字”`。哪个是你想要的输出,所以在这个意义上,语法很好。并且可能比你能够使用PS阵列更容易。
答案 1 :(得分:1)
语法不正确(如果您尝试可能收到错误)。您可以创建两个序列(1,2,3)和(2,3,6)并迭代两者以创建所需的9个组合。但是,我会这样做:
21, 22, 23, 31, 32, 33, 61, 62, 63 | ForEach-Object {
get-vm ('server{0}.domain.com' -f $_) |
new-harddisk -CapacityGB 10
}
答案 2 :(得分:1)
假设你的数字设置比一小部分大一点,我可以看到某种算法的价值来做到这一点。
对于匆忙拼凑的东西,你可以使用:
2,3,6 | % {$x=$_; 1..3 | % {"server$($x*10+$_).domain.com"}}
然后将其输入您想要对条目进行的操作......