2012-01-24 34 views

Trả lời

2

Với PowerShell, bạn có thể thực thi tập lệnh dưới dạng lệnh nếu chúng được đặt trong thư mục chứa trong biến môi trường 'PATH'. Để xem những gì các thư mục đang trong Path, bạn có thể sử dụng:

$env:Path -split ';'| sort 

Bạn có thể thay đổi con đường vĩnh viễn khỏi Windows System Properties để bao gồm các vị trí của các kịch bản của bạn, hoặc bạn có thể tạm thời thay đổi con đường từ bên trong hồ sơ của bạn hoặc tập lệnh. Trong trường hợp cụ thể của bạn, bạn có thể thêm dòng sau vào hồ sơ của bạn để thêm các thư mục hồ sơ đến đường dẫn:

$ScriptRoot = Split-Path $SCRIPT:MyInvocation.MyCommand.Path 

if(($env:Path -split ';') -notcontains $ScriptRoot) { 
    $env:Path += ';' + $ScriptRoot 
} 

Sau đó bạn có thể chạy lệnh như:

PS >$timer = New-Object Timers.Timer 
PS >Register-TemporaryEvent $timer Disposed { [Console]::Beep(100,100) } 

Lưu ý: Khi tab hoàn thành, nó sẽ hoàn thành như Register-TemporaryEvent.ps1, nhưng bạn có thể xóa '.ps1' và nó sẽ vẫn hoạt động.

+0

Điều đó vẫn đúng? Tôi có một thư mục trong tệp PATH của tôi với tệp .ps1 trong đó, phần mở rộng .ps1 trong PATHEXT của tôi và khi tôi cố gắng gọi tập lệnh theo tên của nó, tôi nhận được "Thuật ngữ 'foo' không được công nhận là tên của cmdlet, chức năng, tập lệnh hoặc hoạt động chương trình. " (nhưng nó hoạt động từ một dấu nhắc cmd) – zneak

+0

Nó luôn luôn làm việc cho tôi trong tất cả các phiên bản PowerShell từ v2 đến v5. Nếu bạn nhập '$ env: PATH' vào dấu nhắc powerhell, bạn có thấy thư mục đó không? Có thể PATH không được thêm vĩnh viễn hoặc explorer.exe chưa được khởi động lại vì PATH đã được thay đổi. Ngoài ra, .ps1 không cần phải ở trong PATHEXT để gọi kịch bản từ PowerShell. – Rynant

2

Bạn có thể lấy nội dung của tệp tập lệnh, kèm theo nó trong một hàm và gọi mã để tạo hàm.

$sb = Get-Content .\script.ps1 | Out-String 
Invoke-Expression "function Register-TemporaryEvent {`n $sb `n} " 
Các vấn đề liên quan