2012-06-13 31 views
6

Tôi có một kịch bản PowerShell:Powershell: args/params không được phổ biến

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)") } 

Các Write-Host part là để gỡ lỗi.
tôi chạy nó như .\csvtosql.ps1 mycsv.csv dbo.MyTable (từ vỏ PowerShell), và nhận được

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 

tôi nhận được chính xác những lỗi tương tự với bất kỳ thông số mà tôi vượt qua, cũng là lỗi tương tự nếu tôi cố gắng sử dụng tên thông số.

Điều gì có thể khiến thông số không được chuyển vào?

CẬP NHẬT:. PowerShell ISE hỏi tôi cho các thông số sử dụng nhắc nhở GUI, sau đó mang lại cho tôi những lỗi tương tự về họ không được thông qua tại

Trả lời

2
+0

Ok, '$ args' chỉ để gỡ lỗi vì lợi ích, nhưng bạn nói đúng, chúng không hoạt động, như những câu trả lời của người khác. –

+0

Bây giờ đầu vào '$' là đặc biệt là lý do cho vấn đề của tôi. Cảm ơn rất nhiều! –

4

Trừ khi bạn đánh dấu một tham số với các thuộc tính ValueFromRemainingArguments (cho biết cmdlet tham số chấp nhận tất cả các đối số dòng lệnh còn lại được liên kết với tham số này), Args là "disabled". Nếu tất cả bạn cần là các đối số đếm gọi biến đặc biệt:

$PSBoundParameters.Count 
+0

+1 Ok, bạn đã có các phím tắt ngay. – JPBlanc

+0

Cảm ơn bạn @JPBlanc :) –

+0

Cảm ơn, điều đó rất hữu ích trong việc xác định các tham số hoạt động. Khi nó bật ra, vấn đề của tôi là với '$ input' có ý nghĩa riêng. –

-1

Bạn đang gọi tập lệnh của mình với thông số vị trí (tức là chưa đặt tên) và PowerShell không biết cách ánh xạ chúng tới thông số tập lệnh của bạn. Bạn cần phải hoặc gọi kịch bản của bạn bằng cách sử dụng tên thông số:

.\csvtosql.ps1 -input mycsv.csv -table dbo.MyTable 

hoặc cập nhật kịch bản của bạn để xác định thứ tự ưu tiên của bạn tham số vị trí:

param (
    [Parameter(Mandatory=$true,Position=0)] 
    [string] 
    $input, 

    [Parameter(Mandatory=$true,Position=1)] 
    [string] 
    $table 
) 
+0

Không cần thiết, mặc định cho các vị trí dựa trên thứ tự trong danh sách 'param'. Kịch bản của tôi thực sự hoạt động mà không có 'Vị trí' miễn là tôi không đặt tên cho tham số' $ input' của mình. –

Các vấn đề liên quan