【发布时间】:2016-02-19 01:46:18
【问题描述】:
ScriptToInvoke.ps1:
[CmdletBinding()]
param (
[Parameter(Mandatory=$True)]
[string[]]$StringArray,
[ValidateSet('Mode1', 'Mode2', 'Mode3')]
[string]$Mode = 'Mode1'
)
$count = $StringArray.Count
Write-Verbose ("String array count ($count): $StringArray")
ScriptCallingStartProcess.ps1:
$stringArray = @('String1','String2','String3')
Start-Process powershell -Verb RunAs
-ArgumentList "-NoExit -File ScriptToInvoke.ps1 -StringArray ""$stringArray"" -Mode Mode3 -Verbose"
在这种情况下,$stringArray 被视为包含一个元素的数组:
screen capture of script run output
我尝试了多种传递 $stringArray 参数的变体:
-StringArray $stringArray
-StringArray @($stringArray)
-StringArray @(,@($stringArray))
每个都有相同的错误: 找不到接受参数'String2'的位置参数
据我了解,ArgumentList 值周围的双引号会导致解析任何变量。是否有可能防止这种情况发生?还是有其他方法?
我的用例涉及尝试以提升的权限重新运行 Powershell 脚本以卸载 Windows 更新,这就是我使用 Start-Process 和 -Verb RunAs 的原因。
【问题讨论】:
-
问题是启动新进程的命令行不会传递数组。这将是一个字符串。我的建议是重组您正在调用的脚本。
-
谢谢比尔,在这种情况下,我可能会使用多个默认为空字符串的参数。我不希望需要更多的字符串来满足数组中我期望的字符串数量。
-
一种可能的替代方法是向
ScriptToInvoke.ps1提供一个逗号分隔的字符串,并使用-split从中获取一个数组。
标签: powershell