【发布时间】:2026-01-29 19:40:01
【问题描述】:
简而言之,我只是在寻找 PowerShell 等价物,即批处理文件如何调用具有相同参数的脚本...
"%~dpnx0" %*
...其中"%~dpnx0" 扩展为脚本的绝对路径,%* 扩展为参数列表。有没有一种简单的方法可以复制%*?或者,至少,一种可行的方式?
我有一个 PowerShell 脚本,它使用 System.Data.OleDb 命名空间从 Excel 工作簿中读取数据。因为没有 Microsoft Jet 提供程序的 64 位实现,所以脚本需要从 32 位 PowerShell 会话运行。如果脚本是从 64 位会话运行的,则不是简单地让脚本失败并显示错误消息,而是让 64 位会话调用脚本并从 32 位会话中检索结果。我发现这可以使用Start-Job cmdlet 和-RunAs32 开关来完成,但是我无法为-ArgumentList 参数提供值。
我想出了以下方法来搜索具有值的脚本参数并从中构建命令行:
function GetValueText([Object] $value)
{
[String] $text = if ($value -eq $null) {
'$null';
} elseif ($value -is [String]) {
"'$value'";
} elseif ($value -is [Array]) {
'@({0})' -f (($value | ForEach-Object { GetValueText $_ }) -join ', ');
} else {
"$value";
}
return $text;
}
if ([IntPtr]::Size -gt 4)
{
[String] $scriptPath = $MyInvocation.MyCommand.Path;
[String[]] $parameters = @(
$MyInvocation.MyCommand.Parameters.Keys `
| ForEach-Object {
[Object] $parameterValue = Get-Variable -Name $_ -ValueOnly;
if ($parameterValue -ne $null)
{
[String] $parameterValueText = GetValueText $parameterValue;
'-{0}' -f $_;
$parameterValueText;
}
}
);
[Object] $job = Start-Job -FilePath $scriptPath -RunAs32 -ArgumentList $parameters;
[Object[]] $data = $job | Wait-Job | Receive-Job;
$data;
}
else
{
# Retrieve data...
}
当它到达Start-Job 行时,它会生成带有消息"Cannot convert value "-Argument1" to type "System.Int32[]"" 的错误。 -Argument1 是脚本的第一个参数,类型为[Int32[]],那么这是否意味着-ArgumentList 只适用于位置参数而不是命名参数?
我也尝试将其简化为...
param(
[String] $stringArg,
[Int32] $int32Arg
)
$PSBoundParameters;
if ([IntPtr]::Size -gt 4)
{
[String] $scriptPath = $MyInvocation.MyCommand.Path;
[Object] $job = Start-Job -FilePath $scriptPath -RunAs32 -ArgumentList @PSBoundParameters;
$job | Wait-Job | Receive-Job;
}
else
{
Get-Date;
}
...但是当我从 64 位会话运行 .\Test.ps1 'string' 12345 时,它会显示...
Key Value
--- -----
stringArg string
int32Arg 12345
Start-Job : Missing an argument for parameter 'ArgumentList'. Specify a parameter of type 'System.Object[]' and try again.
At X:\Test.ps1:11 char:72
+ [Object] $job = Start-Job -FilePath $scriptPath -RunAs32 -ArgumentList <<<< @PSBoundParameters;
+ CategoryInfo : InvalidArgument: (:) [Start-Job], ParameterBindingException
+ FullyQualifiedErrorId : MissingArgument,Microsoft.PowerShell.Commands.StartJobCommand
...所以@PSBoundParameters 似乎评估为$null。我不确定为什么这不起作用或还有什么可以尝试的。
【问题讨论】:
标签: powershell parameters parameter-passing powershell-2.0 32bit-64bit