gpt4 book ai didi

powershell - Windows PowerShell 脚本如何将其参数传递给另一个脚本调用?

转载 作者:行者123 更新时间:2023-12-02 23:31:02 25 4
gpt4 key购买 nike

简而言之,我只是在寻找相当于批处理文件如何使用相同参数调用脚本的 PowerShell ......

"%~dpnx0" %*

...哪里 "%~dpnx0"扩展到脚本的绝对路径和 %*扩展到参数列表。有没有简单的方法可以复制 %* ?或者,至少,一种有效的方式?

我有一个使用 System.Data.OleDb 的 PowerShell 脚本从 Excel 读取数据的命名空间工作簿。由于没有 Microsoft Jet 提供程序的 64 位实现,脚本需要从 32 位 PowerShell session 运行。如果脚本是从 64 位 session 运行的,那么与其简单地让脚本失败并显示错误消息,不如让 64 位 session 调用该脚本并从 32 位 session 中检索结果。我发现这可以使用 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;
}

...但是当我运行时 .\Test.ps1 'string' 12345从 64 位 session 中,它显示...
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 .我不确定为什么这不起作用或还有什么可尝试的。

最佳答案

这可能看起来有点奇怪,但是:

param(
[String] $stringArg,
[Int32] $int32Arg
)

if ([IntPtr]::Size -gt 4)
{
[String] $scriptPath = $MyInvocation.MyCommand.Path;

$params = @()
$psboundparameters.keys |
foreach {
$params += "-$($_)"
$params += $psboundparameters.$_
}


$sb = [scriptblock]::Create(@"
&'$scriptpath' $params
"@)

[Object] $job = Start-Job -scriptblock $sb -RunAs32
$job | Wait-Job | Receive-Job;
}
else
{
Get-Date
}

关于powershell - Windows PowerShell 脚本如何将其参数传递给另一个脚本调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9930229/

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