2016-06-01 15 views
6

Tôi thường sử dụng các biến được khai báo trong phạm vi kịch bản để tránh các vấn đề với chức năng và phạm vi của chúng. Tôi tuyên bố các biến như thế này:Sự khác biệt giữa Xóa-Biến và thiết lập biến thành NULL

New-Variable -Name test -Option AllScope -Value $null 

... hoặc đôi khi tôi chuyển biến đang tồn tại như thế này để sử dụng chúng một cách toàn diện:

$script:test = $test 

Khi tôi muốn xóa chúng tôi hoặc là sử dụng này:

Clear-Variable test -Scope Script 

... hay tôi chỉ cần sử dụng này:

$test = $null 

Có sự khác biệt nào không? Tôi nên thích gì hơn và tại sao?

Trả lời

6

Từ get-Trợ giúp:

The Clear-Variable lệnh xóa dữ liệu lưu trữ trong một biến, nhưng nó không xóa các biến. Kết quả là, giá trị của biến là NULL (trống). Nếu biến có dữ liệu hoặc kiểu đối tượng được chỉ định, Xóa biến duy trì loại đối tượng được lưu trữ trong biến.

Vì vậy, Clear-Variable$var=$null gần như tương đương (ngoại trừ việc nhập được giữ lại). Tương đương chính xác sẽ là $var=[mytype]$null.

Bạn có thể kiểm tra nó tự hỏi:

$p = "rrrr" 
Test-Path variable:/p  # => $true 
$p = $null 
Get-Member -InputObject $p  # => error 
$p = [string]$null 
Get-Member -InputObject $p # => it is a string 

Và để trả lời những gì có thể là câu hỏi tiếp theo: làm thế nào để loại bỏ hoàn toàn một biến (vì một biến vắng mặt là khác nhau từ một biến vô giá trị)? Đơn giản chỉ cần làm

rm variable:/p 
Test-Path variable:/p => $false 
+0

Cảm ơn, đọc sự giúp đỡ sẽ đã được một ý tưởng tốt ;-) –

+0

++, nhưng đối xứng và khả năng xác định phạm vi đích bạn nên đề cập đến ['Remove-Variable'] (https://technet.microsoft.com/library/hh849935.aspx) . – mklement0

+3

Cả 'Biến thể rõ ràng' và gán' $ null' giữ nguyên loại biến liên kết kiểu (một biến được xác định bằng "ký pháp đúc", ví dụ: '[int] $ i = 1'). – mklement0

1

Để bổ sung Marcanpilami's helpful answer:

Lưu ý: Để loại bỏ (undefine) một biến hoàn toàn, sử dụng Remove-Variable <name> [-Scope <scope>].

Trừ$test được định nghĩa với Set-Variable -Option AllScope,

  • Clear-Variable test -Scope Script

  • $test = $null

NOT thường tương đương.

(VớiSet-Variable -Option AllScope họ đang có, nhưng sau đó lập luận -Scope trở nên không thích hợp, bởi vì khi đó chỉ một dụ của biến tồn tại, trên tất cả các phạm vi.)

$test = $null-trừ khi thực hiện trong phạm vi tương tự như khi biến test ban đầu được tạo - sẽ ẩn hoàn toàn tạo biến số test trong phạm vi hiện tại (và gán $null cho nó) và giữ nguyên biến số gốc. Để biết thêm về phạm vi biến đổi trong PS, xem this answer của tôi.

Lưu ý rằng cú pháp biến phân cung cấp Phạm vi quá, thông qua một phạm vi tiền tố, nhưng nó được giới hạn global, script, và local (mặc định): $global:test = $null, $script:test = $null, $local:test = $null

Ngoài ra còn có phạm vi private: biến thể của local ngăn không cho phạm vi hậu duệ nhìn thấy biến - một lần nữa, xem this answer.

Nếu bạn đã chắc chắn rằng bạn nhắm vào cùng phạm vi, hai hình thức trên là chức năng tương đương: họ gán $null để biến mục tiêu. [1]

Tuy nhiên, sử dụng Clear-Variable cho phép bạn làm hai việc mà $<scope>:testing = ... không:

  • các -Scope tham số cũng chấp nhận một số giá trị cho biết các phạm vi tương đối với phạm vi hiện tại: 0 là s hiện tại đối phó, 1 là phạm vi chính, v.v.

  • bạn có thể mục tiêu nhiều biến (hoặc như một mảng tên hoặc sử dụng ký tự đại diện)


[1] Pitfall:

Lưu ý rằng nếu biến mục tiêu là bị ràng buộc loại (được gán với "ký pháp đúc"; ví dụ., [int] $i = 1), loại là giữ - cho dù sử dụng $testing = $null hoặc Clear-Variable - và chuyển đổi ngầm loại có thể xảy ra, có thể có kết quả bất ngờ hay thất bại hoàn toàn:

[int] $i = 1 # type-constrain $i as an integer 
Clear-Variable i # equivalent of $i = $null 
$i # !! $i is now 0 (!), because [int] $null yields 0 

[datetime] $d = 1 # type-constrain $d as DateTime 
Clear-Variable d # !! FAILS, because `$d = $null` fails, given that 
       # !! $null cannot be converted to [datetime] 
Các vấn đề liên quan