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

पीछे चल रहा चरित्र, यानी

&"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
यह कमांड इतिहास (ऊपर तीर) की कार्यक्षमता को तोड़ने के लिए लगता है; जैसा कि प्रत्येक पंक्ति एक अलग कमांड के रूप में दिखाई देती है। क्या इसके चारों ओर एक रास्ता है?
रिचर्ड ईव

2
यदि आप 3 या उच्चतर शक्तियाँ चला रहे हैं, तो देखें github.com/lzybkr/psreadline - इतिहास ट्रावेल बहुस्तरीय बयानों के लिए नियत है।
x0n

43
बैक-टिक के सामने की जगह की आवश्यकता # सीखी-कड़ी है
जोश ग्राहम

29
@ जोश-ग्रैहम और बैक-टिक के बाद कोई स्थान (या इनलाइन टिप्पणी) नहीं होना चाहिए। # सीखा-कड़ी मेहनत से जिस तरह से
RayLuo

1
बैकटिक्स भंगुर हैं (जैसा कि ऊपर टिप्पणी राज्य में है) और किसी फ़ाइल को पार्स या समीक्षा करते समय ढूंढना मुश्किल है। यदि आप डिबग कोड को आसान करना चाहते हैं तो @StevenPenny का जवाब बेहतर है।
mjd2

67

क्लीनर तर्क पारित करने के लिए एक और तरीका होगा splatting

इस तरह एक हैशटेबल के रूप में अपने मापदंडों और मूल्यों को परिभाषित करें:

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

और फिर अपने कमांडलेट को इस तरह कॉल करें:

Get-WmiObject @params

Microsoft डॉक्स: स्पलैटिंग के बारे में

TechNet मैगज़ीन 2011: विंडोज पॉवरशेल: स्प्लैटिंग

ऐसा लगता है कि यह Powershell 2.0 और ऊपर के साथ काम करता है


5
यह अद्भुत है! और आप इस तरह से पैरामीटर जोड़ सकते हैं: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
bgmCoder

1
अर्धविराम ठीक हैं, लेकिन शानदार हैं। केवल आवश्यक है अगर प्रति पंक्ति कई मान हैं।
जिम बर्च

38

आह, और यदि आपके पास एक बहुत लंबी स्ट्रिंग है जिसे आप तोड़ना चाहते हैं, तो एचटीएमएल का कहना है, आप इसे @बाहरी के प्रत्येक तरफ डालकर कर सकते हैं "- जैसे:

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

आप इसे बिल्कुल प्राप्त करें:

Bob
went
to town
to buy
a fat
pig.

और यदि आप नोटपैड ++ का उपयोग कर रहे हैं , तो यह एक स्ट्रिंग ब्लॉक के रूप में भी सही ढंग से हाइलाइट करेगा।

अब, यदि आप चाहते हैं कि स्ट्रिंग में दोहरे उद्धरण शामिल हों, तो बस उन्हें इस तरह जोड़ें:

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

आपको ठीक यही मिलेगा:

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

हालाँकि, यदि आप उस @ की तरह डबल-कोट्स का उपयोग करते हैं, तो नोटपैड ++ को इस बात का अहसास नहीं होता है और सिंटैक्स रंग को बदल देगा जैसे कि केस के आधार पर इसे उद्धृत या उद्धृत नहीं किया गया था।

और यह क्या बेहतर है: कहीं भी आप एक $ चर डालें, यह व्याख्या नहीं करता है! (यदि आपको पाठ में डॉलर चिह्न की आवश्यकता है, तो आप इसे इस तरह टिक मार्क के साथ छोड़ सकते हैं: `` $ not-a -boy`)।

नोटिस! यदि आप लाइन"@ के बहुत शुरुआत में फाइनल नहीं डालते हैं , तो यह विफल हो जाएगा। मुझे यह पता लगाने में एक घंटे का समय लगा कि मैं अपने कोड में यह नहीं लिख सकता हूं!

यहाँ है MSDN : इस विषय पर विंडोज PowerShell "-स्ट्रिंग्स यहाँ" का उपयोग करना


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
मुझे अन्य सुझावों पर चर नाम पसंद हैं क्योंकि यह संभवतः गैर-पॉवरशेल विशेषज्ञों के लिए सबसे पठनीय विकल्प है। अगर मैंने एक ट्यूटोरियल / सेट-अप गाइड देखा, जिसका इस्तेमाल मैंने splatting पर किया था तो मैं पूरी तरह से खो जाएगा कि क्या splatting पर सब-ट्यूटोरियल के बिना चल रहा है। इसी तरह, backticks कमजोर लग रहा है और शायद सरल कोशिश की और सच PS चर की तुलना में कम अच्छी तरह से जाना जाता है।
जोश डेसमंड

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`

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

गणना के साथ स्प्लैट विधि

यदि आप स्पैट विधि चुनते हैं, तो अन्य मापदंडों का उपयोग करके की जाने वाली गणनाओं से सावधान रहें। व्यवहार में, कभी-कभी मुझे पहले चर सेट करना होता है, फिर हैश टेबल बनाना होता है। इसके अलावा, प्रारूप को मुख्य मूल्य या अर्ध-बृहदान्त्र (जैसा कि ऊपर बताया गया है) के आसपास एकल उद्धरणों की आवश्यकता नहीं है।

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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.