2012-12-05 31 views
29

My Powershell kịch bản, Foo.ps1:Làm thế nào để chạy một kịch bản Powershell từ dòng lệnh và thông qua một thư mục như một tham số

Function Foo($directory) 
{ 
    echo $directory 
} 

if ($args.Length -eq 0) 
{ 
    echo "Usage: Foo <directory>" 
} 
else 
{ 
    Foo($args[0]) 
} 

Từ Windows console:

powershell -command .\Foo.ps1 

Kết quả trong: "Thuật ngữ '. \ Foo.ps1' không được nhận dạng là tên của lệnh ghép ngắn, hàm, tệp kịch bản hoặc chương trình có thể hoạt động. Hãy kiểm tra chính tả tên hoặc nếu đường dẫn được bao gồm, hãy xác minh rằng đường dẫn là chính xác và thử lại."

Điều này mặc dù Foo.ps1 nằm trong thư mục hiện tại từ nơi tôi đang gọi Powershell. Sau đó tôi đã cố gắng gọi nó là chỉ định đường dẫn đầy đủ đến tệp kịch bản lệnh; bởi vì con đường này chứa một không gian tôi tin rằng tôi phải trích dẫn nó theo một cách nào đó. Ngoài ra tôi cần phải vượt qua một đối số cho kịch bản đó cũng là một tên tập tin có chứa một hoặc nhiều không gian. Không có vấn đề gì tôi cố gắng tôi không thể làm cho nó hoạt động. Đây là tôi đoán tốt nhất cho đến nay:

powershell -command "'C:\Dummy Directory 1\Foo.ps1' 'C:\Dummy Directory 2\File.txt'" 

Mà cho lỗi "token bất ngờ. 'C: \ Dummy mục 2 \ File.txt' trong biểu hoặc tuyên bố Tại dòng: 1 char: 136".

Edit: Tôi đã làm việc ra sao

powershell -command .\Foo.ps1 

đã không làm việc. Đây là bởi vì tập tin Microsoft.PowerShell_profile.ps1 tôi đã

cd C: \

càng sớm càng PowerShell được khởi động nó đã được thay đổi thư mục.

+1

Bạn cũng có thể sử dụng -NoProfile khi bạn gọi PowerShell từ cmd. – user467384

Trả lời

26

thử điều này:

powershell "C:\Dummy Directory 1\Foo.ps1 'C:\Dummy Directory 2\File.txt'" 
+0

@ShellShock Tôi đã chỉnh sửa câu trả lời của mình để xóa '.' (chấm tìm nguồn cung ứng) vì vô ích trong trường hợp này. –

+1

Nó không hoạt động: Xin tuân theo nhận xét mới nhất của tôi về: http://stackoverflow.com/questions/20804065/calling-powershell-function-from-command-line/20804221?noredirect=1#comment48796361_20804221 –

+0

@ ch.smrutiranjanparida Xin lỗi nhưng tôi không hiểu những gì không hoạt động. Tránh nhận xét về vấn đề mã hóa và đăng câu hỏi mới với thông tin chi tiết về lỗi của bạn. Chúc may mắn! –

26

bạn đang gọi một tập tin kịch bản không phải là một lệnh, do đó bạn phải sử dụng -file ví dụ:

powershell -executionPolicy bypass -noexit -file "c:\temp\test.ps1" "c:\test with space" 

cho PS V2

powershell.exe -noexit &'c:\my scripts\test.ps1' 

(kiểm tra phần dưới của trang kỹ thuật này http://technet.microsoft.com/en-us/library/ee176949.aspx)

+3

Lệnh đầu tiên cũng hoạt động trong phiên bản V2. –

+0

cảm ơn bạn đã chính xác –

+0

Sổ tay của chủ sở hữu Windows PowerShell 1.0 đã được gỡ bỏ. Để biết nội dung cập nhật nhất của Windows PowerShell, hãy truy cập https://msdn.microsoft.com/en-au/powershell/scripting/core-powershell/console/powershell.exe-command-line-help#-file -filepath-parameters –

2

Thay đổi mã của bạn như sau:

Function Foo($directory) 
    { 
     echo $directory 
    } 

    if ($args.Length -eq 0) 
    { 
     echo "Usage: Foo <directory>" 
    } 
    else 
    { 
     Foo([string[]]$args) 
    } 

Và sau đó gọi nó là:

PowerShell -ExecutionPolicy RemoteSigned -File "c: \ foo.ps1" "c: \ Documents and Cài đặt" 'c: \ test'

14

Sử dụng cờ -Command bạn có thể thực hiện toàn bộ dòng powershell của bạn như thể nó là một lệnh trong cửa sổ PowerShell:

powershell -Command "& '<PATH_TO_PS1_FILE>' '<ARG_1>' '<ARG_2>' ... '<ARG_N>'" 

Điều này giải quyết được sự cố của tôi khi chạy lệnh PowerShell trong Visual Studio Post-Build và Pre-Build events.

2

Thêm declation param ở phía trên cùng của tập tin ps1

test.ps1

param(
    # Our preferred encoding 
    [parameter(Mandatory=$false)] 
    [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")] 
    [string]$Encoding = "UTF8" 
) 

write ("Encoding : {0}" -f $Encoding) 

kết quả

C:\temp> .\test.ps1 -Encoding ASCII 
Encoding : ASCII 
Các vấn đề liên quan