连接PowerShell数组中的字符串

时间:2016-10-12 16:46:34

标签: powershell

我想使用PowerShell自动执行diskpart.exe,但PowerShell构建的脚本参数被视为无效。例如,下面的普通diskpart脚本按预期工作:

$diskDetailsDPCom=@(
    "select disk 0",
    "detail disk",
    "exit"
)
$diskDetailsDPCom | diskpart

但是当我尝试通过连接变量或文字“0”来构建“选择磁盘”命令时,则diskpart以The arguments specified for this command are not valid.失败:

$diskDetailsDPCom=@(
    "select disk " + "0",
    "detail disk",
    "exit"
)
$diskDetailsDPCom | diskpart

这里发生了什么,我该怎么办?

2 个答案:

答案 0 :(得分:4)

在PowerShell中,逗号(,)运算符的优先级高于连接(+)运算符。您的两个代码块的评估方式不同。

@("select disk 0", “detail disk”, “exit”)

按预期计算具有三个字符串的数组。但是,您的第二个示例实际上解析为

@("select disk " + (“0”, “detail disk”, “exit”))

要进行连接,PowerShell会将数组转换为带有-join运算符的字符串,结果为字符串"select disk 0 detail disk exit",并以数组形式包装。

要获取所需的数组,请在连接周围添加括号。

@(
    ("select disk " + “0”),
    “detail disk”,
    “exit”
)

答案 1 :(得分:-1)

修订后的剧本。根据@ryan bemrose的回答,splatting不起作用,但阵列部分应该仍然是正确的

$diskDetailsDPCom=@(
    "select disk", "0"
    , "detail disk"
   , "exit"
)
@diskDetailsDPCom | diskpart

下面的非工作答案。

不要将参数传递给diskpart试试这个...

$diskDetailsDPCom=@(
    "select disk", "0"
    , "detail disk"
   , "exit"
)
diskpart @diskDetailsDPCom

... PowerShell将针对diskpart展开args数组。

请注意,它们之间需要空格的任何args都是单独的数组元素。如果使用assign letter=R之类的开关,letter=R将是一个数组元素。

这是针对diskpart未经测试的,但是我已成功使用这种方法在外部命令的左侧上绘制一个args数组,而不是管道输入并且它可以工作。