Çok satırlı komut nasıl girilir


425

Bir PowerShell komut satırını birden çok satıra bölmek mümkün mü?

Visual Basic'te _komutu sonraki satırda devam etmek için alt çizgi ( ) kullanabilirsiniz.


3
"Neden ters eğik çizgi yok" sorusu Bruce Payette'in Eylemdeki PowerShell'inde güzel bir şekilde ele alınmış ; Harika kitap. Bruce, programlama dillerinin tarihi hakkında geniş bir bilgiye sahiptir. Bu kitabın V2'sini bekliyoruz.
Jay Bazuzi


1
Offtopic ise üzgünüm ama komut dosyasını shkomutla gönderecekseniz, ters eğik çizgiyi kullanabilmeniz için bash kuralları geçerlidir. Bu durumda komut dosyanızın da unix stili sonları olmalıdır.
kon psych

komutu birden çok satırda ayırmak için `` karakteri kullanın
Asad Shakeel

Yanıtlar:


634

Bir boşluk ve ardından mezar aksanı (backtick) kullanabilirsiniz:

Get-ChildItem -Recurse `
  -Filter *.jpg `
  | Select LastWriteTime

Bununla birlikte, bu sadece yukarıda gösterildiği gibi durumlarda gereklidir. Bir komut sözdizimi söz konusu noktada tamamlanamadığında, genellikle otomatik satır devam eder. Bu, yeni bir boru hattı elemanının başlatılmasını içerir:

Get-ChildItem |
  Select Name,Length

|komuttan sonra başka bir ardışık düzen öğesi eksik olduğu için tamamlanamadığından sorunsuz çalışacaktır . Ayrıca kıvırcık parantez veya başka bir parantez açmak, hattın doğrudan devam etmesine izin verecektir:

$x=1..5
$x[
  0,3
] | % {
  "Number: $_"
}

|Virgül benzer şekilde bazı bağlamlarda da çalışır:

1,
2

Unutmayın olsa da, JavaScript'in benzer Otomatik Noktalı virgül Ekleme , benzer satır sonu bir noktada meydana çünkü kırık bazı şeyler vardır edilir geçerli bir açıklamada öncesinde:

return
  5

çalışmayacak.

Son olarak, dizeler (tüm çeşitlerde) tek bir çizginin ötesine de uzanabilir:

'Foo
bar'

Dize içindeki satır sonlarını içerir.


4
Ve çizgi continuators örneğin gibi diğer bazı belirteçleri de hareket belirtmeyi unutmayın |ve {.
Keith Hill

1
@ Keith: Teşekkürler, dahil ettim. Muhtemelen bunlardan bahsetmek için çok açıktı ;-)
Joey

16
Hayır, ileride referans olması için bu karakterlerin belgelenmesi iyi bir şey.
Keith Hill

1
@JackDouglas: Açılış parantezinden hemen sonra satır sonu olabilir , ancak görünüşe göre işleçten önceki ifadede olamaz. Bununla birlikte, gramerde bir gözetim olduğuna inanıyorum.
Joey

10
Görünüşe göre, satır devamı ISE komut bölmesinde çalışmıyor.
Khouri Giordano

64

Sadece arka kene ile satır sonu arasında herhangi bir karakter olmaması gerektiğini öğrendim . Boşluk bile komutun çalışmamasına neden olur.


10
Bu teknik olarak sorunun cevabı olmasa da +1, çünkü bu kesinlikle gereklidir. Bunu zor yoldan öğrendim ve gelecekteki gelişimde mümkün olduğunca geri adımlardan kaçınacağım.
Dave Markle

4
Dolayısıyla, Powershell'de uzun bir çizgiyi kırmanın sağlam bir yolu yoktur. Her yerde bu 2 ekranlı powershell betiklerini görme eğilimim yok . #ShakeMyHead
RayLuo

Ben de bununla mücadele ediyordum ... bir yorum eklemek için geri işaretinden önce bir satır içi yorum ekleyebilirsiniz, şöyle: Bazı Komut `-arg1 <# açıklamak arg 1 #>` -arg2 <# açıklamak arg 2 #>
joelsand

2
Urgh. Bu, Shift + Enter kullanıldığında komutun bir insan tarafından yanlış okunacağından veya arka onay işaretini kullanırken ISE'nin komut satırında yanlış ayrıştırıldığından korktuğu için PowerShell kodunu dokümantasyonda veya web sitelerinde yayınlamak gereksiz yere zorlaştırır.
GuitarPicker

Yorumun niteliği nedeniyle aşağı oylama (orijinal soruya tam bir cevap değildir).
CodeBreaker

38

Çoğu C benzeri dilde, parantezimi kodu okumayı en kolay hale getirdiklerini düşündüğüm yere yerleştirme konusunda kasıtlıyım.

PowerShell ayrıştırıcısı bir ifadenin açıkça tamamlanmadığını fark eder ve bir sonraki satıra bakar. Örneğin, isteğe bağlı bir komut dosyası bloğu parametresi alan bir cmdlet'i düşünün:

    Get-Foo {............}

komut dosyası bloğu çok uzunsa, şunu yazmak isteyebilirsiniz:

    Get-Foo
    {
        ...............
        ...............
        ...............
    }

Ancak bu işe yaramaz: ayrıştırıcı iki ifade görür. Birincisi Get-Foove ikincisi bir komut dosyası bloğudur. Bunun yerine şunu yazıyorum:

    Get-Foo {
        ...............
        ...............
        ...............
    }

Satır devam karakterini (`) kullanabilirim, ancak bu okunması zor kodlar yapar ve hataları davet eder.

Bu durumda açık ayraç bir önceki satırda olmasını gerektirdiğinden, bu modeli her yerde takip ediyorum:

    if (koşul) {
        .....
    }

ifİfadelerin dil dilbilgisinde bir komut dosyası bloğu gerektirdiğini unutmayın , bu nedenle ayrıştırıcı komut dosyası bloğu için bir sonraki satıra bakacaktır, ancak tutarlılık için açık kümeyi aynı satırda tutuyorum.

Aynı şekilde, uzun boru hatlarında, boru karakterinden ( |) sonra koparım :

    $ project.Items | 
        ? {$ _. Anahtar -eq "ProjectFile"} |
        % {$ _. Değer} | 
        % {$ _. EvaluatedInclude} |
        % {
            .........
        }

nasıl ifve foreachve trysonra çalışır? sonraki satırda komut dosyası bloklarına izin veriyorlar ... bu mut mümkün olabileceği anlamına geliyor
Nacht - Monica'yı eski

@Nacht: Paslı bellekten: dil grameri başına bir komut dosyası bloğu gerektiren ifadeler, bir tane bulmak için bir satırsonu geçmişini ayrıştırır. Herkes onaylayabilir mi?
Jay Bazuzi

2
@Nacht: "Ama bu işe yaramaz", diğer parametrelerin isteğe bağlı olduğu durumlara işaret ediyordu, ki bu çoğu durumda.
Jay Bazuzi

1
şimdi ne demek istediğini anlıyorum. yani "if" ve "foreach" aslında cmdletler değildir - bunlar dilbilgisinin gerçek bir parçasıdır, böylece onu bir sonraki satıra geçmeye zorlar. kullanıcı tanımlı bir işlevin sonraki satırdan bir komut dosyası bloğunu okumasına izin vermenin bir yolu yok mu? Sanırım yukarıdaki cevap tam olarak bu soruya cevaplar.
Nacht - Monica'yı

29

Cristobalito'nun cevabını genişletmek için :

Komut satırında bahsettiğinizi varsayalım - eğer bir komut dosyasındaysa, yeni bir satır> bir komut sınırlayıcı görevi görür.

Komut satırında noktalı virgül ';'

Örneğin:

Komut satırında bir PowerShell betiği imzalayın. Satır sonu yok.

powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}

10
Sorunun cevabı değil, cevabım sorumu yanıtladı. :)
Frederik

1
Bu ilginç, ama OP'nin sorduğu şeyin tam tersi. OP tek bir komutu birkaç satıra bölmek istedi; birkaç komutu tek bir satırda nasıl birleştireceğinizi açıkladınız.
Daniel Yankowsky

17

PowerShell ve PowerShell ISE'de, çok satırlı düzenleme için (standart backtick yerine ) her satırın sonunda Shift+ kullanmak da mümkündür .Enter`


2
Bu, çok satırlı burada dizeleri düzenlemek için harika bir ipucu, aksi takdirde SHIFT-ENTERhile bilmiyorsanız düzenlemek korkunç .
dpw

1
Bunun sadece PSReadLinemodül veya eşdeğerini kullanırken PowerShell'in konsol sürümünde böyle olduğuna inanıyorum . Standart Windows konsolunda giriş fonksiyonları Enterve Shift+Enterfonksiyonel olarak eşdeğerdir.
Bill_Stewart

@Bill_Stewart true, PSReadline olmadan İMKB konsolunda çalışır, ancak Konsol Ana Bilgisayarında çalışmaz.
Briantist

2
Açıklığa kavuşturmak için: 1) PSReadlineModül yalnızca konsol ana bilgisayarında çalışır (ISE'de değil). 2) Shift+EnterKonsol ana bilgisayarında yalnızca kullanırken çalışır PSReadline. 3) Shift+EnterİMKB'de daima çalıştı. 4) Konsol ana bilgisayarı olmadan kullanılırsa PSReadline, Shift+Enterişlevsel olarak basmaya eşdeğerdir Enter.
Bill_Stewart

2
bu doğru cevap, kabul edilen ve 400 oy veren çok kafa karıştırıcı ve işe yaramaz !!
FLICKER

4

Dizeleri birden çok satıra ayırmaya çalışıyorsanız "+" kullanabilirsiniz. Örneğin:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

Tıpkı şöyle görünecek:

$header = "Make,ComputerName,Model,Windows Version"

2

Komut satırında konuştuğunuzu varsayıyorum - eğer bir komut dosyasındaysa, yeni bir satır komut sınırlayıcı olarak işlev görür.

Komut satırında noktalı virgül ';'


1
  1. ;Komutu ayırmak için noktalı virgül kullanma
  2. Çift ters eğik çizgi değiştirin \\herhangi ters eğik üzerinde \.
  3. "'Komutu "'PATH'" gibi değiştirmek için güvenli adres iletmek için kullanın .

Bu ps1 komutu yükleme yerel pfx sertifikası.

powershell -Command "$pfxPassword = ConvertTo-SecureString -String "12345678" -Force -AsPlainText ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\My -Password $pfxPassword ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\Root -Password $pfxPassword"




0

Buraya bir köşe kılıfı ekleyin. Size 5 dakika kazandırabilir. Bir eylem zinciri kullanırsanız, "." satırın sonunda bir boşluk bırakın, ardından "" "(ters tırnak). Ben bunu zor yoldan buldum.

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
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.