绑定参数时出现空字符串错误 - 间接展开

empty string error when binding parameters - indirect splatting

我正在尝试 运行 使用参数来完成这项工作

    $courses =  { 
            param($securitytoken_path_a1  ,$EmailPasswordPath_a1 ,$EmailTo_a1)
            Write-Host $securitytoken_path_a1 | Format-Table -Property *
            C:\Users\so\Desktop\CanvasColleagueIntergration\PowerShells\DownloadInformation.ps1 -securitytoken_path ($securitytoken_path_a1) -emailPasswordPath $EmailPasswordPath_a1 -object "courses" -EmailTo $EmailTo_a1 -test $false
            }

我正在传递这些参数

$args1 = @{ "securitytoken_path_a1"  = "C:\Credentials\CANVAS_API_PROD_FRANCO.TXT" ; "EmailPasswordPath_a1" = "C:\Credentials\EMAILFRANCO.txt"; "EmailTo_a1" = 'fpettigrosso@holyfamily.edu'}

当我使用此命令调用作业时它失败了

Start-Job -ScriptBlock $courses -Name "Test" -ArgumentList $args1

当我尝试查看问题所在时,我得到了错误提示

Cannot bind argument to parameter 'emailPasswordPath' because it is an empty string. + CategoryInfo : InvalidData: (:) [DownloadInformation.ps1], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,DownloadInformation.ps1 + PSComputerName : localhost

帮助

我更改了 $courses 中的参数,因此它需要一个哈希表

$courses =  { 
            param($a1)
            Write-Host $a1.securitytoken_path_a1 | Format-Table -Property *
            C:\Users\fpettigrosso\Desktop\CanvasColleagueIntergration\PowerShells\DownloadInformation.ps1 -securitytoken_path $a1.securitytoken_path_a1 -emailPasswordPath $a1.EmailPasswordPath_a1 -object "courses" -EmailTo $a1.EmailTo_a1 -test $false
            }

您正在寻找的是 splatting:通过 哈希表 (或者不太常见的通过数组)传递一组参数值的能力一个命令。

通常,为了表明 splat 的意图,特殊印记 - @ 是必需的,以便将其与恰好是哈希表的单个参数区分开来:

  • $args1 传递一个 单个 参数,恰好是哈希表。

  • @args1 - 注意印记 $ 是如何被 @ 替换的 - 告诉 PowerShell 应用 splatting,即,将哈希表的键值对视为参数名称值对(请注意,哈希表键不能以 - 开头,这是隐含的)

但是,splatting 只对给定的命令直接有效,你不能中继 splatted hashtable命令的单个参数.
也就是说,尝试使用 -ArgumentList @args1 实际上 失败 .

通过按原样将哈希表传递给脚本块然后显式地逐一访问该哈希表的条目来解决这个问题。

另一种解决方案是使用哈希表参数在脚本块内应用散列:

$courses = { 
  param([hashtable] $htArgs) # pass the hashtable - to be splatted later - as-is
  $script = 'C:\Users\fpettigrosso\Desktop\CanvasColleagueIntergration\PowerShells\DownloadInformation.ps1'
  & $script @htArgs  # use $htArgs for splatting
}   

但是请注意,target 命令的参数名称必须与哈希表键完全匹配(或作为明确的前缀,但这是不明智的),因此 _a1 后缀必须从键中删除。

如果修改输入哈希表的键不是一个选项,您可以使用以下命令创建一个修改后的副本,其键删除了 _a1 后缀:

# Create a copy of $args1 in $htArgs with keys without the "_a1" suffix.
$args1.Keys | % { $htArgs = @{} } { $htArgs.($_ -replace '_a1$') = $args1.$_ }