2014-06-26 19 views
9

Tôi có các biến toàn cầu và muốn sử dụng chúng trong một hàm.PowerShell Biến toàn cục biến cục bộ

Tôi không sử dụng biến cục bộ có cùng tên trong các hàm!

# global vars: 
$Var1 = @{ .. } 
$Var2 = @(..) 
function testing{ 
    $Var1.keyX = "kjhkjh" 
    $Var2[2] = 6.89768 
} 

tôi làm điều đó và nó hoạt động, nhưng nó an toàn hay tôi phải sử dụng:

$Global:Var1.keyX = "kjhkjh" 

Cảm ơn, Gooly

Trả lời

20

Trong chức năng của bạn, bạn đang sửa đổi nội dung của hashtable do đó không cần sử dụng $ global trừ khi hàm của bạn (hoặc hàm gọi giữa hàm của bạn và phạm vi toàn cục) xảy ra có biến cục bộ $ Var1 và $ Var2 (BTW không phải là bạn thiếu $). Nếu đây là tất cả các mã của riêng bạn sau đó tôi muốn nói để lại nó như là. Tuy nhiên, nếu mã của bạn cho phép mã của người khác gọi hàm của bạn, thì tôi sẽ sử dụng trình chỉ định $global:Var1 để đảm bảo bạn đang truy cập biến toàn cục và không vô tình truy cập vào biến có cùng tên trong hàm đang gọi hàm của bạn .

Một điều cần biết về Phạm vi năng động trong PowerShell là khi bạn gán giá trị cho biến trong một hàm và biến điều đó xảy ra là một ví dụ toàn cầu:

$someGlobal = 7 
function foo { $someGlobal = 42; $someGlobal } 
foo 
$someGlobal 

PowerShell sẽ làm một "copy-on -write "hoạt động trên biến $ someGlobal trong hàm. Nếu mục đích của bạn là thực sự sửa đổi toàn cầu thì bạn sẽ sử dụng thông số $global::

$someGlobal = 7 
function foo { $global:someGlobal = 42; $someGlobal } 
foo 
$someGlobal 
+1

Cảm ơn bạn Keith (Tôi đã thay đổi lỗi đánh máy của mình)! Đó là chính xác những gì đã được một chút bối rối: mảng và băm (những gì khác?) Có thể được thay đổi trong một chức năng mà không cần sử dụng $ toàn cầu: nhưng các biến bình thường không thể. – gooly

+0

Về cơ bản, bạn có thể thay đổi nội dung của một đối tượng được tham chiếu (các thuộc tính trên một đối tượng, các phần tử trong một mảng, các phần tử trong một hashtable). Những gì bạn không thể thay đổi mà không sử dụng '$ global: ' là đối tượng thực tế (mảng/hashtable) tham chiếu biến. –