Bagaimana cara meniadakan kondisi di PowerShell?


274

Bagaimana cara meniadakan tes bersyarat di PowerShell?

Misalnya, jika saya ingin memeriksa direktori C: \ Code, saya dapat menjalankan:

if (Test-Path C:\Code){
  write "it exists!"
}

Apakah ada cara untuk meniadakan kondisi itu, misalnya (tidak bekerja):

if (Not (Test-Path C:\Code)){
  write "it doesn't exist!"
}

Penanganan masalah :

if (Test-Path C:\Code){
}
else {
  write "it doesn't exist"
}

Ini berfungsi dengan baik, tapi saya lebih suka sesuatu yang sebaris.

Jawaban:


508

Anda hampir memilikinya Not. Harus:

if (-Not (Test-Path C:\Code)) {
    write "it doesn't exist!"
} 

Anda juga dapat menggunakan !:if (!(Test-Path C:\Code)){}

Hanya untuk bersenang-senang, Anda juga bisa menggunakan bitwise eksklusif atau, meskipun itu bukan metode yang paling mudah dibaca / dimengerti.

if ((test-path C:\code) -bxor 1) {write "it doesn't exist!"}

2
Menarik, jadi -notdatang dengan alternatif tradisional !itu? Bisakah saya mendapatkan alternatif tradisional untuk -eqdan -nejuga?
Roman Starkov

8
Tidak, -notadalah satu-satunya operator yang logis yang datang dengan alternatif (lihat help about_Logical_Operators), dan operator tidak dapat alias.
Rynant

14
Terima kasih, saya kehilangan fakta bahwa penggunaan !tanda kurung yang diperlukan.
Pengembang Holistik

@ Holistic-Developer !sendiri tidak memerlukan tanda kurung. Setidaknya tidak di PS3.
Llyle

9
Istilah '! Jalur Uji' tidak dikenal sebagai nama cmdlet ... :)
sodawillow

9

Jika Anda seperti saya dan tidak menyukai tanda kurung ganda, Anda dapat menggunakan suatu fungsi

function not ($cm, $pm) {
  if (& $cm $pm) {0} else {1}
}

if (not Test-Path C:\Code) {'it does not exist!'}

Contoh


1
Saya suka ini, tetapi mungkin tidak dapat menggunakan notimplementasi ini di mana-mana (misalnya not Test-Path -path C:\Codetidak akan berfungsi). Lihat juga pos terkait ini .
orad

2
Perl memiliki logika yang lebih logis, dalam arti Vulcan, yang disebut Unless, yang ditulis sebagai fungsi. Menjadi setengah Vulcan, saya lebih suka, dan telah mengimplementasikannya di C #, sebagai fungsi, dan di C dan C ++, sebagai makro.
David A. Gray

1
@ DavidA.Gray Ruby memiliki unlesskata kunci (seperti if) tetapi sebagian besar pengguna dari bahasa lain membencinya.
Franklin Yu

3

Powershell juga menerima operator C / C ++ / C * bukan

if (! (Test-Path C: \ Code)) {tulis "itu tidak ada!" }

Saya sering menggunakannya karena saya sudah terbiasa dengan C * ...
memungkinkan kompresi / penyederhanaan kode ...
Saya juga merasa lebih elegan ...


0

jika Anda tidak suka tanda kurung ganda atau Anda tidak ingin menulis fungsi, Anda bisa menggunakan variabel.

$path = Test-Path C:\Code
if (!$path) {
    write "it doesn't exist!"
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.