2012-06-13 95 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'。 –