7

我有一个 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 提示向我询问这些参数,然后给我同样的错误,关于它们没有被传入。

4

3 回答 3

5

除非您使用 ValueFromRemainingArguments 属性标记参数(指示 cmdlet 参数是否接受与此参数关联的所有剩余命令行参数),否则 Args 将“禁用”。如果您只需要参数计数,请调用特殊变量:

$PSBoundParameters.Count
于 2012-06-13T07:28:05.470 回答
3
于 2012-06-13T07:32:07.723 回答
-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
)
于 2012-06-13T14:35:07.960 回答