gpt4 book ai didi

powershell - Splatting 哈希表 - Start-Process -ArgumentList

转载 作者:行者123 更新时间:2023-12-03 00:21:50 25 4
gpt4 key购买 nike

我正在尝试使用 splatting 安装 .MSI:

$InstallerArgs @{
"DATABASENAME" = "my_database";
"LOCALIP" = "127.0.0.1";
"USERNAME" = "username1";
"/i" = "C:\Files\Installer.msi";
}

然后我调用 Start-Process:

Start-Process -FilePath msiexec.exe -ArgumentList @InstallerArgs -Wait

这将返回错误:缺少参数“ArgumentList”的参数。指定类型为“System.String[]”的参数,然后重试。

Start-Process 不能使用 splatting 吗?

最佳答案

Splatting ( @<varName> )不支持作为参数(参数);相反,展开的哈希表本身代表一组参数名称-值对

Olaf's helpful answer相比之下,演示了 splatting 的正确使用,其中哈希表包含 Start-Process 的参数名称-值对。 作为一个整体,传递到- msiexecArgumentList 中指定为数组的参数哈希表条目。

如果您只想维护传递给- msiexec一个单独的数据结构中的参数,使用一个数组按原样传递,假设-ArgumentList确实需要一个字符串 array 作为它的参数([string[]]):

$InstallerArgs = @(
"DATABASENAME=my_database"
"LOCALIP=127.0.0.1"
"USERNAME=username1"
"/i"
"C:\Files\Installer.msi"
)

# Note: NO splatting
Start-Process -FilePath msiexec.exe -ArgumentList $InstallerArgs -Wait

上面的代码最终执行了以下命令:

msiexec.exe DATABASENAME=my_database LOCALIP=127.0.0.1 USERNAME=username1 /i C:\Files\Installer.msi

请注意,由于一个长期存在的错误任何需要双引号的值 - 通常,因为它们嵌入了空格 - 还必须明确指定嵌入、转义双引号 ( `" );例如,

"`"C:\Files A\Installer.msi`""

这将导致 msiexec ... "C:\Files A\Installer.msi"通过。

从 PowerShell [Core] 7.0 开始,该问题仍然存在,并且可能永远无法修复以保持向后兼容性。但是,可以提供一个新参数来提供正确的行为 - 请参阅 GitHub issue #5576 .


注意使用外部程序重新拼接:

当使用哈希表(而不是数组)展开时,PowerShell 将哈希表条目转换为
-<key>:<value>参数
- 注意 : - 适用于 PowerShell 命令,但可能不符合外部实用程序预期的参数语法,例如 msiexec .
GitHub issue #9343建议将格式更改为用 空格 分隔(使用单独的参数;-<key> <value>)。

一个简单的例子:

# Define hashtable with parameter name-value pairs.
$htParams = @{
foo = 'bar none' # parameter -foo with value 'bar none'
}

# Pass the hashtable via splatting (note the use of @ instead of $).
baz.exe @htParams

baz.exe然后会看到以下参数:

-foo:"bar none"

关于powershell - Splatting 哈希表 - Start-Process -ArgumentList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49011281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com