পাওয়ারশেলে কীভাবে কিছু আউটপুট করা যায়


210

আমি একটি ব্যাচ ফাইলের মধ্যে থেকে পাওয়ারশেল স্ক্রিপ্ট চালাচ্ছি। স্ক্রিপ্টটি একটি ওয়েব পৃষ্ঠা আনে এবং পৃষ্ঠার সামগ্রীটি "ওকে" স্ট্রিং কিনা তা যাচাই করে।

পাওয়ারশেল স্ক্রিপ্টটি ব্যাচের স্ক্রিপ্টে একটি ত্রুটি স্তর প্রদান করে।

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

পাওয়ারশেল স্ক্রিপ্টে, আমি যদি ওয়েব সাইটটি "ঠিক আছে" না থেকে রিটার্ন মানটি আউটপুট করতে চাই, তাই ত্রুটি বার্তাটি কনসোল আউটপুটে অন্তর্ভুক্ত হয়ে যায় এবং এইভাবে স্থিতি মেলে in

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

  • লেখা-হোস্ট
  • লেখা-আউটপুট
  • লেখা-ত্রুটি

উইন্ডোজ এর সমতুল্য লিখতে সঠিক জিনিসটি কী হবে stdout?

উত্তর:


196

কেবল কোনও কিছুর আউটপুট আউট করা পাওয়ারশেল হ'ল সৌন্দর্যের একটি জিনিস - এবং এটির সবচেয়ে বড় শক্তি। উদাহরণস্বরূপ, সাধারণ হ্যালো, ওয়ার্ল্ড! অ্যাপ্লিকেশন একক লাইনে হ্রাস করা হয়েছে:

"Hello, World!"

এটি একটি স্ট্রিং অবজেক্ট তৈরি করে, পূর্বোক্ত মানটি নির্ধারণ করে, এবং কমান্ড পাইপলাইনে সর্বশেষ আইটেম হওয়ায় এটি .toString()পদ্ধতিটি কল করে এবং ফলাফলটিকে STDOUT(ডিফল্টরূপে) আউটপুট করে । সৌন্দর্য একটি জিনিস।

অন্যান্য Write-*কমান্ডগুলি তাদের সম্পর্কিত স্ট্রিমগুলিতে পাঠ্য আউটপুট দেওয়ার ক্ষেত্রে সুনির্দিষ্ট এবং এর মতো তাদের স্থান রয়েছে।


9
আসলে যা হয় তাই না। এটি একটি স্ট্রিং আক্ষরিক ভাব এবং এর পাইপলাইনের একমাত্র জিনিস। সুতরাং এটি সমতুল্য "Hello, World!" | Out-HostOut-Hostঅন্যদিকে প্রদর্শনের জন্য পাওয়ারশেল হোস্টকে অবজেক্টগুলি প্রেরণ করে এবং এর বাস্তবায়ন হোস্টের উপর নির্ভরশীল। কনসোল হোস্ট Out-Defaultসত্যই তাদের স্ট্যান্ডার্ড আউটপুট হ্যান্ডেলগুলিতে প্রেরণ করে passing পাওয়ারশেল আইএসই এগুলি তার আউটপুট ফলকে প্রদর্শন করে, এবং অন্যান্য হোস্টগুলি এখনও অন্য কিছু পুরোপুরি করতে পারে।
জোয়

5
অবজেক্টগুলি অন্ধভাবে স্ট্রিংয়ে রূপান্তরিত হয় না, তবে এমন ফর্ম্যাটারের মধ্য দিয়ে যায় যা তাদের সাথে কী করবে তার সিদ্ধান্ত নেয়। এজন্য আপনি দেখতে পাচ্ছেন যে Get-ChildItemকোনও আউটপুট একটি টেবিল আকারে আসছে, উদাহরণস্বরূপ, এবং এর Format-Listপরিবর্তে অনেক বৈশিষ্ট্য (যেমন ডাব্লুএমআই) এর ডিফল্ট ফলাফল রয়েছে ।
জোয়

120

আমি মনে করি এক্ষেত্রে আপনার লেখার আউটপুট দরকার হবে ।

আপনার মতো স্ক্রিপ্ট থাকলে

Write-Output "test1";
Write-Host "test2";
"test3";

তারপরে, আপনি যদি পুনঃনির্দেশিত আউটপুট সহ স্ক্রিপ্টটি কল করেন তবে এরকম কিছু yourscript.ps1 > out.txt, আপনি "আউট.টিএসটিএসটি" test2এর স্ক্রিনে পাবেন test1\ntest3\n

নোট যে "test3 নামক" এবং তা লিখতে আউটপুট লাইন সবসময় আপনার টেক্সট একটি নতুন লাইন যোগ করতে হবে এবং সেখানে PowerShell কোন উপায় এই বন্ধ করার জন্য (যেমন, হয় echo -nনেটিভ কমান্ড দিয়ে PowerShell অসম্ভব)। যদি আপনি ( বাশের কিছুটা প্রাথমিক এবং সহজ ) কার্যকারিতা চান echo -nতবে সাম্যাথবেস্টের উত্তরটি দেখুন

যদি একটি ব্যাচ ফাইল একটি পাওয়ারশেল কমান্ড চালায় তবে সম্ভবত এটি লিখন-আউটপুট কমান্ডটি ক্যাপচার করবে। কনসোলে কী লিখতে হবে এবং কী করা উচিত নয় সে সম্পর্কে সিস্টেম প্রশাসকদের সাথে আমার দীর্ঘ আলোচনা হয়েছে। আমরা এখন একমত হয়েছি যে স্ক্রিপ্টটি সফলভাবে সম্পাদিত বা মারা গেলে কেবলমাত্র তথ্যটি Write-Host'সম্পাদনা' করতে হবে এবং স্ক্রিপ্টের লেখক যা কিছু আছে তার প্রয়োগের বিষয়ে জানতে হবে (কী আইটেম আপডেট করা হয়েছিল, কোন ক্ষেত্রগুলি সেট করা হয়েছিল, এবং সেটারে) যায় লিখুন-আউটপুট। এই পদ্ধতিতে, আপনি যখন সিস্টেম প্রশাসকের কাছে কোনও স্ক্রিপ্ট জমা দেন, তিনি runthescript.ps1 >someredirectedoutput.txtসবকিছু ঠিকঠাক থাকলে সহজেই এবং স্ক্রিনে দেখতে পাবেন। তারপরে বিকাশকারীদের কাছে "someredireectedoutput.txt" প্রেরণ করুন।


9

আমি মনে করি নীচেরগুলি ইকো বনাম লিখিত-হোস্টের একটি ভাল প্রদর্শনী । লক্ষ্য করুন যে কীভাবে পরীক্ষা () প্রকৃতপক্ষে ইনটসের একটি অ্যারে দেয়, সহজে কোনও এক হিসাবে সহজে বিশ্বাস করা যায় না।

function test {
    Write-Host 123
    echo 456 # AKA 'Write-Output'
    return 789
}

$x = test

Write-Host "x of type '$($x.GetType().name)' = $x"

Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"

উপরের টার্মিনাল আউটপুট:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789

আমি এটি সারাদিন দেখতে পারি ... তবে কেন $x = testকেবল মুদ্রণ হচ্ছে 123এবং তাও নয় 456?
not2qubit

7

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

এই নিবন্ধটি বিভিন্ন আউটপুট বিকল্পগুলি বর্ণনা করে: পাওয়ারশেল ও আউটপুট জন্য


1
লিঙ্কের জন্য ধন্যবাদ। মঙ্গল, এটি জটিল । লিখন-হোস্ট যদি কোনও প্রকারের এন্ডপয়েন্ট বা ফ্লাশিং ফাংশন হয় তবে আমি চেষ্টা করব এবং এটির সাথে গিয়ে আবার রিপোর্ট করব।
পেক্কা

3
Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta

ম্যাজেন্টা হ'ল "সিস্টেম.কনসোলকলার" গণকের মানগুলির মধ্যে একটি হতে পারে - কালো, ডার্ক ব্লু, ডার্কগ্রিন, ডার্ককায়ান, ডার্ক্রেড, ডার্ক ম্যাগেন্টা, ডার্কইলো, গ্রে, ডার্ক গ্রে, নীল, সবুজ, সায়ান, লাল, ম্যাজেন্টা, হলুদ, সাদা।

+ $File.FullNameঐচ্ছিক, এবং দেখায় কিভাবে স্ট্রিং মধ্যে একটি পরিবর্তনশীল করা।


2

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

অবশ্যই লিখন-হোস্ট নিরঙ্কুশ বোকা কারণ আপনি এটি থেকে পাইপ / ডাইরেক্ট করতে পারবেন না! আপনাকে কেবল নিজের লিখতে হবে:

using System;

namespace WriteToStdout
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args != null)
            {
                Console.Write(string.Join(" ", args));
            }
        }
    }
}

যেমন

PS C:\> writetostdout finally I can write to stdout like echo -n
finally I can write to stdout like echo -nPS C:\>

আপনি পাওয়ারশেল নিজেই এটি করতে পারেন। [সিস্টেম.কনসোল] :: লিখুন ("স্ট্রাইনি") তবে আপনি এটিকে পাওয়ারশেলের মাধ্যমে পুনর্নির্দেশ করতে সক্ষম হবেন না।
নিকোলি


1

উইন্ডোজ স্টাডাউটের সমতুল্য লিখতে সঠিক জিনিসটি কী হবে?

ইন প্রভাব , কিন্তু খুব দুর্ভাগ্যবশত , উভয় উইন্ডোজ PowerShell এবং PowerShell কোর v7.0 হিসাবে পাঠাতে সব তাদের 6 (!) এর আউটপুট স্ট্রীম করে করতে stdout- এ যখন বলা বাইরে থেকে , PowerShell এর মাধ্যমে CLI

  • এই সমস্যাযুক্ত আচরণের আলোচনার জন্য এই গিটহাব ইস্যুটি দেখুন , যা সম্ভবত পশ্চাৎপদ সামঞ্জস্যের জন্য স্থির হবে না।

  • অনুশীলনে, এর অর্থ হ'ল পাওয়ারশেল স্ট্রিমটি আপনি যেদিকে আউটপুট প্রেরণ করবেন তা বাহ্যিক কলার দ্বারা স্টডআউট আউটপুট হিসাবে দেখা যাবে :

    • উদাহরণস্বরূপ, আপনি যদি নিম্নলিখিতগুলি চালনা করেন তবে আপনি কোনও আউটপুট cmd.exeদেখতে পাবেন না , কারণ স্টাডাউট পুনঃনির্দেশ NULসমস্ত পাওয়ারশেল স্ট্রিমের জন্য সমানভাবে প্রযোজ্য:

      • C:\>powershell -noprofile -command "Write-Error error!" >NUL
    • তবে - অদ্ভুতভাবে - যদি আপনি দ্বারা stderr পুনর্নির্দেশ , PowerShell করে stderr হবে তার ত্রুটি স্ট্রীম পাঠাতে , যাতে সঙ্গে 2>আপনি করতে পারেন ত্রুটি-স্ট্রীম আউটপুট বেছে বেছে ক্যাপচার; নিম্নলিখিত আউটপুটগুলি কেবল 'hi'- সাফল্য-স্ট্রিম আউটপুট - ফাইলটিতে ত্রুটি-প্রবাহ আউটপুট ক্যাপচার করার সময় err.txt:

      • C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt

কাঙ্ক্ষিত আচরণ হল:

  • পাওয়ারশেলের সাফল্যের আউটপুট স্ট্রিম (নম্বর 1) স্টডআউটে প্রেরণ করুন ।
  • অন্য সমস্ত স্ট্রিম থেকে স্টডারারে আউটপুট প্রেরণ করুন , যা একমাত্র বিকল্প, প্রক্রিয়াগুলির মধ্যে কেবলমাত্র দুটি আউটপুট স্ট্রিম বিদ্যমান - ডেটা জন্য স্ট্ডআউট (স্ট্যান্ডার্ড আউটপুট) , এবং ত্রুটি বার্তাগুলির জন্য স্টার্ডার (স্ট্যান্ডার্ড ত্রুটি) এবং অন্যান্য সমস্ত ধরণের বার্তা - যেমন স্থিতির তথ্য হিসাবে - যে তথ্য নয় ।

  • আপনার কোডে এই পার্থক্য তৈরি করার পরামর্শ দেওয়া হচ্ছে যদিও বর্তমানে এটি সম্মানিত হচ্ছে না


পাওয়ারশেলের ভিতরে :

  • Write-Hostহয় জন্য প্রদর্শন আউটপুট , এবং রোধ করা যাবে সাফল্য আউটপুট স্ট্রিম - যেমন, তার আউটপুট তন্ন তন্ন হতে পারে (সরাসরি) একটি পরিবর্তনশীল বন্দী কিংবা দমন কিংবা পুনঃনির্দেশ করেছে।

    • এর আসল উদ্দেশ্যটি কেবল ব্যবহারকারী প্রতিক্রিয়া তৈরি করা এবং সহজ, কনসোল ভিত্তিক ব্যবহারকারী ইন্টারফেস (রঙিন আউটপুট) তৈরি করা ছিল।

    • ক্যাপচার বা পুনঃনির্দেশিত হওয়ার পূর্ব অক্ষমতার কারণে, পাওয়ারশেল সংস্করণ 5 Write-Hostসদ্য চালু হওয়া তথ্য প্রবাহে (নম্বর 6) তৈরি হয়েছিল, তার পর থেকে আউটপুট ক্যাপচার এবং পুনঃনির্দেশ করা সম্ভব Write-Host

  • Write-Errorত্রুটি প্রবাহে (সংখ্যা ) অ-সমাপ্তি ত্রুটিগুলি লেখার জন্য বোঝানো হয়েছে 2; ধারণাগতভাবে, ত্রুটি স্ট্রিমটি স্টডারারের সমতুল্য।

  • Write-Outputলিখেছেন সাফল্য [আউটপুট] প্রবাহ (নম্বর 1), যা ধারণার দিক থেকে stdout- এ সমতূল্য; এটিতে ডেটা (ফলাফল) লেখার স্ট্রিম ।

    • তবে পাওয়ারশেলের অন্তর্নিহিত আউটপুট বৈশিষ্ট্যের কারণে স্পষ্টতই এর ব্যবহার Write-Outputখুব কমই প্রয়োজন :
      • কোনও কমান্ড বা এক্সপ্রেশন থেকে আউটপুট যা স্পষ্টভাবে ক্যাপচার, দমন বা পুনঃনির্দেশিত নয় তা স্বয়ংক্রিয়ভাবে সাফল্যের প্রবাহে প্রেরণ করা হয় ; উদাহরণস্বরূপ, Write-Output "Honey, I'm $HOME"এবং "Honey, I'm $HOME"সমতুল্য, পরবর্তীগুলি কেবল আরও সংক্ষিপ্ত নয়, আরও দ্রুত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.