如何在 Powershell 中选择性地指定参数?

如何在 Powershell 中选择性地指定参数?

我正在从 AutoHotkey 移植一些旧代码“为了好玩”,我想我偶然发现了它的一个意想不到的功能......

我希望能够做一些类似的事情

$ws = "Minimized"
$parameters = "/k dir F:\" 
start-process cmd.exe ( $(if($parameters){"-argumentlist $parameters"}) )( $(if ($ws){"-windowystyle $ws"}) )

但它永远不会将它们“整体地”连接成一个命令,将它们全部扔到 cmd.exe 上 - 我天真地希望 Powershell 可以“捕获” WindowStyle 本身,并最小化窗口(当前,它直接传递给忽略它的 cmd.exe)。

我知道我有点疯狂,但是我也在努力寻找正确的术语来搜索 - about_parsing 没有帮助,连接字符串的无数示例也没有用 - 我真的希望 Powershell 足够宽松,允许我动态地从字符串切换到参数,我猜这违背了某些地方有意识的设计决策......

因此,另一种选择是使用一堆 if 语句来适应各种选项的排列......

if ($ws -and -(not $parameters)) {start-process cmd.exe -windowystyle $ws}
if ($parameters -and -(not $ws)) {start-process cmd.exe -argumentlist $parameters}
if ($parameters -and $ws) {start-process cmd.exe -argumentlist $parameters -windowystyle $ws}
...ad nauseum

除非有人有更好的想法?

答案1

您的“like”示例的部分问题在于,它将后面的所有内容分组cmd.exe并将其Start-Process作为单字符串第二个位置参数传递给ArgumentList。因此,您实际上是在运行此代码:

Start-Process -FilePath 'cmd.exe' -ArgumentList "-argumentlist /k dir F:\ -windowstyle Minimized"

溅射可能会对你有所帮助。您可以使用哈希表动态构建在实际调用之前发送的参数集Start-Process。例如:

# initialize a hashtable we'll use to splat with later
# that has all of the params that will always be used.
# (it can also be empty)
$startParams = @{
    FilePath = 'cmd.exe'
}

# conditionally add your WindowStyle
if ($ws) {
    $startParams.WindowStyle = $ws
}

# conditionally add your ArgumentList
if ($parameters) {
    $startParams.ArgumentList = $parameters
}

# run the function with the splatted hashtable
Start-Process @startParams

相关内容