পরবর্তী কমান্ডের আগে পাওয়ারশেলকে প্রতিটি কমান্ড শেষ হওয়ার অপেক্ষা করতে বলুন কীভাবে?


212

মাত্র একগুচ্ছ অ্যাপ্লিকেশন খোলার জন্য আমার কাছে পাওয়ারশেল 1.0 স্ক্রিপ্ট রয়েছে। প্রথমটি ভার্চুয়াল মেশিন এবং অন্যগুলি বিকাশ অ্যাপ্লিকেশন। আমি চাই ভার্চুয়াল মেশিনটি বাকী অ্যাপ্লিকেশনগুলি খোলার আগে বুট করা শেষ করে।

ব্যাশে আমি শুধু বলতে পারি "cmd1 && cmd2"

এটাই আমি পেয়েছি ...

C:\Applications\VirtualBox\vboxmanage startvm superdooper
    &"C:\Applications\NetBeans 6.5\bin\netbeans.exe"

উত্তর:


367

সাধারণত, অভ্যন্তরীণ কমান্ডগুলির জন্য পাওয়ারশেল পরবর্তী কমান্ডটি শুরু করার আগে অপেক্ষা করে না। এই নিয়মের একটি ব্যতিক্রম বহিরাগত উইন্ডোজ সাবসিস্টেম ভিত্তিক EXE। প্রথম কৌশলটি Out-Nullপছন্দ করতে পাইপলাইন হ'ল :

Notepad.exe | Out-Null

পাওয়ারশেল নোটপ্যাড.অ্যাক্সি প্রক্রিয়াটি চালিয়ে যাওয়ার আগে থেকে বের হওয়া পর্যন্ত অপেক্ষা করবে। কোডটি পড়া থেকে নেওয়া নিফটি কিন্তু সূক্ষ্ম of আপনি ওয়েট প্যারামিটার দিয়ে স্টার্ট-প্রক্রিয়াটিও ব্যবহার করতে পারেন:

Start-Process <path to exe> -NoNewWindow -Wait

আপনি যদি পাওয়ারশেল সম্প্রদায় সম্প্রসারণ সংস্করণ ব্যবহার করেন তবে তা হ'ল:

$proc = Start-Process <path to exe> -NoNewWindow -PassThru
$proc.WaitForExit()

পাওয়ারশেল ২.০-এ অন্য একটি বিকল্প হ'ল ব্যাকগ্রাউন্ড জব ব্যবহার করা:

$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job

2
আমার খারাপ। স্টার্ট-প্রক্রিয়া-ওয়েট দুর্দান্ত কাজ করে তবে এখন আমি এটি যা দেখছিলাম তা নয় ... আমি আসলে ভিএম বুটিং শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাইছি। আমি ধারণা করি যে এটি শক্ত হতে চলেছে। আমি মনে করি এর জন্য আমাকে একটি নতুন থ্রেড খুঁজতে হবে। ধন্যবাদ তবে।
জন মে

7
ব্রিলিয়ান্ট, | out-nullআমার যা প্রয়োজন ঠিক তা-ই করেছেন। ব্যবহার করার চেষ্টা করেছি Start-Jobকিন্তু কারণ আমি পরামিতি হিসাবে ফাংশনগুলির ফলাফলগুলি পাস করছি, এটি আমার উপর কিছুটা স্কিটসয়েড পেয়েছিল, তাই আমি শেষ পরামর্শটি ব্যবহার করতে পারিনি ...
jcolebrand

6
পার্শ্ব নোট হিসাবে, আপনার যদি একাধিক যুক্তি দিয়ে পাস করতে -ArgumentListহয় তবে এগুলি কমা দিয়ে আলাদা করুন -ArgumentList /D=test,/S
sschuberth

1
সরল "<< পথের উদাহরণ> | আউট-নাল" সমাধানের জন্য আপনাকে ধন্যবাদ! "স্টার্ট-প্রসেস <<<<<<<NewWindow -Wait" পদ্ধতিটি নিয়ে সমস্যাটি হ'ল পিতা-মাতার দ্বারা উত্পন্ন সমস্ত শিশু প্রক্রিয়া সম্পূর্ণ না হওয়া পর্যন্ত পাওয়ারশেল বিরতি দেয়, এমনকি পিতা-মাতার আগেই বন্ধ হয়ে যায়। এটি আমাদের সেটআপ প্রোগ্রামের সমস্যার কারণ হয়ে দাঁড়িয়েছে।
জ্যাক্স 21

স্টার্ট-আজুরআরআরএমভিএম-রিসোর্সগ্রুপনাম ource রিসোর্সগ্রুপনাম-নাম $ ভিএমনাম শুরু করার জন্য এটিই আমি কোনও ভিএম-এর অপেক্ষার জন্য ব্যবহার করি ((অ্যাজুরিআরএমএম-রিসোর্সগ্রুপনেম $ রিসোর্সগ্রুপনেম-নাম $ ভিএমনেট-স্ট্যাটাস | Statরূপ -পরিষদ? `রূপ -পরিচয়? _.কোড-ম্যাচ "পাওয়ার স্টেট"} |-নির্বাচন করুন -প্রসারণপ্রপ্রেটি ডিসপ্লেস্ট্যাটাস) -ne "ভিএম চলমান") {স্টার্ট-স্লিপ-এস 2} স্টার্ট-স্লিপ-এস 5 ## ভিএমকে আসার সময় দিন যাতে এটি গ্রহণ করতে পারে দূরবর্তী অনুরোধগুলি
অ্যান্ড্রুভো

47

ব্যবহারের সাথে সাথে Start-Process -Wait, এক্সিকিউটেবলের আউটপুট পাইপিং পাওয়ারের শেলটিকে অপেক্ষা করবে। প্রয়োজনের উপর নির্ভর করে, আমি সাধারণত পাইপ থেকে Out-Null, Out-Default, Out-Stringবা Out-String -Streamএখানে কিছু অন্যান্য আউটপুট বিকল্পের একটি দীর্ঘ তালিকা রয়েছে।

# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String

# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }

# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com

আপনি যে সিএমডি / বাশ স্টাইল অপারেটরগুলি উল্লেখ করেছেন তা মিস করছি না (এবং, &&, ||)। মনে হচ্ছে পাওয়ারশেলের সাথে আমাদের আরও ভার্বোজ হতে হবে ।


আপনার যদি আউটপুট পার্স করতে হয় তবে এটি একটি অবিশ্বাস্যভাবে ভাল সমাধান!
জান রোথকেগেল

কথা উল্লেখ করে আউট-XXXX redirectors দ্রুত অনুমতি তালিকা না আমাকে বুঝতে কেন আমি ব্যবহার করা উচিত -ডিফল্ট আউট পরিবর্তে আউট-নাল , যেহেতু আমি কনসোল আউটপুট থাকার প্রয়োজন ছিল।
জুলিও নোব্রে

নোট করুন যে কনসোল অ্যাপ্লিকেশনগুলি সিঙ্ক্রোনালি কার্যকর করতে কোনও অতিরিক্ত কাজ প্রয়োজন নেই - কোনও শেলের মতো এটিই ডিফল্ট আচরণ। থেকে বংশীধ্বনিতুল্য পরিবর্তন আউটপুট একটি করার একক, মাল্টি লাইন স্ট্রিং ডিফল্ট আয় দ্বারা একটি, যেহেতু PowerShell লাইনের অ্যারে । কনসোল অ্যাপ্লিকেশনগুলির জন্য এড়ানো উচিত (যদি না আপনি সত্যিই তাদের নতুন উইন্ডোতে চালাতে চান ) কারণ আপনি তাদের আউটপুট ক্যাপচার বা পুনঃনির্দেশ করতে সক্ষম হবেন না। Out-String Start-Process
mklement0

প্রকৃতপক্ষে, কোনও নেটিভ কমান্ড সিঙ্ক্রোনসিভভাবে চালিত হয় (আউটপুট সহ) বা অ্যাসিঙ্ক্রোনিকভাবে এক্সিকিউটেবলের উপর নির্ভর করে। উদাহরণস্বরূপ, আউটপুট ক্যাপচার না করে, নিম্নলিখিতগুলি কেবল "বিঙ্গো" আউটপুট দেয়। & 'সি: \ প্রোগ্রাম ফাইলগুলি মজিলা ফায়ারফক্স \ ফায়ারফক্স.এক্সি' -? ; 'বিঙ্গো'
নাথান হার্টলি

12

কেবল "অপেক্ষা করুন প্রক্রিয়া" ব্যবহার করুন:

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

কাজ শেষ


8

আপনি যদি ব্যবহার Start-Process <path to exe> -NoNewWindow -Wait

-PassThruআউটপুট প্রতিধ্বনি করতে আপনি বিকল্পটিও ব্যবহার করতে পারেন ।


দ্রষ্টব্য যে আউটপুট-PassThru প্রতিধ্বনিত হয় না (সংজ্ঞা অনুসারে একটি নন-কনসোল-অ্যাপ্লিকেশন কনসোল আউটপুট উত্পাদন করবে না), এটি সদ্য চালু হওয়া প্রক্রিয়াটির প্রতিনিধিত্ব করে এমন একটি উদাহরণ দেয়, যাতে আপনি এর বৈশিষ্ট্যগুলি পরীক্ষা করতে পারেন এবং এটির পরে বেরিয়ে যাওয়ার জন্য অপেক্ষা করতে পারেন। System.Diagnostics.Process
mklement0

6

কিছু প্রোগ্রাম আউটপুট স্ট্রিমটি খুব ভালভাবে প্রক্রিয়া করতে Out-Nullপারে না , পাইপ ব্যবহার করে এটি ব্লক নাও করতে পারে।
এবং তত্ক্ষণাত পাস করার Start-Processজন্য -ArgumentListসুইচ দরকার , এতটা সুবিধাজনক নয়।
আরও একটি উপায় আছে।

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)

1
এই কলটিতে একাধিক যুক্তি কীভাবে কাজ করবে? তারা কিভাবে সীমানা হয়? কেউ কীভাবে বিভিন্ন নেস্টেড স্ট্রিংকে পালাতে পারে? TY!
অ্যানি দ্য অ্যাজিল

1
@ অ্যানিএইগিলি ডক চার্চ পলায়নের জন্য ব্যাকস্ল্যাশ ব্যবহারের জন্য যুক্তিগুলি পৃথক করতে স্পেস ব্যবহার করেন
ইফ্রি

ty @ free, আমি সেভাবে চালানোর জন্য পরীক্ষার অসম্পূর্ণতা পেয়েছি! স্থানের সীমানা যুক্তিগুলির তালিকার চারপাশে আমি একক উদ্ধৃতি ব্যবহার করেছি [[1]; তবে এখন প্রতিধ্বনি $ exitcode = মিথ্যা, যা আমার রিটার্ন কোডটি প্রক্রিয়া থেকে ছিল না? [1] $ প্রস্থানকোড = [ডায়াগনস্টিক্স ro প্রসেস] :: শুরু ("সি: \ প্রোগ্রাম ফাইল (x86) \ স্মার্টবিয়ার \ টেস্ট কমপ্লিট 10 \ বিন \ টেস্টকমলিট.অ্যাক্সি", "" সি: \ ব্যবহারকারীগণ \ এমই \ ডকুমেন্টস \ টেস্ট কমপ্লিট 10 প্রজেক্টস \ হাইজি 4 টেস্টপ্রজেক্ট 1 \ জিগ 4 টেস্টপ্রোজেক্ট 1.pjs "/ রান / প্রকল্প: মাইপ্রোজ / পরীক্ষা:" কীওয়ার্ড টেস্টস | zTdd1_ ভাল "/ প্রস্থান ') aউইটফোরএক্সিট (60)
অ্যানিএজিলে

3

বিকল্প সহ -NoNewWindowআমাকে একটি ত্রুটি দেয়:Start-Process : This command cannot be executed due to the error: Access is denied.

আমি এটির কাজ পেতে পেতাম কেবলমাত্র কলটি ছিল:

Start-Process <path to exe> -Wait

0

এটিকে আরও এগিয়ে নিয়ে যাওয়া আপনি এমনকি ফ্লাইতে পার্স করতে পারেন

যেমন

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}

0

সেখানে সর্বদা সেমি। আপনার যদি প্রারম্ভিক প্রক্রিয়াতে যুক্তি উদ্ধৃত করতে সমস্যা হয় তবে এটি কম বিরক্তিকর হতে পারে:

cmd /c start /wait notepad
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.