2012-06-13 64 views
6

我有一个PowerShell脚本:PowerShell的:参数数量/ PARAMS不填充

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的外壳),并获得

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 

我得到完全相同的错误与我传递任何参数,也同样的错误,如果我尝试使用命名参数。

什么会导致参数不被传入?

UPDATE:PowerShell的ISE问我这些参数使用GUI提示,然后给了我同样的错误对他们没有被传递

回答

2
+0

好的,'$ args'只是为了调试,但是你是对的,根据其他人的回复他们根本无法工作。 –

+0

现在'$ input'是特殊的是我的问题的原因。非常感谢! –

4

除非你打上ValueFromRemainingArguments属性的参数(表示是否该cmdlet参数接受与此参数关联的所有其余命令行参数),Args被“禁用”。如果你需要的是参数计算调用特殊的变量:

$PSBoundParameters.Count 
+0

+1好吧,你有正确的快捷方式。 – JPBlanc

+0

谢谢@JPBlanc :) –

+0

谢谢,这有助于确定参数的工作。事实证明,我的问题是'$ input'具有保留意义。 –

-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 
) 
+0

这是没有必要的,默认的头寸是基于'参数列表中的订单。只要我没有命名我的参数'$ input',我的脚本实际上没有'Position'。 –