2009-03-26 33 views
48

tôi muốn bao gồm các file kịch bản với cú pháp giả như:Bao gồm các file tương đối trong PowerShell

Include '.\scripA.ps1' 

Nhưng điều duy nhất tôi đã tìm thấy một số điều như thế này:

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 
. ($thisScript + '.\scriptA.ps1') 

đó là xấu xí .

Có một số đẹp cách để bao gồm tập lệnh có đường dẫn tương đối không?

+2

PowerShell xấu xí – tofutim

Trả lời

11

Thật không may, không có cách nào tốt. PowerShell không thực sự hỗ trợ ý tưởng này rất tốt trong V1. Thực sự cách tiếp cận bạn đang thực hiện là cách tiếp cận tốt nhất là

+0

Và v2 thì sao? Tôi có nên sử dụng Mô-đun cho tập lệnh ngoài và cú pháp "Nhập-Mô-đun ./foo.psm1" không? Hoặc bất kỳ cải tiến nào cho việc bao gồm các tập lệnh thông thường? – alex2k8

+0

@ alex2k8, tôi chưa làm nhiều việc với V2 nhưng tôi không thể giúp quá nhiều.Tôi biết rằng các mô-đun có nghĩa vụ phải được cô lập hơn nhiều so với các kịch bản nhưng khác hơn là tôi không có nhiều dữ liệu. – JaredPar

+0

Trong v2, bạn có thể sử dụng một mô-đun có tệp kê khai xác định tất cả các mô-đun, tập lệnh và thậm chí cả các snap/cụm. Một lợi ích tốt đẹp của việc này là bạn có thể có các hàm và các biến riêng tư cho mô-đun. – JasonMArcher

27

Bạn có thể tạo nguồn (bao gồm) tệp:

. . \ ScriptA.ps1

Để có được đường dẫn đầy đủ của kịch bản:.

Resolve-Path \ scriptA.ps1

+0

Không, tính năng này hoạt động cho đến khi vị trí tập lệnh chính bằng pwd. – alex2k8

+1

Phần đầu tiên ... nhưng Resolve-Path sẽ kiểm tra thư mục hiện tại và đường dẫn của bạn cho tệp. Nếu thư mục script của bạn nằm trong đường dẫn của bạn ($ env: path), nó sẽ tìm thấy nó. –

+0

Thnaks guys, tôi nên đề cập đến vị trí chữa bệnh. –

20

Dot-sourcing là lựa chọn đơn giản nhất mặc dù không đặc biệt xinh đẹp, như đã nêu. Tuy nhiên, định dạng này làm cho nó chỉ là một chút chút bụi:

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path 
. (Join-Path $ScriptDirectory ScriptA.ps1) 

Ngoài ra, một lưu ý về đường dẫn tương đối đó là hữu ích để làm cho rõ ràng: các bài bản gốc có thể dường như ngụ ý muốn một con đường tương đối so với hiện tại thư mục hoạt động; trong thực tế, ý định là liên quan đến thư mục nguồn của tập lệnh hiện tại hiện tại (như mẫu mã của riêng alex2k8 cho biết). Do đó, điều này cho phép tập lệnh hiện tại truy cập các tập lệnh khác từ cùng một kho lưu trữ.

4

Tính đến V2 (có nguồn gốc bắt đầu với Win7/2008R2, xem $psversiontable.psversion), bạn có thể dễ dàng bao gồm một tập tin như vậy:

. "RelativeOrAbsolutePathToFile\include.ps1" 

$result = FunctionInIncludeFile() 

tham khảo:
How to reuse windows powershell functions in scripts

+6

Theo như tôi có thể nói, vấn đề với điều này là dòng dot-source được đánh giá tương đối so với thư mục làm việc hiện tại, chứ không phải là liên quan đến tập lệnh chứa dòng dot-source. Vì vậy, nếu bạn 'cd' vào thư mục có chứa các tập lệnh đầu tiên nó hoạt động, nhưng nếu bạn gọi nó từ một thư mục khác nó không. –

+0

Đó có thể là do thiết kế, cảm ơn cho bình luận dù bạn đời! –

71

Bạn có thể sử dụng các tham số $ PSScriptRoot như thế này:

. "$PSScriptRoot\script.ps1" 
+4

Đây là câu trả lời duy nhất hoạt động – Richard

+0

Giải pháp đủ sạch phù hợp với tôi! – Omar

0

Điều này có thể hoạt động từ bất kỳ thư mục nào, nhưng nó sẽ là một slooo ooowwwww tìm thấy nếu thư mục bắt đầu của bạn không phải là thư mục tiền tố trực tiếp của tệp bạn đang cố gắng đưa vào. IOW, nếu điểm bắt đầu của bạn cho tìm kiếm này là gốc của c: \ hoặc một số ký tự ổ đĩa khác, điều này có thể sẽ rất chậm.

. $ (Resci-Path -literal $ (gci -Recurse include.ps1))

Điều này sẽ làm việc đặc biệt tốt nếu bạn đang phát triển các kịch bản trên máy tính của bạn nhưng cần triển khai chúng vào máy chủ sẽ chạy kịch bản một tác vụ được lên lịch.

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