Powershell'de çalışıp alabilir miyim?


186

&&Google'da arama yapmak oldukça zordur, ancak bulduğum en iyi şey, bu makaleyi kullanmasıdır -and.

Ne yazık ki daha fazla bilgi vermiyor ve ne yapmam gerektiğini bulamıyorum -and(yine, araması çok zor bir şey)

Kullanmaya çalıştığım bağlam "cmd1 yürüt ve başarılı olursa, cmd2 yürüt", temelde bu:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

Bu bilen birine kolay bir çift temsilcisi olmalı, teşekkürler!


Düzenleme: Sadece tek bir satırda birden fazla komut çalıştırmak istiyorsanız ve birincisinin başarısız olup olmadığını umursamıyorsanız, amacımın ;çoğu için bu iyi

Örneğin: kill -n myapp; ./myapp.exe.


PowerShell -ve ve -veya mantıksal işleçlere sahiptir. Operatörler beklediğiniz gibi çalışmıyor mu? Öyleyse, ifadeyi buraya gönderebilirsiniz.
Mohit Chakraborty

Bu soruya bakın, ne istersen yapar: stackoverflow.com/questions/1917271/…
joshperry

2
Kim Bash tarzında ilgilenilmesi &&ve ||bir PowerShell bir parçası haline: özellik için lütfen oy buraya .
mklement0

1
Değişmez (ve önemli) simgelere sahip sorgular için web aramaları yapma gereği ile ilgili olarak: SymbolHound bunun için yararlıdır. Soru ile ilgili bazı örnekler: powershell && ; powershell -ve . Eğer kullanırsanız DuckDuckGo , sen SymbolHound ile Arama Can !sym.
nisavid

3
Haziran 2019 güncellemesi : PowerShell ekibi uygulanıyor &&ve ||! GitHub PR'da
pilau

Yanıtlar:


193

CMD'de, '&&' komut 1'i çalıştır ve başarılı olursa komut 2'yi yürüt "anlamına gelir. Ben gibi şeyler için kullandım:

build && run_tests

PowerShell'de yapabileceğiniz en yakın şey:

(build) -and (run_tests)

Aynı mantığa sahiptir, ancak komutlardaki çıktı metni kaybolur. Belki de senin için yeterince iyi.

Bunu bir komut dosyasında yapıyorsanız, ifadeleri şu şekilde ayırmak daha iyi olacaktır:

build
if ($?) {
    run_tests
}

2019/11/27 : &&Operatör artık PowerShell 7 Preview 5+ için hazır :

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE: "onlar kaldırmak saçma" - PowerShell "aptal parçaları kaldırıldı CMD" olarak düşünmek istemiyorum. g.g/k92B
Jay Bazuzi

90
PowerShell'i "aptal parçaları kaldırılmış CMD" olarak düşünmekten hoşlanmıyorum. Ben "yararlı bit herhangi olmadan Bash" olarak düşünmek istiyorum.
Pod

15
Ayrıca yapabilirsiniz build ; if ($?) { run_tests }çok komut satırını üzerinde.
16:16, docwhat

19
PowerShell'i öğrenirken gerçek hayal kırıklığının en hızlı yolu, bunun sadece genişletilmiş bir CMD veya bash olduğunu düşünerek başlamaktır. Bu bir temelde farklı model var epecially o girdi, çıktı, borulama ve sonuçların geldiğinde. İyi bir öğretici veya genel bakışla başlayın ve diğer kabuklardan sözdizimi oluşturmak için çok fazla uğraşmayın. Kendi şartlarına göre almalısın.
Mark Meuer

3
PowerShell'i kendi terimleriyle alarak bir komutu nasıl çalıştırabilirim ve sonra yalnızca bu komut başarılı olursa başka bir komut çalıştırırım? Bunun bashPowerShell'e fikir dayattığını düşünmüyorum . Temel kabuk işlevselliği. Şimdiye kadar gördüğüm en iyi şey build ; if ($?) { run_tests }bundan sonra kullanacağım. Umarım PowerShell ekibi &&destek ekler !
Nate

28

&& ve || uygulamak için şeyler listesinde (hala vardır) ama eklemek için bir sonraki en yararlı şey olarak ortaya çıkmadı. Bunun sebebi -AND ve -OR. Bunun önemli olduğunu düşünüyorsanız, lütfen Connect'e bir öneri gönderin ve V3 için düşünelim.


11
Connect'e kaydoldum ve powershell için kendimi aday gösterdim, ancak nasıl öneri vereceğimi anlayamıyorum. Connect web sitesi gerçekten karmaşık ve kafa karıştırıcı :-(
Orion Edwards

6
Önceden var olan bir istek bulamadım, bu yüzden bir tane yaptım: connect.microsoft.com/PowerShell/feedback/details/778798/…
Andy Arismendi

22
Sen soru eşdeğer yazmaya ve bir örneğini eklendiğinde cevap çok daha yararlı olacağını nasıl hala, biliyorum kullanarak -AND
Kyeotic

5
Önemlidir çünkü neredeyse sonsuzluk için pencerelerden daha eski sistemlerde kullanılan temel bir akış kontrol aracıdır. Böylece linux ve pencereler arasında başka bir kesme farkı sunar.
airtonix

6
Umarım Jeffrey Snover dinler, bu SO bunu şimdiye kadar uygulamak için yeterli sebep olmalıdır. Çok uzun zaman oldu ve şimdi PowerShell, VSCode'un Windows'ta varsayılan bir terminal olarak kullandığı gibi yerlerde açılır. Bu, && olmadan toplam acıdır -and, çıktıyı yiyor, hiç eşdeğer değil.
Ciantic

13

Bunu dene:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

9
Not: İlk komut başarısız olursa, ikincisi hala çalışmaya devam eder.
BrunoLM

4
Tercih değişkeni $ErrorActionPreferenceyalnızca cmdlet'ler tarafından bildirilen sonlandırma hatalarının nasıl ele alınacağını yönetir ; Dış gibi kamu hizmetleri cscve a.exeasla (onlar sadece kendi çıkış içinde durumu göstermektedir tür hataları rapor $?başarı bayrağı () ve $LASTEXITCODEbu yüzden sizin komut satırı miktarları (Belirli bir çıkış kodu bildirilen)) koşulsuz yürütülmesi hem komutları (eşdeğer cmd'ın csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mklement0

5

Komutunuz cmd.exe'de mevcutsa ( python ./script.pyPowerShell komutu gibi ama böyle bir şey değil ii .(Geçerli dizini explorer tarafından açmak anlamına gelir)), cmd.exe'yi PowerShell içinde çalıştırabilirsiniz. Sözdizimi şöyle:

cmd /c "command1 && command2"

Burada, bu soruda&& açıklanan cmd sözdizimi ile sağlanmaktadır .


4
Güzel, ek işlevselliğine erişmek için cmd'ye yükseltin.
Bill K

4

PowerShell'de bu komut dizisini denedim:

Fisrt Testi

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null)doğru döndü ve (Get-Content $MyVar)aynı zamanda doğru döndü .

İkinci Test

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null)yanlış döndü ve şimdiye kadar (Get-Content $MyVar)da yanlış döndü varsaymak gerekir .

Üçüncü test, ikinci koşulun bile analiz edilmediğini kanıtladı.

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null)false döndürdü ve tüm komutta false(Get-Content "C:\MyTxt.txt") döndürerek ikinci koşulun asla çalışmadığını kanıtladı .


Haklısın! bu, && operatörü gibi davranır. Sağ taraftaki bir $ () bile bunu değerlendirmeye izin vermez!
Falco Alexander

2

Çok eski bir soru, ama yeni gelenler için: belki de sorunun aradığı PowerShell sürümü (benzer ancak eşdeğer değil ) -andaşağıdaki gibi kullanmaktır :

(build_command) -and (run_tests_command)


1
Bu, kullanım durumunuz için uygun olabilir, ancak &&çıkış kodunu yoksayar gibi davranmaz build_command.
Simon Buchan

Bu kesinlikle doğru olanı yapmıyor. İlk komut başarısız olsa bile ikinci komutu çalıştıracaktır.
Nate

bu tamamen yanlış. cmd ve bash değerlerine ;eşittir . Kesinlikle cmd ile aynı değil&;&&
phuclv

Ayrıca her iki işlem için STDOUT ve STDERR sesini kapatır.
Dragas

0

Bağlama bağlıdır, ama işte bir "-ve" örneği:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

Bu, dosya adı "f" ile başlayan bir dizinde 10 kb'den büyük tüm dosyaları alıyor.


1
Bu, birden fazla komutun yürütülmesi ile ilgili orijinal sorunun cevabı değildir.
bdukes

0
if (start-process filename1.exe) {} else {start-process filename2.exe}

"&&" den biraz daha uzun ama aynı şeyi komut dosyası olmadan da gerçekleştiriyor ve hatırlaması çok zor değil. Geç olsun güç olmasın. :)


2
Start-Processgenel olarak komut satırı yardımcı programlarını çağırmak için kullanılacak yanlış araçtır. Özellikle, burada kullanıldığı gibi, yeni bir konsol penceresinde eşzamansız olarak Start-Processçalışır filename1.exeve Boolean bağlamında değerlendirilen hiçbir şey döndürmez $false. Atlansanız bile Start-Process(doğrudan komut satırı yardımcı programlarını çağırmanız gerekir), yaklaşım kısa olur çünkü koşulun sonucu, yardımcı programın herhangi bir stdout çıktısı üretip üretmediğine bağlıdır. başarılı olsun ya da olmasın.
mklement0

0

Bence basit bir if ifadesi bunu başarabilir. Mkelement0'ın son çıkış durumunun $? 'Da saklandığını gösteren cevabını gördükten sonra aşağıdakileri bir araya getirdim:

# Set 1st command to variable
$a=somecommand

# Temp var to store exit status of last command (since we can't write to $?)
$test=$?

# Run Test
if ($test=$true) { 2nd-command }

Operasyon örneği için şöyle olur:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

0

Bir ayrıntılı eşdeğer birleştirmektir $LASTEXITCODEve -eq 0:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

Benim için neden if ($?)işe yaramadığından emin değilim , ama bu işe yaradı.


-1

&& yöntemini kullanmak yerine bu komutu deneyebiliriz

{hostname; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} sonunda {echo err} yakala {}


Gerek yoktur try/ catchyalnızca için gereklidir, çünkü sonlandırma hataları, dış gibi kamu hizmetleri hangi hostname, ipconfigve findstrtetikleyemez. Kontrol $LASTEXITCODEyalnızca harici bir yardımcı program tarafından ayarlanan belirli çıkış kodunu bilmek istiyorsanız gereklidir - soyut $?cmdlet'lerde olduğu gibi soyut başarı veya hata da yansıtılır .
mklement0

Bence @Cyberiron doğru yolda. &&Unix'te }daha sonra komutları kısa devre yaptığınızda (atlayın) yeni bir blokta (yani ) sonraki komutları sarmanızı gerektirmediği için dene / yakala gibi bir şey olduğunu düşünüyorum . Ne AmpAmpzaman atar bir işlev / filtre PowerShell if (!?) { throw "last command failed" }taşıma &&için çok yararlı bir yedek olacağını düşünüyorum . kullanım :csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.