PowerShell में कुछ आउटपुट कैसे करें


210

मैं बैच फ़ाइल के भीतर से PowerShell स्क्रिप्ट चला रहा हूं। स्क्रिप्ट एक वेब पेज लाती है और जांचती है कि पृष्ठ की सामग्री स्ट्रिंग "ओके" है या नहीं।

PowerShell स्क्रिप्ट बैच स्क्रिप्ट में त्रुटि स्तर देता है।

बैच स्क्रिप्ट ScriptFTP , एक FTP स्वचालन कार्यक्रम द्वारा निष्पादित की जाती है । यदि कोई त्रुटि होती है, तो मैं ई-मेल के माध्यम से ScriptFTP को व्यवस्थापक को पूर्ण कंसोल आउटपुट भेज सकता हूं।

PowerShell स्क्रिप्ट में, मैं वेब साइट से रिटर्न वैल्यू को आउटपुट करना चाहूंगा अगर यह "ओके" नहीं है, तो कंसोल आउटपुट में त्रुटि संदेश शामिल हो जाता है, और इस प्रकार स्थिति मेल में।

मैं पॉवरशेल के लिए नया हूं और यह सुनिश्चित करने के लिए नहीं है कि इसके लिए कौन सा आउटपुट फ़ंक्शन का उपयोग करना है। मैं तीन देख सकता हूं:

  • राइट-होस्ट
  • राइट-आउटपुट
  • लिखने त्रुटि

विंडोज के बराबर लिखने के लिए उपयोग करने के लिए सही चीज क्या होगी stdout?

जवाबों:


196

बस कुछ उत्पादन करना PowerShell सुंदरता की बात है - और इसकी सबसे बड़ी ताकत है। उदाहरण के लिए, आम हैलो, वर्ल्ड! आवेदन एक लाइन के लिए कम है:

"Hello, World!"

यह एक स्ट्रिंग ऑब्जेक्ट बनाता है, पूर्वोक्त मान प्रदान करता है, और कमांड पाइपलाइन पर अंतिम आइटम होने के नाते यह .toString()विधि को कॉल करता है और परिणाम को STDOUTडिफ़ॉल्ट रूप से आउटपुट करता है । सुंदरता की एक चीज।

अन्य Write-*कमांड पाठ को उनके संबंधित स्ट्रीम में आउटपुट करने के लिए विशिष्ट हैं, और उनकी जगह इस प्रकार है।


9
वास्तव में ऐसा नहीं होता है। यह एक स्ट्रिंग शाब्दिक अभिव्यक्ति है और इसकी पाइपलाइन में एकमात्र चीज है। इस प्रकार यह बराबर है "Hello, World!" | Out-HostOut-Hostदूसरी ओर, प्रदर्शन के लिए ऑब्जेक्ट्स को PowerShell होस्ट को भेजता है और इसका कार्यान्वयन होस्ट पर निर्भर है। कंसोल होस्ट उन्हें मानक आउटपुट हैंडल (रास्ते से गुजरते हुए Out-Default), वास्तव में भेजता है। PowerShell ISE उन्हें अपने आउटपुट फलक में प्रदर्शित करता है, हालांकि, और अन्य होस्ट अभी भी पूरी तरह से अन्य काम कर सकते हैं।
जॉय

5
ऑब्जेक्ट्स को नेत्रहीन रूप से स्ट्रिंग में परिवर्तित नहीं किया जाता है, लेकिन एक फॉर्मेटर से गुजरता है जो यह तय करता है कि उनके साथ क्या करना है। इसलिए आपको Get-ChildItemउदाहरण के लिए, तालिका के रूप में आउटपुट आ रहा है, और Format-Listइसके बजाय कई गुणों (जैसे WMI) डिफ़ॉल्ट के साथ परिणाम है ।
जॉय

120

मुझे लगता है कि इस मामले में आपको राइट-आउटपुट की आवश्यकता होगी ।

अगर आपके पास एक स्क्रिप्ट है

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

फिर, यदि आप स्क्रिप्ट को पुनर्निर्देशित आउटपुट के साथ कहते हैं, तो कुछ ऐसा है yourscript.ps1 > out.txt, आपको test2स्क्रीन पर test1\ntest3\n"आउट.टैक्स" मिलेगा।

ध्यान दें कि "test3" और लिखो-आउटपुट लाइन हमेशा आपके पाठ में एक नई लाइन जोड़ देगा और इसे रोकने के लिए PowerShell में कोई रास्ता नहीं है (जो कि, echo -nमूल कमांड्स के साथ PowerShell में असंभव है)। यदि आप ( बाश में कुछ बुनियादी और आसान ) कार्यक्षमता चाहते हैं echo -nतो समथबेस्ट का उत्तर देखें

यदि कोई बैच फ़ाइल PowerShell कमांड चलाती है, तो यह सबसे अधिक संभावना राइट-आउटपुट कमांड को कैप्चर करेगा। कंसोल के लिए क्या लिखा जाना चाहिए और क्या नहीं होना चाहिए, इस बारे में सिस्टम प्रशासकों के साथ मेरी "लंबी चर्चा" हुई है। अब हम इस बात पर सहमत हो गए हैं कि यदि स्क्रिप्ट को सफलतापूर्वक निष्पादित किया गया है या मृत्यु हो गई है, तो एकमात्र जानकारी Write-Host'एड' है, और स्क्रिप्ट के लेखक के लिए सब कुछ निष्पादन के बारे में जानने की आवश्यकता हो सकती है (क्या आइटम अपडेट किए गए थे, क्या फ़ील्ड सेट किए गए थे, वगैरह) लिखने के लिए आउटपुट। इस तरह, जब आप सिस्टम एडमिनिस्ट्रेटर को स्क्रिप्ट सबमिट करते हैं, तो वह आसानी से runthescript.ps1 >someredirectedoutput.txtऔर स्क्रीन पर देख सकता है , अगर सब कुछ ठीक है। फिर डेवलपर्स को "someredirectedoutput.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

आप इनमें से किसी भी परिदृश्य का उपयोग कर सकते हैं क्योंकि वे डिफ़ॉल्ट स्ट्रीम (आउटपुट और त्रुटि) को लिखते हैं। यदि आप किसी अन्य कमांडलेट में आउटपुट लिख रहे थे तो आप राइट-आउटपुट का उपयोग करना चाहेंगे , जो अंततः राइट-होस्ट में समाप्त हो जाएगा ।

यह आलेख विभिन्न आउटपुट विकल्पों का वर्णन करता है: PowerShell O आउटपुट के लिए है


1
लिंक के लिए धन्यवाद। अच्छाई, यह जटिल है । यदि राइट-होस्ट किसी प्रकार का समापन बिंदु या फ्लशिंग फ़ंक्शन है, तो मैं कोशिश करूंगा और उसी के साथ जाकर वापस रिपोर्ट करूंगा।
पक्के

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

मैजेंटा "System.ConsoleColor" एन्यूमरेटर मूल्यों में से एक हो सकता है - ब्लैक, डार्कबेल, डार्कग्रीन, डार्ककेन, डार्करेड, डार्क मैग्नेंटा, डार्कयेलो, ग्रे, डार्कग्रे, ब्लू, ग्रीन, सियान, रेड, मैजेंटा, येलो, व्हाइट।

+ $File.FullNameवैकल्पिक है, और पता चलता है कि कैसे स्ट्रिंग में एक चर डाल करने के लिए।


2

आप बस उन pesky newlines को ommit करने के लिए PowerShell प्राप्त नहीं कर सकते। ऐसा करने वाली कोई स्क्रिप्ट या cmdlet नहीं है।

बेशक लिखें-होस्ट पूर्ण बकवास है क्योंकि आप इससे अनुप्रेषित / पाइप नहीं कर सकते हैं! आपको बस अपना लिखना होगा:

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:\>

आप इसे शक्तियां में ही कर सकते हैं। [System.Console] :: लिखें ("स्ट्राई") हालाँकि आप इसे शब्
निकोली


1

विंडोज को स्टैडआउट के बराबर लिखने के लिए उपयोग करने के लिए सही चीज क्या होगी?

में प्रभाव है, लेकिन बहुत दुर्भाग्य से , दोनों विंडोज PowerShell और PowerShell कोर v7.0 के रूप में, भेजने के सभी उनके 6 (!) की उत्पादन धाराओं को stdout जब कहा जाता है बाहर से , PowerShell के माध्यम से CLI

  • इस समस्यात्मक व्यवहार की चर्चा के लिए इस GitHub मुद्दे को देखें , जो संभवतः पिछड़े संगतता के लिए तय नहीं होगा।

  • अभ्यास में, इसका मतलब है कि जो कुछ भी PowerShell आप स्ट्रीम करने के लिए उत्पादन भेजने के रूप में देखा जाएगा stdout एक बाहरी कॉलर द्वारा उत्पादन:

    • उदाहरण के लिए, यदि आप निम्न से चलाते हैं, तो आपको कोई आउटपुट नहींcmd.exe दिखाई देगा , क्योंकि सभी PowerSc स्ट्रीम में समान रूप से लागू करने के लिए स्टडआउट पुनर्निर्देशन :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

वांछनीय व्यवहार है:

  • PowerShell की सफलता आउटपुट स्ट्रीम (संख्या 1) को stdout में भेजें ।
  • अन्य सभी स्ट्रीम से आउटपुट को Stderr पर भेजें , जो एकमात्र विकल्प है, यह देखते हुए कि प्रक्रियाओं के बीच केवल 2 आउटपुट स्ट्रीम मौजूद हैं - डेटा के लिए stdout (मानक आउटपुट) , और त्रुटि संदेश और अन्य सभी प्रकार के संदेशों के लिए Stderr (मानक त्रुटि) - जैसे स्थिति जानकारी के रूप में - यह डेटा नहीं हैं ।

  • अपने कोड में यह अंतर करना उचित है, भले ही वर्तमान में इसका सम्मान नहीं किया जा रहा है


अंदर PowerShell :

  • Write-Hostहै के लिए प्रदर्शन उत्पादन , और नजरअंदाज सफलता उत्पादन धारा - जैसे, इसके उत्पादन न हो सकता है (सीधे) एक चर में कब्जा है और न ही दबा दिया और न ही निर्देशित कर दिये।

    • इसका मूल आशय केवल उपयोगकर्ता प्रतिक्रिया बनाने और सरल, कंसोल-आधारित उपयोगकर्ता इंटरफ़ेस (रंगीन आउटपुट) बनाना था।

    • पहले अक्षमता पर कब्जा कर लिया या पुनः निर्देशित किया है, PowerShell संस्करण 5 बना होने के कारण Write-Hostहाल में शुरू की करने के लिए जानकारी धारा (संख्या 6), इसलिए तब से यह है पकड़ने और रीडायरेक्ट करने के लिए संभव Write-Hostउत्पादन।

  • Write-Errorत्रुटि धारा (संख्या ) के लिए गैर-समाप्ति त्रुटियों को लिखने के लिए है 2; वैचारिक रूप से, त्रुटि धारा स्टैडर के बराबर है।

  • Write-Outputसफलता के लिए लिखता है [आउटपुट] स्ट्रीम (संख्या 1), जो वैचारिक रूप से स्टडआउट के बराबर है; यह डेटा (परिणाम) लिखने की धारा है।

    • हालाँकि, PowerShell के अंतर्निहित आउटपुट फ़ीचर के कारण इसका स्पष्ट उपयोग Write-Outputशायद ही कभी आवश्यक हो :
      • किसी भी कमांड या अभिव्यक्ति से आउटपुट जिसे स्पष्ट रूप से कैप्चर नहीं किया गया है, दबाया गया या पुनर्निर्देशित किया गया है, स्वचालित रूप से सफलता की धारा में भेजा जाता है ; जैसे, Write-Output "Honey, I'm $HOME"और "Honey, I'm $HOME"समतुल्य हैं, उत्तरार्द्ध न केवल अधिक संक्षिप्त है, बल्कि तेज भी है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.