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

时间:2018-02-12 20:20:49

标签: powershell parameter-passing splat

我试图用paramaters来完成这项工作

    $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

当我试图查看问题时,我得到了错误

  

无法将参数绑定到参数'emailPasswordPath',因为它是一个空字符串。       + CategoryInfo:InvalidData:(:) [DownloadInformation.ps1],ParameterBindingValidationException       + FullyQualifiedErrorId:ParameterArgumentValidationErrorEmptyStringNotAllowed,DownloadInformation.ps1       + PSComputerName:localhost

帮助

2 个答案:

答案 0 :(得分:2)

您正在寻找的是splatting:能够通过哈希表(或者,通用数组,通过数组)将一组参数值传递给命令

通常,为了表示意图splat ,需要特殊符号 - @,以便将它与恰好恰好是哈希表的单个参数区分开来:

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

  • @args1 - 请注意sigil $如何替换为@ - 告诉PowerShell应用 splatting ,即考虑哈希表&# 39; s键值对是参数名称 - 值对(请注意,哈希表键不能以-开头,这是暗示的)

但是,splatting只能直接为给定命令工作你不能通过命令的单个参数中继一个splatted哈希表
也就是说,尝试使用-ArgumentList @args1实际失败

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

另一种解决方案是使用散列表参数在脚本块中应用splatting

$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
}   

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

如果无法修改输入哈希表的键,则可以使用以下命令创建其键已删除_a1后缀的修改后的副本:

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

答案 1 :(得分:1)

我更改了public class SeperateDuplicates { public static void main(String[] args) { System.out.println(seperateDuplicatesChars("Hello")); /*System.out.println(seperateDuplicatesChars("Bookkeeper")); System.out.println(seperateDuplicatesChars("Yellowwood door")); System.out.println(seperateDuplicatesChars("Chicago Cubs")); */ } public static String seperateDuplicatesChars(String str) { char[] arr = new char[str.length()]; for(int i = 0; i < arr.length; i++) { arr[i] = str.charAt(i); } int counter = 0; for(int i = 0; i < arr.length; i++) { counter++; if(arr[i] == arr[i+1]) { counter++; } } } 中的参数,因此需要哈希表

$courses