2010-07-13 17 views
263

क्या एकाधिक लाइनों पर पावरहेल कमांड लाइन को विभाजित करना संभव है?एक बहु-लाइन कमांड कैसे दर्ज करें?

विजुअल बेसिक में मैं अगली पंक्ति में कमांड जारी रखने के लिए अंडरस्कोर (_) का उपयोग कर सकता हूं।

+3

"क्यों नहीं बैकस्लैश" सवाल Action_ में ब्रूस Payette के _PowerShell में अच्छी तरह से कवर किया जाता है; महान किताब ब्रूस प्रोग्रामिंग भाषाओं के इतिहास का एक व्यापक ज्ञान है। इस पुस्तक के वी 2 के लिए तत्पर हैं। –

+3

डुप्लिकेट ... http://stackoverflow.com/questions/2608144/how-to-split-long-commands-over-multiple-lines-in-powershell – SteveC

+1

क्षमा करें अगर ऑफटॉपिक है लेकिन यदि आप स्क्रिप्ट सबमिट करना चाहते हैं 'sh' कमांड, बैश सम्मेलन धारण करते हैं ताकि आप बैकस्लैश का उपयोग कर सकें। उस स्थिति में आपकी स्क्रिप्ट में यूनिक्स स्टाइल एंडिंग भी होनी चाहिए। –

उत्तर

390

आप गंभीर लहजे (या बैकटिक) का उपयोग कर सकते हैं:

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

हालांकि, यह केवल कभी आवश्यक है ऐसे मामलों में के रूप में ऊपर दिखाए गए। आमतौर पर जब आप कमांड को उस बिंदु पर पूर्ण रूप से पूर्ण नहीं कर सकते हैं तो स्वचालित लाइन निरंतरता प्राप्त होती है।

Get-ChildItem | 
    Select Name,Length 

के बाद से | के बाद समस्याओं के बिना काम करेंगे आदेश पूरा के बाद से यह एक और पाइपलाइन तत्व कमी है नहीं किया जा सकता: यह एक नई पाइपलाइन तत्व शुरू करने भी शामिल है। इसके अलावा घुंघराले ब्रेसिज़ खोलने या कोष्ठकों के किसी भी अन्य प्रकार सीधे लाइन निरंतरता की अनुमति देगा:

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

| एक अल्पविराम भी कुछ संदर्भों में काम करेंगे करने के लिए समान:

1, 
2 

हालांकि ध्यान रखें,, समान जावास्क्रिप्ट के Automatic Semicolon Insertion में, कुछ चीजें हैं जो समान रूप से टूटी हुई हैं क्योंकि लाइन ब्रेक उस बिंदु पर होता है जहां मान्य कथन से पहले होता है:

return 
    5 

काम नहीं करेगा।

अंत में, तार (सभी किस्मों में) भी एक पंक्ति बाहर भी जा सकता:

'Foo 
bar' 

वे स्ट्रिंग के अंतर्गत लाइन ब्रेक, तो शामिल हैं।

+3

और यह उल्लेख करना न भूलें कि कुछ अन्य टोकन भी लाइन निरंतर के रूप में कार्य करते हैं उदा। '|' और '{'। –

+1

@ किथ: धन्यवाद, मैंने इसे शामिल किया। वे शायद उल्लेख करने के लिए बहुत स्पष्ट थे ;-) – Joey

+9

नहीं, भविष्य में संदर्भ के लिए इन अन्य वर्णों को दस्तावेज करना अच्छा होता है। –

1

मुझे लगता है कि आप कमांड लाइन पर बात कर रहे हैं - यदि यह एक स्क्रिप्ट में है, तो एक नई लाइन कमांड डिलीमीटर के रूप में कार्य करती है।

कमांड लाइन पर, अर्ध-कॉलन ';' का उपयोग करें

28

अधिकांश सी-जैसी भाषाओं में मैं अपने ब्रेसिज़ रखने के बारे में जानबूझ कर हूं जहां मुझे लगता है कि वे कोड को पढ़ने के लिए सबसे आसान बनाते हैं।

पावरशेल का पार्सर पहचानता है कि जब कोई बयान स्पष्ट रूप से पूरा नहीं होता है, और अगली पंक्ति को देखता है। उदाहरण के लिए, एक cmdlet कि एक वैकल्पिक स्क्रिप्ट ब्लॉक पैरामीटर लेता है कल्पना:

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

अगर स्क्रिप्ट ब्लॉक बहुत लंबा है, तो आप लिखने के लिए चाहते हो सकता है:

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

लेकिन यह काम नहीं करेगा: पार्सर दो बयान देखेंगे। पहला Get-Foo है और दूसरा एक स्क्रिप्ट ब्लॉक है। इसके बजाय, मैं लिखने:

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

मैं लाइन निरंतरता चरित्र (`) इस्तेमाल कर सकते हैं लेकिन यह है कि मुश्किल से पढ़ कोड के लिए बनाता है, और कीड़े आमंत्रित किया है।

क्योंकि इस मामले में पिछले लाइन पर होने के लिए खुला ब्रेस की आवश्यकता है, मैं हर जगह उस पैटर्न का पालन करें:

 
    if (condition) { 
     ..... 
    } 

ध्यान दें कि if बयानों भाषा व्याकरण में एक स्क्रिप्ट ब्लॉक की आवश्यकता होती है, तो पार्सर होगा स्क्रिप्ट ब्लॉक के लिए अगली पंक्ति को देखें, लेकिन स्थिरता के लिए, मैं एक ही पंक्ति पर खुली ब्रेस रखता हूं।

Simlarly, लंबी पाइपलाइन के मामले में, मैं पाइप चरित्र (|) के बाद तोड़:

 
    $project.Items | 
     ? { $_.Key -eq "ProjectFile" } | 
     % { $_.Value } | 
     % { $_.EvaluatedInclude } | 
     % { 
      ......... 
     } 
+0

तब 'if' और' foreach' और 'try' कैसे काम करता है? वे अगली पंक्ति पर स्क्रिप्ट ब्लॉक की अनुमति देते हैं ... इसका मतलब है कि यह संभव हो सकता है – Nacht

+0

@Nacht: जंगली स्मृति से: भाषा व्याकरण के अनुसार, स्क्रिप्ट ब्लॉक की आवश्यकता वाले बयान, एक को खोजने के लिए एक नई पंक्ति का विश्लेषण करेंगे। क्या कोई पुष्टि कर सकता है? –

+0

उम .... क्या यह आपकी पोस्ट का विरोधाभास नहीं करता है? - "लेकिन यह काम नहीं करेगा" – Nacht

21

मैं तुम्हें कमांड लाइन पर के बारे में बात कर रहे हैं मान - अगर यह एक स्क्रिप्ट में है , फिर एक नई लाइन कमांड डिलीमीटर के रूप में कार्य करता है।

कमांड लाइन पर, अर्ध-कॉलन ; का उपयोग करें, उदाहरण के लिए; बिना लाइन ब्रेक के कमांड लाइन पर एक पावरहेल-स्क्रिप्ट का संकेत दें।

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

प्रश्न का उत्तर नहीं है, लेकिन आपके उत्तर ने मेरे प्रश्न का उत्तर दिया। :) – Frederik

+1

यह दिलचस्प है, लेकिन ओपी क्या पूछ रहा था इसके विपरीत यह है। ओपी कई लाइनों में एक ही कमांड को विभाजित करना चाहता था; आपने समझाया कि कई आदेशों को एक पंक्ति पर कैसे जोड़ना है। –

41

बस पता चला कि वहाँ वापस टिक और लाइन ब्रेक के बीच किसी भी चरित्र नहीं होना चाहिए, यहां तक ​​कि खाली स्थान के आदेश करने के लिए काम नहीं होगा।

+5

हालांकि यह तकनीकी रूप से प्रश्न का उत्तर नहीं है, +1 क्योंकि यह बिल्कुल जरूरी है। मैंने इसे अभी तक कठिन तरीके से पाया है, और निश्चित रूप से जहां भी संभव हो भविष्य के विकास में बैक-टिक से बच जाएगा। –

+2

तो पावरहेल में एक लंबी लाइन तोड़ने के लिए अनिवार्य रूप से कोई मजबूत तरीका नहीं है। कोई आश्चर्य नहीं कि मैं उन [2-स्क्रीन-व्यापी शक्तियों की स्क्रिप्ट] देखता हूं (http://stackoverflow.com/questions/2608144/how-to-split-long-commands-over-multiple-lines-in-powershell) प्रत्येक कहा पे। #ShakeMyHead – RayLuo

+0

मैं इसके साथ भी संघर्ष कर रहा था ... आप इस टिप्पणी को शामिल करने के लिए बैक-टिक से पहले एक इनलाइन टिप्पणी डाल सकते हैं, जैसे: कुछ-कमांड ' -arg1 <# तर्क 1 #>' -arg2 <# तर्क 2 #> – joelsand

6

PowerShell और PowerShell आईएसई में, यह भी बहु संपादन (मानक बैकटिक ` के बजाय) के लिए प्रत्येक पंक्ति के अंत में SHIFT+ENTER उपयोग करना संभव है।

+1

यह बहु-रेखा यहां-तारों को संपादित करने के लिए एक महान युक्ति है, जो आपको संपादित करने के लिए अन्यथा भयानक हैं यदि आपको 'शिफ्ट-एंटर' चाल नहीं पता है। – dpw

+1

मेरा मानना ​​है कि यह 'PSReadLine' मॉड्यूल या समकक्ष का उपयोग करते समय केवल PowerShell के कंसोल संस्करण में है। मानक विंडोज कंसोल इनपुट फ़ंक्शंस में, 'एंटर' और 'शिफ्ट + एंटर' कार्यात्मक रूप से समकक्ष हैं। –

+0

@Bill_Stewart सच है, यह PSReadline के बिना आईएसई कंसोल में काम करता है, लेकिन कंसोल होस्ट में नहीं। – briantist

0

यदि आप कई लाइनों में स्ट्रिंग को अलग करने की कोशिश कर रहे हैं, तो आप "+" का उपयोग कर सकते हैं। उदाहरण के लिए:

$header = "Make," + 

      "ComputerName," + 

      "Model," + 

      "Windows Version" 

दिखेगी जैसे:

$header = "Make,ComputerName,Model,Windows Version" 
संबंधित मुद्दे