【问题标题】:In Powershell how can I pass an array as an argument, which is one of multiple arguments to Start-Process -ArgumentList在 Powershell 中,如何将数组作为参数传递,这是 Start-Process -ArgumentList 的多个参数之一
【发布时间】: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


【解决方案1】:

这是一种方法。 ScriptCallingStartProcess.ps1:

$stringArray = @('String1','String2','String3')
$OFS=","
Start-Process powershell.exe -Verb Runas "-NoExit -File \ScriptToInvoke.ps1 $stringArray -Mode Mode3 -Verbose"

ScriptToInvoke.ps1:

[CmdletBinding()]
param (
  [Parameter(Mandatory=$True)]
  [String] $InputData,
  [ValidateSet('Mode1', 'Mode2', 'Mode3')]
  [string]$Mode = 'Mode1'
)

$StringArray = $InputData -split ','
$count = $StringArray.Count
Write-Verbose ("String array count ($count): $StringArray")

(即,将逗号分隔的字符串作为第一个参数传递,然后在第二个脚本中拆分)

【讨论】:

    【解决方案2】:

    我转义了双引号,它似乎工作正常:

    Start-Process powershell -Verb RunAs -ArgumentList "-NoExit -File test.ps1 -StringArray `"$stringArray`" -Mode Mode3 -Verbose"
    

    【讨论】:

    • 不错的尝试,但是将字符串传递给-StringArray 参数,而不是数组(仔细查看ScriptToInvoke.ps1 的输出)。
    • 是的,计数将报告为 1
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 2015-03-03
    • 2016-12-18
    • 2015-08-12
    • 2020-11-07
    • 2018-11-02
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多