"লিখন-হোস্ট", "রাইট-আউটপুট", বা "[কনসোল] :: রাইটলাইন" এর মধ্যে পার্থক্য কী?


192

বার্তা আউটপুট দেওয়ার বিভিন্ন উপায় রয়েছে। মাধ্যমে কিছু outputting মধ্যে কার্যকর পার্থক্য কি Write-Host, Write-Outputঅথবা [console]::WriteLine?

আমি আরও লক্ষ্য করি যে আমি যদি এটি ব্যবহার করি:

write-host "count=" + $count

+আউটপুট মধ্যে অন্তর্ভুক্ত হয়। এটা কেন? প্রকাশটি একটি লিখনের আগে একটি একক কনটেনেটেড স্ট্রিং তৈরি করার জন্য মূল্যায়ন করা উচিত নয়?


4
Write-Outputআপনি ফলাফল নির্গমন যখন। Write-Hostআপনি লগিং তথ্য নির্গমন যখন। কখনও ব্যবহার করবেন না [console]::writeline()
এল

2
@ জনল কেন আমাদের কখনই [কনসোল] :: রাইটলাইন () ব্যবহার করা উচিত নয়?
ডেভিড ক্লেম্পফনার

3
@ ব্যাকওয়ার্ডস_ ডেভ কারণ আপনার লিখিত-হোস্ট আছে .... ঠিক আছে, আমি কিছুটা ছাপে ছিলাম যে এটি একটি নতুন কনসোল উইন্ডো দেখিয়েছে (এটি বেশ দীর্ঘ সময় আগে ছিল)। এটি ঘটে না, তবে সত্যটি রয়ে গেছে যে এটি পাওয়ারশেল আইডিয়ম নয় এবং [console]::writeline("hello world")এটি করতে পারবেন না এমন কিছুই করতে পারবেন না Write-Host "hello world"। আরেকটি, আরও ভাল, সম্প্রতি প্রয়োগযোগ্য উত্তরটি হ'ল write-hostমোড়ক দেয় write-informationযাতে এর ডেটা এমন স্ট্রিমের উপরে রাখে write-errorযাতে আপনি এটি ক্যাপচার করতে এবং এটিকে অন্য কোথাও ব্যবহার করতে পারেন। [console]::writeline()এটি করে না
জন

উত্তর:


267

Write-Outputআপনি যখন পাইপ লাইনে ডেটা প্রেরণ করতে চান তখন ব্যবহার করা উচিত তবে অগত্যা এটি স্ক্রিনে প্রদর্শন করতে চান না। পাইপলাইন শেষ পর্যন্ত এটিকে লিখবে out-defaultযদি অন্য কোনও কিছুই প্রথমে এটি ব্যবহার না করে।

Write-Host আপনি বিপরীত করতে চান যখন ব্যবহার করা উচিত।

[console]::WriteLineমূলত Write-Hostপর্দার আড়ালে কি করছে।

এই প্রদর্শনী কোডটি চালান এবং ফলাফলটি পরীক্ষা করুন।

function Test-Output {
    Write-Output "Hello World"
}

function Test-Output2 {
    Write-Host "Hello World" -foreground Green
}

function Receive-Output {
    process { Write-Host $_ -foreground Yellow }
}

#Output piped to another function, not displayed in first.
Test-Output | Receive-Output

#Output not piped to 2nd function, only displayed in first.
Test-Output2 | Receive-Output 

#Pipeline sends to Out-Default at the end.
Test-Output 

আপনাকে প্রথম বন্ধনীগুলিতে সংক্ষেপণ ক্রিয়াকলাপটি বন্ধ করতে হবে, যাতে পাওয়ারশেল প্যারামিটার তালিকাকে টোকনাইজ করার আগে Write-Hostবা স্ট্রিং ইন্টারপোলেশন ব্যবহার করে কনটেন্টেশন প্রক্রিয়া করে

write-host ("count=" + $count)
# or
write-host "count=$count"

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


একটি অ্যাজুরে ওয়েবজব [কনসোল] :: রাইটলাইন কাজ করে তবে লিখন-হোস্টের ফলে ত্রুটি ঘটবে: উইন 32 অভ্যন্তরীণ ত্রুটি "হ্যান্ডেলটি অবৈধ" 0x6 ঘটেছে কনসোল আউটপুট বাফারের জন্য অক্ষর বৈশিষ্ট্য নির্ধারণের সময়। আমাকে জিজ্ঞাসা করবেন না কেন।
গিল রাইটো

আমাকে সঠিক যদি আমি ভুল, কিন্তু আমি বিশ্বাস করি Write-Outputডিফল্ট যেমন হলে আপনি একটি PsObject আছে এবং আপনি শুধু এই করে পর্দায় বের করে থুতু $objectএটা আসলে এই একই কাজ করবে Write-Output $object। উল্লেখযোগ্য হতে পারে
কলব ক্যানিয়ন

1
নতুন নির্দেশিকা রয়েছে: Write-Outputসম্ভব হলে ব্যবহার এড়িয়ে চলুন । Github.com/PoshCode/PowerShellPੈਕਟAndStyle/issues/… > এক্সিকিউশন শেষ করার জন্য কেবল রিটার্ন ব্যবহার করুন See > লিখন-আউটপুট এড়িয়ে চলুন (...)। পরিবর্তে, যখন আপনি আউটপুটকে আরও পরিষ্কার করতে চান, কেবলমাত্র একটি প্রাসঙ্গিকভাবে নামযুক্ত ভেরিয়েবলকে আউটপুট বরাদ্দ করুন। এবং সুস্পষ্ট আউটপুট সিগন্যাল করার জন্য সেটিকে একটি লাইনে একটি চলক রাখুন। > রাইটিং-আউটপুট -নুনিমারেটটি পাওয়ারশেল 6 এ ভাঙা হয়েছে এবং 16 মাস বা তার বেশি সময় হয়েছে - এটি ঠিক করার কোনও পরিকল্পনা নেই। সংক্ষেপে:> লিখন-আউটপুট - কখনও ব্যবহার করবেন না।
জেরোয়েন ওয়েয়ার্ট প্লুমাইমারস

28

অ্যান্ডি যা উল্লেখ করেছেন তা বাদে, আরও একটি পার্থক্য রয়েছে যা গুরুত্বপূর্ণ হতে পারে - লিখন-হোস্ট সরাসরি হোস্টকে লেখেন এবং কিছুই ফিরিয়ে দেন না, যার অর্থ আপনি আউটপুট যেমন কোনও ফাইলকে পুনঃনির্দেশ করতে পারবেন না।

---- script a.ps1 ----
write-host "hello"

এখন পাওয়ারশেলে চালান:

PS> .\a.ps1 > someFile.txt
hello
PS> type someFile.txt
PS>

যেমন দেখা গেছে, আপনি এগুলি কোনও ফাইলে পুনর্নির্দেশ করতে পারবেন না। সচেতন নয় এমন কারও পক্ষে এটি আশ্চর্যজনক হতে পারে।

তবে পরিবর্তে যদি লেখার-আউটপুট ব্যবহার করতে স্যুইচ করা হয় তবে আপনি প্রত্যাশার সাথে কাজ করে পুননির্দেশনা পাবেন।


আপনি যদি স্টার্ট-প্রক্রিয়া পাওয়ারশেল ব্যবহার করেন তবে লিখন-হোস্ট আউটপুট ক্যাপচার করা সম্ভব।
এমকেস্পার

16

রাইটিং-আউটপুট সমতুল্য করার আরও একটি উপায় এখানে। কেবল আপনার স্ট্রিং উদ্ধৃতিতে রাখুন:

"count=$count"

এই পরীক্ষা চালিয়ে আপনি নিশ্চিত করতে পারেন যে এটি লিখন-আউটপুট হিসাবে একই কাজ করে:

"blah blah" > out.txt

Write-Output "blah blah" > out.txt

Write-Host "blah blah" > out.txt

প্রথম দুটি আউটপুট "ব্লাহ ব্লাহ" আউটপুট করবে, কিন্তু তৃতীয়টি তা করবে না।

"সহায়তা লিখুন-আউটপুট" এই আচরণের একটি ইঙ্গিত দেয়:

এই সেমিডলেটটি সাধারণত স্ক্রিপ্টগুলিতে কনসোলে স্ট্রিং এবং অন্যান্য অবজেক্ট প্রদর্শন করতে ব্যবহৃত হয়। তবে, যেহেতু ডিফল্ট আচরণটি পাইপলাইন শেষে অবজেক্টগুলি প্রদর্শন করা হয়, তাই সাধারণত সেমিডলেট ব্যবহার করা প্রয়োজন হয় না।

এই ক্ষেত্রে স্ট্রিং নিজেই "কাউন্ট = = কাউন্ট" পাইপলাইনের শেষে অবজেক্ট এবং প্রদর্শিত হয়।


6

এর ব্যবহারের জন্য Write-Host, PSScriptAnalyzerনিম্নলিখিত ডায়াগনস্টিক উত্পাদন করে:

ব্যবহার করা এড়িয়ে চলুন Write-Hostকারণ এটি সমস্ত হোস্টে কাজ না করে, হোস্ট না থাকলে কাজ করে না এবং (পিএস 5.0 এর পূর্বে) দমন, ক্যাপচার বা পুনঃনির্দেশিত করা যায় না। পরিবর্তে, ব্যবহার Write-Output, Write-Verboseবা Write-Information

আরও তথ্যের জন্য এই নিয়মের পিছনে ডকুমেন্টেশন দেখুন । উত্তরোত্তর জন্য অংশ:

ব্যবহারের Write-Hostব্যাপকভাবে যদি না দিয়ে কমান্ড ব্যবহারে নিরুৎসাহিত করা হয় Showক্রিয়া। Showক্রিয়া স্পষ্টভাবে "পর্দায় প্রদর্শনী, অন্য কোন সম্ভাবনার সঙ্গে" মানে।

Showক্রিয়া সহ কমান্ডগুলিতে এই চেক প্রয়োগ করা হয় না।

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


3

আমার পরীক্ষা থেকে লিখন-আউটপুট এবং [কনসোল] :: রাইটলাইন () রাইটিং-হোস্টের চেয়ে অনেক ভাল সম্পাদন করে।

আপনার কতটা পাঠ্য লিখতে হবে তার উপর নির্ভর করে এটি গুরুত্বপূর্ণ হতে পারে।

রাইট-হোস্ট, লিখন-আউটপুট এবং [কনসোল] :: রাইটলাইন () এর জন্য প্রতিটি পরীক্ষার ফলাফলের নীচে যদি।

আমার সীমিত অভিজ্ঞতায় আমি খুঁজে পেয়েছি যে কোনও ধরণের বাস্তব বিশ্বের ডেটা নিয়ে কাজ করার সময় আমার সেমিডলেটগুলি ছেড়ে দেওয়া উচিত এবং আমার স্ক্রিপ্টগুলি থেকে কোনও শালীন পারফরম্যান্স পাওয়ার জন্য নিম্ন স্তরের কমান্ডগুলির জন্য সোজা যেতে হবে।

measure-command {$count = 0; while ($count -lt 1000) { Write-Host "hello"; $count++ }}

1312ms
1651ms
1909ms
1685ms
1788ms


measure-command { $count = 0; while ($count -lt 1000) { Write-Output "hello"; $count++ }}

97ms
105ms
94ms
105ms
98ms


measure-command { $count = 0; while ($count -lt 1000) { [console]::WriteLine("hello"); $count++ }}

158ms
105ms
124ms
99ms
95ms

1
Write-Outputএবং Write-Hostবিভিন্ন উদ্দেশ্যে পরিবেশন করে, তাই তাদের পারফরম্যান্সের তুলনা করার কোনও মানে নেই। হ্যাঁ, .NET প্রকারের সরাসরি ব্যবহার এবং তাদের পদ্ধতিগুলি দ্রুত, তবে আপনি পাওয়ারশেল সেমিডলেটগুলি যে উচ্চ-স্তরের বৈশিষ্ট্যগুলি সরবরাহ করতে পারেন তা এড়িয়ে যান। [Console]::WriteLine()সদৃশ হয় Write-Hostহাতে ক্ষেত্রে, কিন্তু সব পরিস্থিতিতে কাজ করবে না, কারণ সব PowerShell বাহিনীসমূহ কনসোল
mklement0

0

[কনসোল] সম্পর্কিত :: রাইটলাইন () - আপনি যদি সিএমডিতে পাইপলাইন ব্যবহার করতে যাচ্ছেন (পাওয়ারশেল নয়) আপনার এটি ব্যবহার করা উচিত। বলুন যে আপনি চান যে আপনার PS1 স্ট্যাডআউটে প্রচুর ডেটা প্রবাহিত করবে এবং এর ব্যবহার / রূপান্তর করতে অন্য কিছু ইউটিলিটি। আপনি যদি স্ক্রিপ্টে লিখন-হোস্ট ব্যবহার করেন তবে এটি অনেক ধীর হবে।

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