2011-02-02 33 views
9

Từ một kịch bản PowerShell, làm thế nào tôi có thể xác định xem kịch bản đã được chấm có nguồn gốc, tức là nó đã được gọi vớiXác định nếu PowerShell kịch bản đã được dot-sourced

. .\myscript.ps1 

hơn

.\myscript.ps1 

LƯU Ý một bài đăng blog thú vị (cũng) về vấn đề này: http://poshoholic.com/2008/03/18/powershell-deep-dive-using-myinvocation-and-invoke-expression-to-support-dot-sourcing-and-direct-invocation-in-shared-powershell-scripts/

Trả lời

12

Kiểm tra $ myinvocation.line Nó sẽ hiển thị dòng được sử dụng để gọi kịch bản.

PS C:\scripts\test> gc test.ps1 
$myinvocation.line 

PS C:\scripts\test> ./test.ps1 
./test.ps1 

PS C:\scripts\test> . ./test.ps1 
. ./test.ps1 

Bạn cũng có thể kiểm tra thuộc tính .invocationname. Nếu kịch bản có dấu chấm, nó sẽ chỉ là một dấu chấm. Nếu không được, là sẽ ./scriptname.ps1

+2

Cảm ơn, InvocationName chính xác là những gì tôi đang tìm kiếm. –

+0

Tên .Invocationname có vẻ tốt nhất, với "line" ký tự đầu tiên có thể là dấu chấm có đường dẫn tương đối .. \ test.ps1 khi NOT dot surce, hoặc khi dấu chấm có nguồn gốc ký tự tiếp theo có thể không phải là dấu cách. (parens, quotes, $ (etc) Sau đó, thêm @ mklement0 ngoại lệ – HerbM

5

Để bổ sung mjolinor's helpful answer:

tl; dr

$isDotSourced = $MyInvocation.InvocationName -eq '.' -or $MyInvocation.Line -eq '' 

Trong khi $MyInvocation.InvocationName -eq '.'chủ yếu cho bạn biết liệu một kịch bản nhất định là có nguồn gốc từ chấm, có một số ngoại lệ:

[Áp dụng như ít nhất PowerShell v3]
Khi bạn chạy một kịch bản từ Visual Studio Mã hoặc PowerShell ISE với Debug > Run/Continue (F5), nó là ngầm nguồn gốc, nhưng $MyInvocation.InvocationName chứa tên tệp toàn tập lệnh thay vì . Tuy nhiên, bạn có thể phát hiện trường hợp này bằng cách kiểm tra xem $MyInvocation.Line có phải là trống hay không.

+1

Tuyệt vời, tôi đã dành nhiều thời gian để xác định điều này từ LINE (do tất cả các loại ngoại lệ lạ) và các bạn có nó đơn giản và thậm chí ngoại lệ này Tôi không biết aobut. Thx – HerbM

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