PowerShell'de uzun komutları birden çok satıra bölme


227

PowerShell'de aşağıdaki gibi bir komutu nasıl alıp birden fazla satıra bölebilirsiniz?

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"


Yanıtlar:


323

Sondaki backtick karakteri, yani,

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
-verb:sync `
-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
-dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

Beyaz boşluk önemlidir. Gerekli biçim Space`Enter.


1
Bu komut geçmişi (yukarı ok) işlevselliğini bozuyor gibi görünüyor; çünkü her satır ayrı bir komut olarak görünür. Bunun etrafında bir yol var mı?
Richard Ev

2
Powershell 3 veya daha üstünü çalıştırıyorsanız, bkz. Github.com/lzybkr/psreadline - çok satırlı ifadeler için geçmiş geçişi düzeltildi.
x0n

43
Back-tick'in önündeki boşluk gereklidir # öğrenilmesi zor
Josh Graham

29
@ josh-graham Ve geri işaretinden SONRA boşluk (veya satır içi yorum) OLMAMALIDIR. # öğrendim-zor-yol
RayLuo

1
Backticks kırılgandır (yukarıdaki yorumlar durumu gibi) ve bir dosyayı ayrıştırırken veya incelerken bulmak zordur. Kod hata ayıklamak daha kolay istiyorsanız @StevenPenny'nin cevabı daha iyidir.
mjd2

67

Daha temiz argüman geçişi için başka bir yöntem sıçramak olacaktır .

Parametrelerinizi ve değerlerinizi aşağıdaki gibi bir hashtable olarak tanımlayın:

$params = @{ 'class' = 'Win32_BIOS';
             'computername'='SERVER-R2';
             'filter'='drivetype=3';
             'credential'='Administrator' }

Ve sonra komutunuzu şöyle çağırın:

Get-WmiObject @params

Microsoft Belgeleri: Splatting Hakkında

TechNet Magazine 2011: Windows PowerShell: Sıçrama

Powershell 2.0 ve üstü ile çalışıyor gibi görünüyor


5
Bu harika! VE şöyle parametreler ekleyebilirsiniz: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder

1
Noktalı virgüller, Tamam ama gereksiz. Yalnızca satır başına birden çok değer varsa gereklidir.
jim birch

38

Ah ve ayrılmak istediğiniz çok uzun bir dizeniz varsa, HTML diyelim, dışın @her iki tarafına bir - koyarak şöyle yapabilirsiniz ":

$mystring = @"
Bob
went
to town
to buy
a fat
pig.
"@

Tam olarak şunu elde edersiniz:

Bob
went
to town
to buy
a fat
pig.

Notepad ++ kullanıyorsanız , bir dize bloğu olarak doğru bir şekilde vurgulanacaktır.

Şimdi, bu dizenin çift tırnak içermesini istiyorsanız, bunları şu şekilde ekleyin:

$myvar = "Site"
$mystring = @"
<a href="http://somewhere.com/somelocation">
Bob's $myvar
</a>
"@

Tam olarak şunu elde edersiniz:

<a href="http://somewhere.com/somelocation">
Bob's Site
</a>

Bununla birlikte, bu @ dizgisinde çift tırnak kullanırsanız, Notepad ++ bunu fark etmez ve duruma bağlı olarak alıntılanmış veya alıntılanmış gibi sözdizimi rengini kapatır.

Ve daha da iyisi şu: $ değişkeni eklediğiniz her yerde yorumlanıyor! (Metinde dolar işaretine ihtiyacınız varsa, bunun gibi bir onay işareti ile kaçarsınız: `` $ a-değişken ''.)

FARKINA VARMAK! Finali çizginin"@ en başına koymazsanız başarısız olur. Koduma girintili olamadığımı anlamak bir saatimi aldı!

İşte MSDN : Konuyla ilgili “İşte-Dizeleri” Windows PowerShell Kullanarak


1
Düzgün hile, ben değişken bir $ varsa ... işe yaramıyor gibi görünüyor. Ben "burada bir dize başlığı sonra karakter izin verilmez ..."
tofutim

Değişken ismini kırabileceğinizi sanmıyorum, sadece bir dize.
bgmCoder

19

Backtick operatörünü kullanabilirsiniz:

& "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
    -verb:sync `
    -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
    -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"

Bu benim zevkime göre biraz fazla uzun, bu yüzden bazı iyi adlandırılmış değişkenler kullanırdım:

$msdeployPath = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
$verbArg = '-verb:sync'
$sourceArg = '-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web"'
$destArg = '-dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"'

& $msdeployPath $verbArg $sourceArg $destArg

1
Değişken isimlerini diğer önerilere göre seviyorum çünkü muhtemelen powershell olmayan uzmanlar için en okunabilir seçenek. Splatting kullanılan bir öğretici / kurulum kılavuzu gördüm ben splatting bir alt-öğretici olmadan neler olup bittiğini tamamen kaybolur. Benzer şekilde, geri tepmeler basit ve denenmiş PS değişkenlerinden daha kırılgan ve muhtemelen daha az bilinir.
Josh Desmond

13

Bir fonksiyonunuz varsa:

$function:foo | % Invoke @(
  'bar'
  'directory'
  $true
)

Bir cmdlet'iniz varsa :

[PSCustomObject] @{
  Path  = 'bar'
  Type  = 'directory'
  Force = $true
} | New-Item

Bir uygulamanız varsa:

{foo.exe @Args} | % Invoke @(
  'bar'
  'directory'
  $true
)

Veya

icm {foo.exe @Args} -Args @(
  'bar'
  'directory'
  $true
)

3

PowerShell 5 ve PowerShell 5 ISE'de, çok satırlı düzenleme için yalnızca Shift+ kullanmak da mümkündür (her satırın sonundaki Enterstandart geri tıklamalar yerine `):

PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" # Shift+Enter
>>> -verb:sync # Shift+Enter
>>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" # Shift+Enter
>>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

0

Bir dizeyi birden çok satıra bölmenin başka bir yolu, dizenin ortasına boş bir ifade koymak ve satırlar boyunca bölmektir:

örnek dize:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

çizgiler arasında kırık:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"

0

Hesaplamalarla Splat Yöntemi

Splat yöntemini seçerseniz, diğer parametreler kullanılarak yapılan hesaplamalara dikkat edin. Pratikte, bazen değişkenleri önce ayarlayıp karma tablosunu oluşturmam gerekir. Ayrıca, biçim, anahtar değerinin veya noktalı virgülün (yukarıda belirtildiği gibi) etrafında tek tırnak gerektirmez.

Example of a call to a function that creates an Excel spreadsheet

$title = "Cut-off File Processing on $start_date_long_str"
$title_row = 1
$header_row = 2
$data_row_start = 3
$data_row_end = $($data_row_start + $($file_info_array.Count) - 1)

# use parameter hash table to make code more readable
$params = @{
    title = $title
    title_row = $title_row
    header_row = $header_row
    data_row_start = $data_row_start
    data_row_end = $data_row_end
}
$xl_wksht = Create-Excel-Spreadsheet @params

Not: Dosya dizisi, e-tablonun doldurulmasını etkileyecek bilgiler içerir.

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.