মাল্টি-লাইন কমান্ড কীভাবে প্রবেশ করা যায়


425

পাওয়ারশেল কমান্ড লাইনকে একাধিক লাইনের উপর ভাগ করা কি সম্ভব?

ভিজ্যুয়াল বেসিকটিতে আমি _পরবর্তী লাইনে কমান্ডটি চালিয়ে যাওয়ার জন্য আন্ডারস্কোর ( ) ব্যবহার করতে পারি ।


3
ব্রুস পেয়েটের পাওয়ারশেল ইন অ্যাকশনে "কেন ব্যাকস্ল্যাশস নয়" প্রশ্নটি দুর্দান্তভাবে কভার করা হয়েছে ; দুর্দান্ত বই ব্রুস প্রোগ্রামিং ভাষার ইতিহাস সম্পর্কে বিস্তৃত জ্ঞান রাখে। এই বইয়ের ভি 2 এর অপেক্ষায় রয়েছি।
জে বাজুজি


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
@ জ্যাকডুগ্লাস: খোলার প্রথম বন্ধনের পরে আপনার সরাসরি একটি লাইন ব্রেক হতে পারে , তবে অপারেটরের সামনে প্রকাশের সাথে প্রকাশের মধ্যে নয়। বলা হচ্ছে, আমি ব্যাকরণ একটি তদারকি হতে বিশ্বাস করি যে।
জোয়

10
স্পষ্টতই, আইএসই কমান্ড ফলকে লাইন ধারাবাহিকতা কার্যকর করে না।
খৌরি জিওর্দানো

64

আমি সবেমাত্র জানতে পেরেছিলাম যে ব্যাক টিক এবং লাইন ব্রেকের মধ্যে অবশ্যই কোনও চরিত্র নেই। এমনকি হোয়াইটস্পেস কমান্ডটি কাজ না করার কারণ ঘটায়।


10
যদিও এটি প্রযুক্তিগতভাবে প্রশ্নের উত্তর নয়, এটি +1 কারণ এটি একেবারে প্রয়োজনীয়। আমি কেবল এটি হার্ড উপায়টি খুঁজে পেয়েছি এবং ভবিষ্যতের উন্নয়নে যেখানেই সম্ভব সেখানে অবশ্যই এড়ানো হবে।
ডেভ মার্কেল

4
সুতরাং পাওয়ারশেলটিতে লম্বা লাইন ভাঙার জন্য কোনও জোরালো উপায় নেই। আশ্চর্যের কিছু নেই যে আমি যেখানেই 2-স্ক্রিন-প্রশস্ত পাওয়ারশেল স্ক্রিপ্টগুলি দেখতে পাই । # শেকমাইহাইড
রায়লুও

আমি এটির সাথেও লড়াই করে যাচ্ছিলাম ... আপনি কোনও মন্তব্য অন্তর্ভুক্ত করার জন্য ব্যাক-টিকের আগে একটি ইনলাইন মন্তব্য সন্নিবেশ করতে পারেন: সামার-কমান্ড ar -আর্গ 1 <# আরগ 1 #> explain -আর্গ 2 <# ব্যাখ্যা আরগ 2 #>
joelsand

2
Urgh। এটি পাওয়ারশেল কোডটি ডকুমেন্টেশন বা ওয়েবসাইটে পোস্ট করা অপ্রয়োজনীয়ভাবে শক্ত করে তোলে, এই ভয়ে যে শিফট + এন্টার ব্যবহার করে কমান্ডটি কোনও লোক ভুল দ্বারা পড়ে ফেলবে, বা পিছনের টিকটি ব্যবহার করার সময় আইএসইয়ের কমান্ড লাইনে ভুল বিভক্ত হবে।
গিটারপিকার 21

মতামত প্রকৃতির কারণে ডাউন-ভোট (যা মূল প্রশ্নের সম্পূর্ণ উত্তর নয়)।
কোডব্রিকার

38

বেশিরভাগ সি-এর মতো ভাষায় আমি আমার ধনুর্বন্ধনীগুলি রাখার বিষয়ে ইচ্ছাকৃতভাবে যেখানে আমার মনে হয় তারা কোডটি পড়া সবচেয়ে সহজ করে তোলে।

পাওয়ারশেলের পার্সার সনাক্ত করে যখন কোনও বিবৃতি স্পষ্টভাবে সম্পূর্ণ হয়নি এবং পরবর্তী লাইনে তাকান। উদাহরণস্বরূপ, একটি সেমিডলেট কল্পনা করুন যা একটি alচ্ছিক স্ক্রিপ্ট ব্লক প্যারামিটার নেয়:

    গেট-ফু {............}

যদি স্ক্রিপ্ট ব্লকটি দীর্ঘ হয় তবে আপনি লিখতে চাইতে পারেন:

    পান-ফু
    {
        ...............
        ...............
        ...............
    }

তবে এটি কাজ করবে না: পার্সার দুটি বিবৃতি দেখতে পাবে। প্রথমটি Get-Fooএবং দ্বিতীয়টি একটি স্ক্রিপ্ট ব্লক। পরিবর্তে, আমি লিখছি:

    গেট-ফু {
        ...............
        ...............
        ...............
    }

আমি লাইন-ধারাবাহিকতা অক্ষর (`) ব্যবহার করতে পারতাম তবে এটি হার্ড-টু-পঠন কোড তৈরি করে এবং বাগগুলিকে আমন্ত্রণ জানায়।

যেহেতু এই ক্ষেত্রে খোলা ব্রেসটি পূর্ববর্তী লাইনে থাকা দরকার, আমি সেই প্যাটার্নটি সর্বত্র অনুসরণ করি:

    যদি (শর্ত) {
        .....
    }

নোট করুন যে ifবিবৃতিগুলির জন্য ভাষার ব্যাকরণে একটি স্ক্রিপ্ট ব্লক প্রয়োজন, সুতরাং পার্সার স্ক্রিপ্ট ব্লকের জন্য পরবর্তী লাইনে দেখবে, তবে ধারাবাহিকতার জন্য, আমি একই রেখায় খোলা বন্ধনীটি রেখেছি।

একত্রে, দীর্ঘ পাইপলাইনগুলির ক্ষেত্রে, আমি পাইপের চরিত্রটি ভেঙে ফেলি ( |):

    $ project.Items | 
        ? -$ _। কী -eq "প্রজেক্টফিল"} |
        % {$ _। মান} | 
        % {$ _। মূল্যায়নকেন্দ্র lude |
        %
            .........
        }

কিভাবে ifএবং foreachএবং tryকাজ তারপর? তারা পরের লাইনে স্ক্রিপ্ট ব্লকগুলিকে অনুমতি দেয় ... এর অর্থ এটি সম্ভব হতে পারে
নচট - মনিকা

@ নচট: মরিচা মেমরি থেকে: ভাষাগুলির প্রতি লিপিগুলির জন্য একটি স্ক্রিপ্ট ব্লক প্রয়োজন এমন বিবৃতিগুলি একটি সন্ধানের জন্য একটি নিউলাইন পেরিয়ে যায়। কেউ কি নিশ্চিত করতে পারবেন?
জে বাজুজি

2
@ নচট: "তবে এটি কাজ করবে না" এমন পরিস্থিতিতে উল্লেখ করেছিল যেখানে পরবর্তী পরামিতিগুলি alচ্ছিক, যা বেশিরভাগ ক্ষেত্রে।
জে বাজুজি

1
আহ আমি এখন আপনি কি বলতে চাইছেন। সুতরাং "যদি" এবং "ফোরচ" প্রকৃতপক্ষে সেমিডলেটস নয় - এগুলি ব্যাকরণের একটি বাস্তব অংশ, সুতরাং এটি পরের লাইনে অতীত দেখার জন্য বাধ্য করে। তাহলে কি কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটি পরবর্তী লাইন থেকে কোনও স্ক্রিপ্ট ব্লক পড়তে দেবে? আমি মনে করি আপনার উপরের উত্তরগুলি সেই প্রশ্নের সঠিক উত্তর দিয়েছে।
নচট - মনিকা

29

ক্রিস্টোবালিতোর উত্তরে প্রসারিত করতে :

আমি ধরে নিয়েছি আপনি কমান্ড-লাইনে কথা বলছেন - যদি এটি কোনও স্ক্রিপ্টে থাকে, তবে একটি নতুন লাইন> কমান্ড ডিলিমিটার হিসাবে কাজ করে।

কমান্ড লাইনে, একটি আধা-কোলন ব্যবহার করুন ';'

উদাহরণ স্বরূপ:

কমান্ড-লাইনে একটি পাওয়ারশেল স্ক্রিপ্ট স্বাক্ষর করুন। কোন লাইন বিরতি।

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

10
প্রশ্নের উত্তর নয়, তবে আপনার উত্তরটি আমার প্রশ্নের উত্তর দিয়েছে। :)
ফ্রেডেরিক

1
এটি আকর্ষণীয়, তবে এটি ওপি যা জিজ্ঞাসা করেছিল তার বিপরীত। ওপি বেশ কয়েকটি লাইনে একক কমান্ডকে বিভক্ত করতে চেয়েছিল; আপনি ব্যাখ্যা করেছেন যে কীভাবে কয়েকটি কমান্ড এক লাইনে একত্রিত করতে হয়।
ড্যানিয়েল ইয়ানকোভস্কি

17

পাওয়ারশেল এবং পাওয়ারশেল আইএসইতে, একাধিক লাইন সম্পাদনার জন্য (স্ট্যান্ডার্ড ব্যাকটিকের পরিবর্তে ) প্রতিটি লাইনের শেষে Shift+ ব্যবহার করা সম্ভব ।Enter`


2
মাল্টি-লাইন এখানে স্ট্রিংগুলি সম্পাদনা করার জন্য এটি একটি দুর্দান্ত পরামর্শ, যা যদি আপনি SHIFT-ENTERকৌশলটি জানেন না তবে সম্পাদনা করা অন্যথায় ভয়ঙ্কর ।
dpw

1
আমি বিশ্বাস করি কেবলমাত্র PSReadLineমডিউল বা সমতুল্য ব্যবহার করার সময় পাওয়ারশেলের কনসোল সংস্করণে এটি ঘটে । স্ট্যান্ডার্ড উইন্ডোজ কনসোল ইনপুট ফাংশনগুলিতে, Enterএবং Shift+Enterকার্যত সমতুল্য।
বিল_সেটওয়ার্ট

@ বিল_সেটওয়ার্ট সত্য, এটি পিএসআরডলাইন ছাড়া আইএসই কনসোলে কাজ করে তবে কনসোল হোস্টে নয়।
ব্রিটিশবাদী

2
নির্মল: 1) PSReadlineমডিউল কনসোল হোস্ট কাজ করে শুধুমাত্র (না ISE)। 2) ব্যবহার করার সময় কেবলShift+Enter কনসোল হোস্টে কাজ করে । 3) সর্বদা আইএসইতে কাজ করেছে। 4) ছাড়া কনসোল হোস্ট ব্যবহার যদি , বৈশিষ্ট্যগুলি টিপে সমতূল্য । PSReadlineShift+EnterPSReadlineShift+EnterEnter
বিল_সেটওয়ার্ট

2
এটি সঠিক উত্তর, যা গ্রহণযোগ্য এবং 400 টি আপ-ভোট রয়েছে তা অত্যন্ত বিভ্রান্তিকর এবং অকেজো !!
ফ্লিকার

4

আপনি যদি একাধিক লাইনে স্ট্রিংগুলিকে আলাদা করার চেষ্টা করছেন তবে আপনি "+" ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

দেখতে ঠিক তেমন দেখাবে:

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

2

আমি ধরে নিচ্ছি আপনি কমান্ড-লাইনে কথা বলছেন - যদি এটি কোনও স্ক্রিপ্টে থাকে, তবে একটি নতুন লাইন কমান্ড ডিলিমিটার হিসাবে কাজ করে।

কমান্ড লাইনে, একটি আধা-কোলন ব্যবহার করুন ';'


1
  1. ;পৃথক কমান্ডের জন্য একটি আধা-কোলন ব্যবহার করুন
  2. যে \\কোনও ব্যাকস্ল্যাশগুলিতে ডাবল ব্যাকস্ল্যাশ প্রতিস্থাপন করুন \
  3. "'"'PATH'" এর মতো কমান্ড স্যুইচ করতে নিরাপদ ঠিকানা পাস করার জন্য ব্যবহার করুন ।

এই PS1 কমান্ডটি ইনস্টল করুন লোকাল পিএফএক্স শংসাপত্র।

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-n Natural-line.html

আপনি ভবিষ্যদ্বাণী মত বিবৃতি পরে ঠিক চালিয়ে যেতে পারেন এবং পাশাপাশি।




0

এখানে একটি কোণার কেস যুক্ত করুন। এটি আপনার 5 মিনিট সাশ্রয় করতে পারে। আপনি যদি ক্রমের একটি শৃঙ্খলা ব্যবহার করেন, আপনাকে "চাপানো" দরকার। লাইনের শেষে, "` "(ব্যাকটিক) এর পরে একটি স্থান রেখে দিন। আমি এটি হার্ড উপায় খুঁজে পেয়েছি।

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.