วิธีแยกคำสั่งแบบยาวผ่านหลายบรรทัดใน PowerShell


227

คุณจะใช้คำสั่งดังต่อไปนี้ใน PowerShell และแยกมันเป็นหลายบรรทัดได้อย่างไร

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

ดูเพิ่มเติม ... stackoverflow.com/questions/3235850/…
SteveC

คำตอบ:


322

ตัวอักษร 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"

พื้นที่สีขาวมีความสำคัญ Space`Enterรูปแบบที่ต้องการ


1
ดูเหมือนว่านี่จะเป็นการทำลายฟังก์ชันคำสั่ง (ลูกศรขึ้น) ตามที่แต่ละบรรทัดแสดงเป็นคำสั่งแยกต่างหาก มีวิธีแก้ไขไหม?
Richard Ev

2
หากคุณใช้ powershell 3 หรือสูงกว่าดู github.com/lzybkr/psreadline - การสำรวจเส้นทางได้รับการแก้ไขสำหรับงบหลายบรรทัด
x0n

43
จำเป็นต้องใช้ช่องว่างด้านหน้าด้านหลังเห็บ # Learn-the-hard-way
Josh Graham

29
@ josh-graham และไม่ควรมีที่ว่างใด ๆ (หรือความคิดเห็นแบบอินไลน์) หลังติ๊ก #
learn

1
Backticks เปราะ (ตามที่ระบุไว้ข้างต้นแสดงความคิดเห็น) และหายากเมื่อแยกหรือตรวจสอบไฟล์ @StevenPenny คำตอบจะดีกว่าถ้าคุณต้องการแก้จุดบกพร่องรหัสได้ง่ายขึ้น
mjd2

67

วิธีอื่นสำหรับการส่งอาร์กิวเมนต์ที่สะอาดกว่านั้นคือการทำเครื่องหมาย splatting

กำหนดพารามิเตอร์และค่าของคุณเป็น hashtable ดังนี้:

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

จากนั้นเรียก commandlet ของคุณดังนี้:

Get-WmiObject @params

Microsoft Docs: เกี่ยวกับการ Splatting

TechNet Magazine 2011: Windows PowerShell: การแยกส่วน

ดูเหมือนว่าจะทำงานกับ Powershell 2.0 ขึ้นไป


5
มันยอดเยี่ยมมาก! และคุณสามารถเพิ่มพารามิเตอร์เช่นนี้: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder

1
อัฒภาคก็โอเค แต่ฟุ่มเฟือย ต้องการเฉพาะเมื่อมีหลายค่าต่อบรรทัด
jim birch

38

อาและถ้าคุณมีสตริงที่ยาวมาก ๆ ที่คุณต้องการแยกออกพูดถึง HTML คุณสามารถทำได้โดยการใส่@ด้านนอกของแต่ละด้าน"- เช่นนี้

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

คุณได้รับสิ่งนี้:

Bob
went
to town
to buy
a fat
pig.

และถ้าคุณใช้Notepad ++มันจะเน้นอย่างถูกต้องเป็นบล็อกสตริง

ตอนนี้ถ้าคุณต้องการให้สตริงนั้นมีเครื่องหมายคำพูดคู่ด้วยเช่นกันเพียงเพิ่มลงในแบบนี้

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

คุณจะได้รับสิ่งนี้:

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

อย่างไรก็ตามหากคุณใช้เครื่องหมายอัญประกาศคู่ใน @ -string เช่นนั้น Notepad ++ จะไม่ตระหนักถึงสิ่งนั้นและจะสลับการกำหนดสีไวยากรณ์ราวกับว่ามันไม่ได้ยกมาหรืออ้างถึงแล้วแต่กรณี

และสิ่งที่ดีกว่าก็คือ: ทุกที่ที่คุณแทรกตัวแปร $ มันจะถูกตีความ! (หากคุณต้องการเครื่องหมายดอลลาร์ในข้อความคุณสามารถหลีกเลี่ยงได้ด้วยเครื่องหมายถูกเช่นนี้: `` $ not-a-variable`.)

ข้อสังเกต! หากคุณไม่ใส่รอบสุดท้าย"@ที่จุดเริ่มต้นของบรรทัดมันจะล้มเหลว ฉันใช้เวลาหนึ่งชั่วโมงคิดว่าฉันไม่สามารถเยื้องในรหัสของฉัน!

นี่คือMSDNในหัวข้อ: การใช้ Windows PowerShell“ Here-Strings”


1
เคล็ดลับเรียบร้อยแม้ว่าถ้าฉันมีตัวแปร $ ... ดูเหมือนว่าจะไม่ทำงาน ฉันได้รับ "อักขระไม่ได้รับอนุญาตหลังจากส่วนหัวของสตริงที่นี่ ... "
tofutim

ฉันไม่คิดว่าคุณสามารถแบ่งชื่อตัวแปรเพียงแค่สตริง
bgmCoder

19

คุณสามารถใช้ตัวดำเนินการ 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"

นั่นยังคงนานเกินไปสำหรับรสนิยมของฉันดังนั้นฉันจะใช้ตัวแปรที่มีชื่อดี:

$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
ฉันชอบชื่อตัวแปรมากกว่าคำแนะนำอื่น ๆ เพราะอาจเป็นตัวเลือกที่อ่านง่ายที่สุดสำหรับผู้เชี่ยวชาญที่ไม่ใช่ PowerShell ถ้าฉันเห็นคู่มือการสอน / การตั้งค่าที่ใช้การทำเครื่องหมายฉันจะหายไปโดยสิ้นเชิงในสิ่งที่เกิดขึ้นโดยไม่ต้องมีการสอนย่อยในการทำเครื่องหมาย เช่นกัน backticks ดูเปราะบางและอาจเป็นที่รู้จักน้อยกว่าตัวแปร PS ที่ลองแล้วและจริง
Josh Desmond

13

หากคุณมีฟังก์ชั่น:

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

หากคุณมีcmdlet :

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

หากคุณมีแอปพลิเคชัน:

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

หรือ

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

3

ใน PowerShell 5 และ PowerShell 5 ISE คุณสามารถใช้เพียงShift+ Enterสำหรับการแก้ไขหลาย`บรรทัด(แทน backticks มาตรฐานที่ท้ายบรรทัดแต่ละบรรทัด):

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

วิธีการ Splat ด้วยการคำนวณ

หากคุณเลือกวิธี splat ให้ระวังการคำนวณที่ทำโดยใช้พารามิเตอร์อื่น ในทางปฏิบัติบางครั้งฉันต้องตั้งค่าตัวแปรก่อนแล้วจึงสร้างตารางแฮช นอกจากนี้รูปแบบไม่ต้องการเครื่องหมายคำพูดเดี่ยวรอบค่าคีย์หรือเซมิโคลอน (ดังที่ได้กล่าวไว้ข้างต้น)

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

หมายเหตุ: อาร์เรย์ไฟล์มีข้อมูลที่จะส่งผลต่อวิธีการเติมสเปรดชีต


-1

อีกวิธีในการแบ่งสตริงข้ามหลายบรรทัดคือการใส่นิพจน์ว่างไว้ตรงกลางของสตริงและแบ่งข้ามบรรทัด:

สตริงตัวอย่าง:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

หักข้ามเส้น:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.