我有一个PowerShell脚本:
param (
[Parameter(Mandatory=$true)][string]$input,
[Parameter(Mandatory=$true)][string]$table
)
Write-Host "Args:" $Args.Length
Get-Content $input |
% { [Regex]::Replace($_, ",(?!NULL)([^,]*[^\d,]+[^,]*)", ",'`$1'") } |
% { [Regex]::Replace($_, ".+", "INSERT INTO $table VALUES (`$1)") }
Write-Host part
用于调试
我将它作为.\csvtosql.ps1 mycsv.csv dbo.MyTable
运行(来自powershell shell),然后获取
Args: 0
Get-Content : Cannot bind argument to parameter 'Path' because it is an empty s
tring.
At C:\temp\csvtosql.ps1:7 char:12
+ Get-Content <<<< $input |
+ CategoryInfo : InvalidData: (:) [Get-Content], ParameterBinding
ValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAl
lowed,Microsoft.PowerShell.Commands.GetContentCommand
对于我传递的任何参数,我得到完全相同的错误,如果我尝试使用命名参数,也会出现相同的错误。
什么可能导致参数无法传入?
更新:PowerShell ISE使用GUI提示向我询问这些参数,然后给出了关于它们未被传入的相同错误。
答案 0 :(得分:5)
除非您使用ValueFromRemainingArguments属性标记了一个参数(指示cmdlet参数是否接受与此参数关联的所有剩余命令行参数),否则Args将被“禁用”。如果您只需要参数count,则调用特殊变量:
$PSBoundParameters.Count
答案 1 :(得分:2)
答案 2 :(得分:-1)
您使用位置参数调用脚本(即未命名),PowerShell不知道如何将它们映射到脚本参数。您需要使用参数名称调用脚本:
.\csvtosql.ps1 -input mycsv.csv -table dbo.MyTable
或更新您的脚本以指定您首选的位置参数顺序:
param (
[Parameter(Mandatory=$true,Position=0)]
[string]
$input,
[Parameter(Mandatory=$true,Position=1)]
[string]
$table
)