这个数字序列有效,但它是否正确?

时间:2016-11-02 19:21:10

标签: powershell

我需要将虚拟硬盘添加到多个虚拟机,所以我最终使用它来执行此操作:

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>

有人可以验证吗?

3 个答案:

答案 0 :(得分:2)

1..3是用于生成数组的PowerShell数组语法,但在Get-VM xyz[1..3]的上下文中却不是。您可以从PowerShell ISE中的着色中看到:

Examples of how it's being parsed showing ISE syntax highlighting

如果您通过解析器运行它并查看它是如何被读取的,您也可以看到它:

{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"}}

然后将其输入您想要对条目进行的操作......