দ্রষ্টব্য: প্রশ্নের কমান্ডটি ব্যবহার করে Start-Process
, যা লক্ষ্য প্রোগ্রামের আউটপুট সরাসরি ক্যাপচারিং বাধা দেয়। সাধারণত, কনসোল অ্যাপ্লিকেশনগুলি সিঙ্ক্রোনালি কার্যকর করতে ব্যবহার করবেন না Start-Process
- কেবল কোনও শেলের মতোই সরাসরি তাদের অনুরোধ করুন । এটি করার ফলে অ্যাপ্লিকেশনটি কলিং কনসোলের স্ট্যান্ডার্ড স্ট্রিমের সাথে সংযুক্ত রাখে, এর আউটপুটটিকে সাধারণ অ্যাসাইনমেন্ট দ্বারা ক্যাপচার করা যায় $output = netdom ...
, নীচে বিস্তারিত হিসাবে।
মৌলিকভাবে , বাহ্যিক ইউটিলিটিগুলি থেকে আউটপুট ক্যাপচার পাওয়ারশেল-নেটিভ কমান্ডগুলির সাথে একইভাবে কাজ করে (আপনি কীভাবে বাহ্যিক সরঞ্জামগুলি কার্যকর করতে পারেন তার জন্য একটি রিফ্রেশার চাইতে পারেন ):
$cmdOutput = <command> # captures the command's success stream / stdout
নোট করুন যে 1 টির বেশি আউটপুট অবজেক্ট তৈরি করলে অবজেক্টগুলির $cmdOutput
একটি অ্যারে প্রাপ্ত হয় , যা বাহ্যিক প্রোগ্রামের ক্ষেত্রে প্রোগ্রামের আউটপুট লাইনগুলি যুক্ত স্ট্রিং অ্যারের অর্থ ।
আপনি যদি সর্বদা একটি একক - সম্ভাব্য বহু-লাইন - স্ট্রিং পেতে চান তবে ব্যবহার করুন<command>
$cmdOutput
$cmdOutput = <command> | Out-String
করার ক্যাপচার একটি পরিবর্তনশীল ফলাফল এবং পর্দা মুদ্রণ :
<command> | Tee-Object -Variable cmdOutput # Note how the var name is NOT $-prefixed
বা, যদি <command>
একটি সেমিডলেট বা উন্নত ফাংশন হয় তবে আপনি সাধারণ পরামিতি
-OutVariable
/-ov
:
<command> -OutVariable cmdOutput # cmdlets and advanced functions only
উল্লেখ্য যে -OutVariable
, অসদৃশ অন্যান্য পরিস্থিতিতে, $cmdOutput
হয় সবসময় একটি সংগ্রহ , এমনকি যদি শুধুমাত্র এক বস্তু আউটপুট। বিশেষত, অ্যারের মতো [System.Collections.ArrayList]
ধরণের একটি উদাহরণ ফিরে আসে। এই তাত্ক্ষণিকতার আলোচনার জন্য এই গিটহাব ইস্যুটি
দেখুন ।
একাধিক কমান্ড থেকে আউটপুট ক্যাপচার করতে , হয় একটি subexpression ( $(...)
) ব্যবহার করুন বা স্ক্রিপ্ট ব্লক কল করুন ( { ... }
) এর সাথে &
বা .
:
$cmdOutput = $(<command>; ...) # subexpression
$cmdOutput = & {<command>; ...} # script block with & - creates child scope for vars.
$cmdOutput = . {<command>; ...} # script block with . - no child scope
নোট করুন যে সাধারণকে &
(কল অপারেটর) একটি পৃথক কমান্ড যার নাম / পাথ উদ্ধৃত হয় - যেমন $cmdOutput = & 'netdom.exe' ...
- প্রতি সে বাইরের প্রোগ্রামের সাথে সম্পর্কিত নয় (এটি পাওয়ারশেল স্ক্রিপ্টগুলিতে সমানভাবে প্রযোজ্য ) এর সাথে প্রিফিক্স করা দরকার , তবে এটি একটি সিনট্যাক্স প্রয়োজনীয়তা : পাওয়ারশেল ডিফল্টরূপে এক্সপ্রেশন মোডে একটি উদ্ধৃত স্ট্রিং দিয়ে শুরু হওয়া একটি বিবৃতিকে বিশ্লেষণ করে, যেখানে কমান্ডগুলি (সেমিডলেটস, বহিরাগত প্রোগ্রামগুলি, ফাংশনগুলি, উপাধিগুলি) শুরু করার জন্য আর্গুমেন্ট মোডের প্রয়োজন হয়, যা &
নিশ্চিত করে।
$(...)
এবং & { ... }
/ এর মধ্যে মূল পার্থক্যটি . { ... }
হ'ল প্রাক্তন পুরোপুরি ফিরে আসার আগে মেমরির সমস্ত ইনপুট সংগ্রহ করে , যেখানে পরেরটি আউটপুট প্রবাহিত করে, একের পর এক পাইপলাইন প্রসেসিংয়ের জন্য উপযুক্ত।
পুনঃনির্দেশগুলি একইভাবে কাজ করে, মূলত (তবে নীচে সতর্কীকরণগুলি দেখুন):
$cmdOutput = <command> 2>&1 # redirect error stream (2) to success stream (1)
তবে বাহ্যিক আদেশের জন্য নিম্নলিখিতটি প্রত্যাশার মতো কাজ করার সম্ভাবনা বেশি রয়েছে:
$cmdOutput = cmd /c <command> '2>&1' # Let cmd.exe handle redirection - see below.
বাহ্যিক প্রোগ্রামগুলির জন্য নির্দিষ্ট বিবেচনাগুলি :
বাহ্যিক প্রোগ্রামগুলি , কারণ তারা পাওয়ারশেলের ধরণের সিস্টেমের বাইরে কাজ করে, কেবল তাদের সাফল্যের স্ট্রিম (স্টাডআউট) এর মাধ্যমে কেবল স্ট্রিং ফেরত দেয়।
যদি আউটপুটটিতে 1 টির বেশি লাইন থাকে তবে পাওয়ারশেল ডিফল্টরূপে এটি স্ট্রিংগুলির একটি অ্যারেতে বিভক্ত হয় । আরও সঠিকভাবে, আউটপুট লাইনগুলি এমন ধরণের অ্যারেতে সংরক্ষণ করা হয় [System.Object[]]
যার উপাদানগুলি স্ট্রিং ( [System.String]
)।
আপনি যদি আউটপুট একটি হতে চান একক , সম্ভাব্য বহু-লাইন স্ট্রিং , নল থেকেOut-String
:
$cmdOutput = <command> | Out-String
স্টাডারকে স্টাডাউটে পুনর্নির্দেশ করা2>&1
, যাতে এটি সাফল্যের স্রোতের অংশ হিসাবে ক্যাপচার করে, সতর্কতার সাথে আসে :
করতে 2>&1
একত্রীকরণ stdout- এ এবং দ্বারা stderr উৎস , দিন cmd.exe
ফেরৎ হ্যান্ডেল , নিম্নলিখিত বাগধারার ব্যবহার করছে:
$cmdOutput = cmd /c <command> '2>&1' # *array* of strings (typically)
$cmdOutput = cmd /c <command> '2>&1' | Out-String # single string
cmd /c
cmd.exe
কমান্ডের সাথে প্রার্থনা করে <command>
এবং <command>
সমাপ্ত হওয়ার পরে প্রস্থান করে ।
- আশেপাশের একক উক্তিগুলি নোট করুন
2>&1
, এটি নিশ্চিত করে যে পুনর্নির্দেশটি cmd.exe
পাওয়ারশেলের দ্বারা ব্যাখ্যা না করে পরিবর্তিত হয়ে গেছে ।
নোট করুন যে জড়িত থাকার cmd.exe
অর্থ পাওয়ারশেলের নিজস্ব প্রয়োজনীয়তা ছাড়াও ডিফল্টরূপে অক্ষরগুলি থেকে বাঁচার এবং পরিবেশের ভেরিয়েবলগুলি প্রসারিত করার জন্য তার নিয়মগুলি কার্যকর হয়; PS v3 + তে আপনি স্টোর পরিবেশ-পরিবর্তনশীল উল্লেখগুলি ব্যতীত পাওয়ারশেলের দ্বারা বাকী পরামিতিগুলির ব্যাখ্যা বন্ধ করতে বিশেষ প্যারামিটার --%
(তথাকথিত স্টপ পার্সিং প্রতীক ) ব্যবহার করতে পারেন ।cmd.exe
%PATH%
নোট করুন যেহেতু আপনি এই পদ্ধতির সাহায্যে উত্স এবং স্ট্ডারকে মার্জ করছেন , আপনি পাওয়ারশেলের স্টাডাউট-উত্পন্ন এবং স্ট্যাডার-উদ্ভূত লাইনের মধ্যে পার্থক্য করতে সক্ষম হবেন না ; আপনার যদি এই পার্থক্যটির প্রয়োজন হয় তবে পাওয়ারশেলের নিজস্ব 2>&1
পুনঃনির্দেশ ব্যবহার করুন - নীচে দেখুন।
কোন স্ট্রিম থেকে কোন রেখাগুলি এসেছে তা জানতে পাওয়ারশেলের 2>&1
পুনঃনির্দেশ ব্যবহার করুন :
Stderr আউটপুট বন্দী করা হয় ত্রুটি রেকর্ড ( [System.Management.Automation.ErrorRecord]
,), না স্ট্রিং তাই আউটপুট অ্যারে একটি থাকতে পারে মিশ্রণ এর স্ট্রিং (প্রতিটি স্ট্রিং একটি stdout- এ লাইন প্রতিনিধিত্বমূলক) এবং ত্রুটি রেকর্ড (প্রতিটি রেকর্ড একটি দ্বারা stderr লাইন প্রতীক) । নোট করুন, অনুরোধ অনুসারে 2>&1
, স্ট্রিং এবং ত্রুটি রেকর্ড উভয়ই পাওয়ারশেলের সাফল্যের আউটপুট স্ট্রিমের মাধ্যমে প্রাপ্ত হয়েছে )।
কনসোলে, ত্রুটিটি লাল রঙে মুদ্রণ করে এবং 1 ম ডিফল্টরূপে বহু-লাইন প্রদর্শন উত্পন্ন করে , একই ফর্ম্যাটে একটি সেমিডলেটের অ-সমাপনী ত্রুটি প্রদর্শিত হবে; পরবর্তী ত্রুটি রেকর্ডগুলি লাল হিসাবেও প্রিন্ট করে তবে কেবল তাদের ত্রুটি বার্তাটি একটি লাইনে মুদ্রণ করে ।
কনসোলে আউটপুট দেওয়ার সময় , স্ট্রিংগুলি সাধারণত আউটপুট অ্যারেতে প্রথমে আসে ত্রুটি রেকর্ডের পরে (কমপক্ষে stdout / stderr লাইন আউটপুট "একই সময়ে" একটি ব্যাচের মধ্যে)) তবে, ভাগ্যক্রমে, আপনি আউটপুট ক্যাপচার করার সময় , এটি সঠিকভাবে ইন্টারলিভড , একই আউটপুট ক্রমটি ব্যবহার করে আপনি ছাড়া পাবেন 2>&1
; অন্য কথায়: কনসোলে আউটপুট দেওয়ার সময় , আটকানো আউটপুট বাহ্যিক কমান্ড দ্বারা স্টডআউট এবং স্টার্ডার লাইনগুলি ক্রম প্রতিপন্ন করে না।
আপনি যদি একটি সমগ্র আউটপুট গ্রহণ করে একক সঙ্গে স্ট্রিংOut-String
, PowerShell যোগ হবে অতিরিক্ত লাইন , কারণ একটি ত্রুটি রেকর্ডের স্ট্রিং উপস্থাপনা যেমন অবস্থান (যেমন অতিরিক্ত তথ্য উপস্থিত রয়েছে At line:...
) এবং বিভাগ ( + CategoryInfo ...
); কৌতূহলীভাবে, এটি কেবল প্রথম ত্রুটি রেকর্ডে প্রযোজ্য ।
- এই সমস্যা এড়াতে কাজ করতে আবেদন
.ToString()
পরিবর্তে বংশীধ্বনিতুল্য এর প্রতিটি আউটপুট বস্তু পদ্ধতি Out-String
:
$cmdOutput = <command> 2>&1 | % { $_.ToString() }
;
PS v3 + এ আপনি সহজ করতে পারেন:
$cmdOutput = <command> 2>&1 | % ToString
(বোনাস হিসাবে, যদি আউটপুট ক্যাপচার না করা হয় তবে এটি কনসোলে প্রিন্ট করার সময়ও সঠিকভাবে আন্তঃভিত্তিক আউটপুট উত্পাদন করে))
বিকল্পভাবে, ত্রুটি রেকর্ড আউট ফিল্টার এবংWrite-Error
এটিকে পাওয়ারশেলের ত্রুটি প্রবাহে প্রেরণ করুন (বোনাস হিসাবে, যদি আউটপুট ক্যাপচার না করা হয়, এটি কনসোলে প্রিন্ট করার সময়ও সঠিকভাবে আন্তঃভিত্তিক আউটপুট উত্পাদন করে):
$cmdOutput = <command> 2>&1 | ForEach-Object {
if ($_ -is [System.Management.Automation.ErrorRecord]) {
Write-Error $_
} else {
$_
}
}
Start-Process
- কেবল তাদেরকে সরাসরি অনুরোধ করুন , কোনও শেলের মতো; বুদ্ধি হবে:netdom /verify $pc /domain:hosp.uhhg.org
। এটি করার ফলে অ্যাপ্লিকেশনটি কলিং কনসোলের স্ট্যান্ডার্ড স্ট্রিমের সাথে সংযুক্ত রাখে, এর আউটপুটটিকে সাধারণ অ্যাসাইনমেন্ট দ্বারা ক্যাপচার করার অনুমতি দেয়$output = netdom ...
। নীচে প্রদত্ত বেশিরভাগ উত্তরStart-Process
প্রত্যক্ষভাবে মৃত্যুদন্ড কার্যকর করার পক্ষে চলে যায়।