ArgumentList为空时的PowerShell启动进程cmdlet

zd287kbt  于 2022-12-23  发布在  Shell
关注(0)|答案(3)|浏览(148)

我已经尽可能地简化了我的情况。我有一个PowerShell脚本,它使用Start-Process cmdlet通过编程方式启动一个进程,并带有 “以管理员身份运行” 选项:

param
(
    # Arguments to pass to the process, if any
    [string[]] $ArgList
)

if($ArgList)
{
    Start-Process -FilePath notepad.exe -ArgumentList $ArgList -Verb RunAs
}
else
{
    Start-Process -FilePath notepad.exe -Verb RunAs
}

由于ArgumentList既不能为NULL也不能为空,因此我必须添加if-else以避免 ParameterArgumentValidationError 错误。
一切都按预期工作,没有任何问题,但我只是想知道是否有一个更优雅(但仍然简单)的方式来完成,而不使用if-else块。

ajsxfq5m

ajsxfq5m1#

您可以使用"splat" operator动态添加参数。
使用参数名称的键定义哈希。然后将其传递给cmdlet:

$extras = @{}
if (condition) { $extras["ArgumentList"] = whatever }

Start-Process -FilePath = "notepad.exe" @extras
xzlaal3s

xzlaal3s2#

有一种方法可以使用splat操作符@(参见Richard answerd),也可以使用带条件的格式字符串,但是,我认为If-else语句是最可读和清晰的方法,我不会试图简化它。

l7wslrjt

l7wslrjt3#

我使用的是Powershell 7,没有这个问题,我在一个函数中运行Start-Process -ArgumentList $args,其中$args有时为空,它工作正常。
但是,我的脚本无法在Windows PowerShell上运行。
看起来Powershell 7不再要求您在这里使用if-else语句。

相关问题