Cara membagi perintah panjang di beberapa baris di PowerShell

227

Bagaimana Anda mengambil perintah seperti berikut ini di PowerShell dan membaginya ke beberapa baris?

&"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"
asgerhallas
sumber
Kemungkinan duplikat dari Bagaimana cara memasukkan perintah multi-line?
Michael Freidgeim

Jawaban:

322

Membuntuti karakter backtick, yaitu,

&"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"

Ruang putih penting. Format yang diperlukan adalah Space`Enter.

Colin Pickard
sumber
1
Ini tampaknya memecah fungsionalitas histori perintah (panah atas); karena setiap baris muncul sebagai perintah terpisah. Apakah ada jalan keluarnya?
Richard Ev
2
Jika Anda menjalankan powershell 3 atau lebih tinggi, lihat github.com/lzybkr/psreadline - traversal riwayat diperbaiki untuk pernyataan multiline.
x0n
43
Ruang di depan back-tick diperlukan # dipelajari-the-hard-way
Josh Graham
29
@ josh-graham Dan TIDAK boleh ada ruang (atau komentar sebaris) SETELAH tanda centang kembali. # learned-the-hard-way
RayLuo
1
Backticks rapuh (seperti komentar di atas menyatakan) dan sulit ditemukan ketika mengurai atau meninjau file. Jawaban @StevenPenny lebih baik jika Anda ingin kode debug lebih mudah.
mjd2
67

Metode lain untuk melewatkan argumen yang lebih bersih adalah splatting .

Tetapkan parameter dan nilai Anda sebagai hashtabel seperti ini:

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

Dan kemudian panggil commandlet Anda seperti ini:

Get-WmiObject @params

Microsoft Docs: Tentang Splatting

TechNet Magazine 2011: Windows PowerShell: Splatting

Sepertinya itu berfungsi dengan Powershell 2.0 dan lebih tinggi

BJHop
sumber
5
Ini luar biasa! DAN Anda dapat menambahkan parameter seperti ini: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder
1
Titik koma ok tapi berlebihan. Hanya diperlukan jika ada beberapa nilai per baris.
jim birch
38

Ah, dan jika Anda memiliki string yang sangat panjang yang ingin Anda hancurkan, katakanlah tentang HTML, Anda dapat melakukannya dengan meletakkan a @di setiap sisi luar "- seperti ini:

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

Anda mendapatkan persis ini:

Bob
went
to town
to buy
a fat
pig.

Dan jika Anda menggunakan Notepad ++ , ia bahkan akan menyorot dengan benar sebagai blok string.

Sekarang, jika Anda ingin string itu mengandung tanda kutip ganda juga, cukup tambahkan, seperti ini:

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

Anda akan mendapatkan ini:

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

Namun, jika Anda menggunakan tanda kutip ganda dalam @ -string seperti itu, Notepad ++ tidak menyadarinya dan akan mengganti pewarnaan sintaksis seolah-olah itu tidak dikutip atau dikutip, tergantung pada kasusnya.

Dan apa yang lebih baik adalah ini: di mana pun Anda memasukkan variabel $, itu TIDAK DIartikan! (Jika Anda membutuhkan tanda dolar dalam teks, Anda menghindarinya dengan tanda centang seperti ini: `` $ not-a-variable`.)

MEMPERHATIKAN! Jika Anda tidak menempatkan final "@di awal baris , itu akan gagal. Butuh satu jam bagi saya untuk mengetahui bahwa saya tidak bisa memasukkan itu dalam kode saya!

Berikut adalah MSDN pada subjek: Menggunakan Windows PowerShell "Here-Strings"

bgmCoder
sumber
1
Trik yang rapi, meskipun jika saya memiliki variabel $ ... sepertinya tidak berfungsi. Saya mendapatkan "karakter tidak diperbolehkan setelah header string di sini ..."
tofutim
Saya tidak berpikir Anda dapat merusak nama variabel, hanya sebuah string.
bgmCoder
19

Anda dapat menggunakan operator backtick:

& "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"

Itu masih agak terlalu lama untuk seleraku, jadi aku akan menggunakan beberapa variabel bernama:

$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
Aaron Jensen
sumber
1
Saya suka nama variabel di atas saran lain karena mungkin opsi yang paling mudah dibaca untuk para pakar non-powerhell. Jika saya melihat panduan tutorial / set-up yang menggunakan splatting, saya akan benar-benar kehilangan apa yang terjadi tanpa sub-tutorial tentang splatting. Demikian juga, backticks tampak rapuh dan mungkin kurang dikenal daripada variabel PS yang sudah dicoba dan benar.
Josh Desmond
13

Jika Anda memiliki fungsi:

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

Jika Anda memiliki cmdlet :

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

Jika Anda memiliki aplikasi:

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

Atau

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

Di PowerShell 5 dan PowerShell 5 ISE, Anda juga dapat menggunakan hanya Shift+ Enteruntuk pengeditan multiline (alih-alih backtick standar `pada akhir setiap baris):

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"
Buruk
sumber
0

Metode percikan dengan Perhitungan

Jika Anda memilih metode percikan, waspadalah perhitungan yang dilakukan menggunakan parameter lain. Dalam prakteknya, kadang-kadang saya harus mengatur variabel terlebih dahulu kemudian membuat tabel hash. Juga, format tidak memerlukan tanda kutip tunggal di sekitar nilai kunci atau titik koma (seperti disebutkan di atas).

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

Catatan: Array file berisi informasi yang akan memengaruhi bagaimana spreadsheet diisi.

Menandai
sumber
-1

Cara lain untuk memecah string di beberapa baris adalah dengan meletakkan ekspresi kosong di tengah-tengah string, dan memecahnya di garis:

string sampel:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

rusak melintasi garis:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Kirill Yunussov
sumber