मल्टी-लाइन कमांड कैसे दर्ज करें


425

क्या PowerShell कमांड लाइन को कई लाइनों पर विभाजित करना संभव है?

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


3
"बैकस्लैश क्यों नहीं" सवाल ब्रूस पेलेट के पॉवरशेल इन एक्शन में अच्छी तरह से कवर किया गया है ; महान पुस्तक। ब्रूस को प्रोग्रामिंग भाषाओं के इतिहास का व्यापक ज्ञान है। इस पुस्तक के V2 के लिए आगे देख रहे हैं।
Jay Bazuzi

3
की ... डुप्लीकेट stackoverflow.com/questions/2608144/...
SteveC

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

बस `चरित्र का उपयोग करने के लिए कई लाइनों पर अलग आदेश
असद शकील

जवाबों:


634

आप एक स्थान का उपयोग कर सकते हैं जिसके बाद गंभीर उच्चारण (बैकटिक):

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

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

Get-ChildItem |
  Select Name,Length

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

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

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

1,
2

ध्यान रखें, हालांकि, जावास्क्रिप्ट के समान स्वत: अर्द्धविराम निवेशन , वहाँ कुछ चीजें हैं जो इसी तरह टूट रहे हैं क्योंकि लाइन ब्रेक एक बिंदु जहां यह पर होता हैं है एक वैध बयान से पहले:

return
  5

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

अंत में, तार (सभी किस्मों में) एक भी रेखा से आगे बढ़ सकते हैं:

'Foo
bar'

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


4
और यह उल्लेख करना न भूलें कि कुछ अन्य टोकन भी लाइन मेंटेनर के रूप में कार्य करते हैं जैसे |और {
कीथ हिल

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

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

1
@JackDouglas: आप ओपनिंग कोष्ठक के बाद सीधे लाइन ब्रेक कर सकते हैं , लेकिन ऑपरेटर के सामने अभिव्यक्ति के भीतर नहीं, जाहिरा तौर पर। यह कहा जा रहा है, मेरा मानना ​​है कि व्याकरण में एक निरीक्षण होने के लिए।
जॉय

10
लाइन निरंतरता आईएसई कमांड फलक में काम नहीं करती है, जाहिरा तौर पर।
खौरी गियोर्डानो

64

मुझे अभी पता चला है कि बैक टिक और लाइन ब्रेक के बीच कोई चरित्र नहीं होना चाहिए । यहां तक ​​कि व्हाट्सएप भी काम नहीं करने का आदेश देगा।


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

4
इसलिए पॉवरशेल में लंबी लाइन को तोड़ने का अनिवार्य रूप से कोई मजबूत तरीका नहीं है। कोई आश्चर्य नहीं कि मैं उन 2-स्क्रीन-वाइड पॉवरशेल स्क्रिप्ट को हर जगह देख सकता हूं । # शकेमहेड
रायलूओ

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

2
Urgh। यह दस्तावेज़ या वेबसाइटों में पोस्ट करने के लिए पॉवरशेल कोड को अनावश्यक रूप से कठिन बना देता है, इस डर से कि शिफ्ट + एंटर का उपयोग करने पर कमांड को मानव द्वारा गलत पढ़ा जाएगा या बैक टिक का उपयोग करते समय आईएसई की कमांड लाइन में गलत तरीके से पार्स किया जाएगा।
21

टिप्पणी की प्रकृति के कारण डाउन-वोट (जो मूल प्रश्न का पूर्ण उत्तर नहीं है)।
कोडब्रीकर

38

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

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

    गेट-फू {{............}

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

    Get-फू
    {
        ...............
        ...............
        ...............
    }

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

    गेट-फू {
        ...............
        ...............
        ...............
    }

मैं लाइन-कंटीन्यू कैरेक्टर (`) का उपयोग कर सकता था, लेकिन यह हार्ड-टू-रीड कोड के लिए बनाता है, और बग को आमंत्रित करता है।

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

    अगर (शर्त) {
        .....
    }

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

इसके अलावा, लंबी पाइपलाइनों के मामले में, मैं पाइप चरित्र के बाद टूट जाता हूं ( |):

    $ परियोजना 
        ? {$ _। की-टेक "प्रोजेक्टफाइल"} |
        % {$ _। मान} | 
        % {$ _। मूल्यांकन किया हुआ} |
        % {
            .........
        }

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

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

2
@ बैच: "लेकिन यह काम नहीं करेगा" उन परिस्थितियों का जिक्र कर रहा है जहां आगे के पैरामीटर वैकल्पिक हैं, जो कि ज्यादातर मामले हैं।
Jay Bazuzi

1
आह मैं देख रहा हूँ कि तुम अब क्या मतलब है इसलिए "इफ" और "फॉरच" वास्तव में cmdlets नहीं हैं - वे व्याकरण के एक्टुअल भाग हैं, इस प्रकार यह अगली पंक्ति को देखने के लिए मजबूर करता है। क्या तब कोई उपयोगकर्ता-परिभाषित फ़ंक्शन को अगली पंक्ति से स्क्रिप्ट ब्लॉक पढ़ने देने का कोई तरीका नहीं है? मुझे लगता है कि आपके उपर्युक्त उत्तर ठीक से सवाल करते हैं।
नाच -

29

क्रिस्टोबालिटो के उत्तर पर विस्तार करने के लिए :

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

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

उदाहरण के लिए:

कमांड लाइन पर एक PowerShell स्क्रिप्ट पर हस्ताक्षर करें। कोई रेखा नहीं टूटती।

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

10
सवाल का जवाब नहीं, लेकिन आपके जवाब ने मेरे सवाल का जवाब दिया। :)
फ्रेडरिक

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

17

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


2
यह मल्टी-लाइन यहाँ-स्ट्रिंग्स को संपादित करने के लिए एक शानदार टिप है, जो कि यदि आप SHIFT-ENTERट्रिक नहीं जानते हैं तो संपादित करने के लिए भयानक हैं ।
dpw

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

@Bill_Stewart सच है, यह ISE कंसोल में PSReadline के बिना काम करता है, लेकिन कंसोल होस्ट में नहीं।
रिश्वतवादी

2
स्पष्ट करने के लिए: 1) PSReadlineमॉड्यूल केवल कंसोल होस्ट में काम करता है (आईएसई नहीं)। 2) उपयोग करते समय केवलShift+Enter कंसोल होस्ट में काम करता है । 3) हमेशा ISE में काम किया है। 4) यदि बिना कंसोल होस्ट का उपयोग करना , कार्यात्मक रूप से दबाने के बराबर है । PSReadlineShift+EnterPSReadlineShift+EnterEnter
Bill_Stewart

2
यह सही उत्तर है, जिसे स्वीकार किया गया है और जिसके पास 400 अप-वोट हैं, वह बहुत भ्रमित और बेकार है !!
फ़्लिकर

4

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

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

बस ऐसे दिखेगा:

$header = "Make,ComputerName,Model,Windows Version"

2

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

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


1
  1. ;अलग - अलग कमांड के लिए एक अर्ध-उपनिवेश का उपयोग करें
  2. \\किसी भी बैकस्लैश पर डबल बैकस्लैश बदलें \
  3. "'"PATH" जैसे कमांड स्विच करने के लिए सुरक्षित पते को पास करने के लिए उपयोग करें ।

यह ps1 कमांड लोकेल pfx प्रमाणपत्र स्थापित करता है।

powershell -Command "$pfxPassword = ConvertTo-SecureString -String "12345678" -Force -AsPlainText ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\My -Password $pfxPassword ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\Root -Password $pfxPassword"

0

पाइप, ब्रैकेट, कोष्ठक, ऑपरेटर, डॉट्स, यहां तक ​​कि अल्पविराम के साथ, पॉवरशेल में एक पंक्ति को जारी रखने के कई तरीके हैं। इसके बारे में यहाँ एक ब्लॉग है: https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html

आप फ़ॉरच्यू जैसे बयानों के बाद भी जारी रख सकते हैं।



0

मल्टीलाइन पर कमांड को अलग करने के लिए बस `वर्ण का उपयोग करें


0

बस यहां एक कोने का मामला जोड़ें। यह आपको 5 मिनट बचा सकता है। यदि आप क्रियाओं की एक श्रृंखला का उपयोग करते हैं, तो आपको "डालने की जरूरत है।" पंक्ति के अंत में, "` "(बैकटिक) के बाद एक स्थान छोड़ दें। मुझे यह सब बड़ी कठिनाईयों का सामना करने के बाद मिला है।

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.