我想使用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
这里发生了什么,我该怎么办?
答案 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数组,而不是管道输入并且它可以工作。