&&
sangat sulit untuk dicari di google, tetapi yang terbaik yang saya temukan adalah artikel ini yang mengatakan untuk digunakan -and
.
Sayangnya itu tidak memberikan informasi lebih lanjut, dan saya tidak dapat menemukan apa yang harus saya lakukan dengan -and
(sekali lagi, hal yang sangat sulit untuk dicari)
Konteks yang saya coba gunakan adalah "jalankan cmd1, dan jika berhasil, jalankan cmd2", pada dasarnya ini:
csc /t:exe /out:a.exe SomeFile.cs && a.exe
Ini harus menjadi beberapa poin rep mudah untuk seseorang yang tahu, terima kasih!
Sunting: Jika Anda hanya ingin menjalankan beberapa perintah pada satu baris dan Anda tidak peduli jika yang pertama gagal atau tidak, Anda dapat menggunakan ;
Untuk sebagian besar tujuan saya ini baik-baik saja
Sebagai contoh: kill -n myapp; ./myapp.exe
.
syntax
powershell
Orion Edwards
sumber
sumber
&&
dan||
menjadi bagian dari PowerShell: silakan pilih fitur di sini .!sym
.&&
dan||
! Timbang di GitHub PRJawaban:
Dalam CMD, '&&' berarti "jalankan perintah 1, dan jika berhasil, jalankan perintah 2". Saya telah menggunakannya untuk hal-hal seperti:
Di PowerShell, hal terdekat yang dapat Anda lakukan adalah:
Ini memiliki logika yang sama, tetapi teks keluaran dari perintah hilang. Mungkin itu cukup baik untukmu.
Jika Anda melakukan ini dalam skrip, Anda mungkin akan lebih baik memisahkan pernyataan, seperti ini:
2019/11/27 :
&&
Operator sekarang tersedia untuk PowerShell 7 Pratinjau 5+ :sumber
build ; if ($?) { run_tests }
di baris perintah.bash
ide pada PowerShell. Ini fungsi dasar shell. Sejauh ini yang terbaik yang saya lihat adalahbuild ; if ($?) { run_tests }
yang akan saya gunakan mulai sekarang. Saya harap tim PowerShell menambahkan&&
dukungan!&& dan || berada di daftar hal yang harus diimplementasikan (masih ada) tetapi tidak muncul sebagai hal paling berguna berikutnya untuk ditambahkan. Alasannya adalah bahwa kita memiliki -AND dan -OR. Jika menurut Anda ini penting, silakan ajukan saran di Connect dan kami akan mempertimbangkannya untuk V3.
sumber
-AND
-and
memakan hasilnya, tidak setara sama sekali.Coba ini:
sumber
$ErrorActionPreference
hanya mengatur bagaimana kesalahan non-terminasi yang dilaporkan oleh cmdlet diperlakukan; utilitas eksternal seperticsc
dana.exe
tidak pernah melaporkan kesalahan seperti itu (mereka hanya mencerminkan status keluar mereka di$?
(bendera keberhasilan) dan$LASTEXITCODE
(kode keluar spesifik dilaporkan)), sehingga baris perintah Anda sama dengan eksekusi tanpa syarat dari kedua perintah (setaracmd
dengancsc /t:exe /out:a.exe SomeFile.cs & a.exe
)Jika perintah Anda tersedia di cmd.exe (sesuatu seperti
python ./script.py
tetapi bukan perintah PowerShell sepertiii .
(Ini berarti untuk membuka direktori saat ini dengan explorer)), Anda dapat menjalankan cmd.exe di dalam PowerShell. Sintaksnya seperti ini:Di sini,
&&
disediakan oleh sintaks cmd yang dijelaskan dalam pertanyaan ini .sumber
Saya mencoba urutan perintah ini di PowerShell:
Tes Fisrt
($MyVar -ne $null)
dikembalikan benar dan(Get-Content $MyVar)
juga dikembalikan benar .Tes kedua
($MyVar -ne $null)
kembali salah dan sejauh ini saya harus menganggap(Get-Content $MyVar)
juga kembali salah .Tes ketiga membuktikan kondisi kedua bahkan tidak dianalisis.
($MyVar -ne $null)
kembali salah dan membuktikan kondisi kedua(Get-Content "C:\MyTxt.txt")
tidak pernah berjalan, dengan mengembalikan salah pada seluruh perintah.sumber
Pertanyaan yang sangat lama, tetapi untuk para pendatang baru: mungkin versi PowerShell (serupa tetapi tidak setara ) yang dicari oleh pertanyaan itu, adalah untuk digunakan
-and
sebagai berikut:(build_command) -and (run_tests_command)
sumber
&&
, karena mengabaikan kode keluarbuild_command
.;
sama dengan&
di cmd dan;
di bash. Ini jelas tidak sama dengan&&
di cmdItu tergantung pada konteksnya, tetapi inilah contoh "-and" yang sedang beraksi:
Jadi itu mendapatkan semua file lebih besar dari 10kb dalam direktori yang nama filenya dimulai dengan "f".
sumber
Ini sedikit lebih lama dari "&&" tetapi menyelesaikan hal yang sama tanpa skrip dan tidak terlalu sulit untuk diingat. Lebih baik terlambat daripada tidak sama sekali. :)
sumber
Start-Process
adalah alat yang salah untuk digunakan untuk menjalankan utilitas command-line secara umum. Secara khusus, seperti yang digunakan di sini,Start-Process
berjalan secara tidakfilename1.exe
sinkron di jendela konsol baru dan tidak mengembalikan apa pun , yang dalam konteks Boolean dievaluasi$false
. Bahkan jika Anda dihilangkanStart-Process
(yang adalah bagaimana Anda harus memanggil utilitas baris perintah - secara langsung), pendekatan tersebut akan gagal, karena hasil dari kondisi tergantung pada apakah utilitas menghasilkan output stdout, yang tidak memiliki hubungan jaminan dengan apakah itu berhasil atau tidak.Saya pikir pernyataan sederhana jika bisa mencapai ini. Setelah saya melihat respons mkelement0 di atas bahwa status keluar terakhir disimpan dalam $?, Saya menyatukan berikut:
Jadi untuk contoh op, itu akan menjadi:
sumber
Setara verbose adalah menggabungkan
$LASTEXITCODE
dan-eq 0
:Saya tidak yakin mengapa
if ($?)
tidak bekerja untuk saya, tetapi yang ini berhasil.sumber
Kita dapat mencoba perintah ini alih-alih menggunakan metode &&
coba {hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} catch {echo err} akhirnya {}
sumber
try
/catch
, karena hanya diperlukan untuk mengakhiri kesalahan, yang mana utilitas eksternal sepertihostname
,ipconfig
danfindstr
tidak dapat memicu. Memeriksa$LASTEXITCODE
hanya diperlukan jika Anda ingin mengetahui kode keluar khusus yang ditetapkan oleh utilitas eksternal - keberhasilan atau kegagalan abstrak tercermin dalam$?
, seperti halnya dengan cmdlet asli.&&
di Unix sangat mirip try / catch in yang tidak mengharuskan Anda untuk membungkus perintah berikutnya dalam blok baru (yaitu}
) ketika Anda melakukan hubungan pendek perintah kemudian (lewati saja). Saya pikirAmpAmp
fungsi / filter yang melempar kapanif (!?) { throw "last command failed" }
akan menjadi pengganti yang sangat berguna untuk porting&&
ke PowerShell. penggunaan :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe