2012-02-07 47 views
7

Đây là mã của tôi:PowerShell vượt qua đối số dòng lệnh

$script={ 
Write-Host "Num Args:" $args.Length; 
    Write-Host $args[0] 
} 

Invoke-Command -ScriptBlock $script 

Khi tôi chạy

powershell.exe .\test.ps1 one two three 

tôi đã

Num Args: 0 

tôi nghĩ rằng tôi sẽ nhận được

Num Args: 3 
One 

Tôi đang thiếu cái gì?

Cảm ơn

Trả lời

7

Bạn thực sự có hai phạm vi đó. Mức kịch bản và mức khối tập lệnh. $args.Length$args[0] sẽ có những gì bạn mong đợi ở mức Invoke-Command. Bên trong khối tập lệnh có một phạm vi khác cho $args. Để có được các arg từ dòng lệnh tất cả các cách vào khối kịch bản bạn sẽ cần phải truyền lại chúng từ Invoke-Command -ArgumentList $args.

4

Bạn cần phải vượt qua các đối số cho scriptblock:

Invoke-Command -ScriptBlock $script -ArgumentList $args 
0

Bạn cũng có thể khai báo các thông số được đặt tên một cách rõ ràng. Ví dụ:

param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")

này cho phép bạn vượt qua trong lập luận được ghi tên vào kịch bản của bạn, giống như ví dụ sau:

.\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"

và nếu bạn bỏ qua -nameOfSomething "Slayer Roolz!", sau đó $nameOfSomething sẽ chỉ đơn giản là mặc định "some default sting". Tương tự, $someBoolSwitch mặc định là $false trừ khi được xác định khác.

Phương pháp này có lợi cho phép bạn làm nhà phát triển để quyết định tham số nào là cần thiết và những thông số nào có thể bị bỏ qua hoặc được mặc định. Hơn nữa, nó cho phép người dùng nhập các đối số theo bất kỳ thứ tự nào họ thích, vì chúng được đặt tên và không có vị trí.

Một hạn chế đối với các tham số được đặt tên thay vì tham số vị trí là lời gọi dòng lệnh có thể trở nên khá lớn vì người dùng phải nhập vào từng tên thông số.

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