इसके निष्पादन के दौरान किसी PowerShell के आउटपुट को किसी फ़ाइल में पुनर्निर्देशित कैसे करें


198

मेरे पास एक PowerShell स्क्रिप्ट है जिसके लिए मैं आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करना चाहूंगा। समस्या यह है कि मैं इस स्क्रिप्ट को कहा जाता है जिस तरह से बदल नहीं सकते। इसलिए मैं ऐसा नहीं कर सकता:

 .\MyScript.ps1 > output.txt

मैं इसके निष्पादन के दौरान PowerShell स्क्रिप्ट के आउटपुट को कैसे पुनर्निर्देशित करूं?

जवाबों:


192

शायद Start-Transcriptआपके लिए काम करेगा। पहले इसे बंद करें यदि यह पहले से ही चल रहा है, तो इसे शुरू करें, और जब यह किया जाए तो इसे रोक दें।

$ ErrorActionPreference = "SilentlyContinue"
स्टॉप-ट्रांसक्रिप्ट | बाहर अशक्त
$ ErrorActionPreference = "जारी रखें"
स्टार्ट-ट्रांसक्रिप्ट -पथ C: \ output.txt -append
# सामान करो
बंद करो-ट्रांसक्रिप्ट

सामान पर काम करते समय आपके पास यह भी चल सकता है और बाद के संदर्भ के लिए यह आपके कमांड लाइन सत्र को बचा सकता है।

यदि आप उस ट्रांसक्रिप्ट को रोकने का प्रयास करते समय त्रुटि को पूरी तरह से दबा देना चाहते हैं जो कि ट्रांसक्रिप्टिंग नहीं है, तो आप ऐसा कर सकते हैं:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
ध्यान दें कि स्टार्ट-ट्रांसक्रिप्ट में राइट-एरर, राइट-वर्बोस या राइट-डीबग ... केवल मानक आउटपुट रिकॉर्ड नहीं होता है।
रिचर्ड बर्ग

6
@richard: अब ऐसा लगता है। हो सकता है कि यह 2.0 के अतिरिक्त हो, सुनिश्चित नहीं है कि ये उत्तर 1.0 पर लागू होते हैं।
रॉबर्ट एस सियासीओ

मैं ऊपर लगभग समान कोड का उपयोग कर रहा हूं। मेरी समस्या है, स्टॉप-ट्रांसक्रिप्ट | आउट-नल अभी भी त्रुटि आउटपुट भेजता है यदि ट्रांसक्रिप्टिंग शुरू नहीं हुई है। मुझे संदेश को दबाने की आवश्यकता है क्योंकि यह मेरे लेआउट को गड़बड़ करता है। -संरक्षण चुपचाप महाद्वीप या तो मदद नहीं करता है। कोई विचार?
मेल

4
अंत में, मुझे स्टार्ट-ट्रांसक्रिप्ट के लिए डॉक्स मिले । (निराशा से Powershell संस्करण संख्या के साथ लेबल नहीं किया गया है)। यह कहता है कि "प्रतिलेख में सभी कमांड शामिल हैं जो उपयोगकर्ता प्रकार और सभी आउटपुट जो कंसोल पर दिखाई देते हैं"। हालाँकि, मैंने Powershell 2.0 में Start-Transcript का परीक्षण किया, और पाया कि @Rhardhard सही है, मानक त्रुटि को प्रतिलिपि में नहीं सहेजा गया है। यह बेकार है!
कर्नल पैनिक

यदि आपको वास्तव में निर्दिष्ट स्थान पर लिखने की अनुमति है, तो यह विधि आपको चेतावनी नहीं देती है।
डिमांगोलेम

51

Microsoft ने Powershell’s Connections वेब साइट (2012-02-15 को 4:40 PM) पर घोषणा की है कि संस्करण 3.0 में उन्होंने इस समस्या के समाधान के रूप में पुनर्निर्देशन को बढ़ाया है।

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

विवरण और उदाहरण के लिए "about_Redirection" लेख देखें।

help about_Redirection

1
यह नहीं कह रहा हूं कि मुझे यह समाधान पसंद है। वास्तव में, मुझे यह बदसूरत लगता है, याद रखना कठिन और अनम्य। ऐसा लगता है कि आउट-*, सेट-कंटेंट और ऐड-कंटेंट Cmdlets पर स्ट्रीम कैप्चरिंग मापदंडों को जोड़ने का काम अधिक पॉवर्सली तरीके से किया जाएगा। जब वे इस पर होते हैं, तो उन्हें एक -PassThru पैरामीटर भी जोड़ना चाहिए। जो प्रभावी रूप से उपयोगी टी-ऑब्जेक्ट Cmdlet को कम से कम अप्रचलित कर देगा।
नाथन हार्टले

मैं असमंजस में हूं, यह पूछे गए सवाल का जवाब कैसे देता है? "मैं इसके निष्पादन के दौरान एक PowerShell स्क्रिप्ट के उत्पादन को कैसे पुनर्निर्देशित करूं ? '
Zoredache

आप ठीक कह रहे हैं, @Zoredache, मुझे लगता है कि "स्क्रिप्ट को इस तरह की आवश्यकता कहा जाता है जिस तरह से बदल नहीं सकता" की अनदेखी की है। अधिकांश आउटपुट को कैप्चर करते समय स्टार्ट-ट्रांसक्रिप्ट जाने का रास्ता है। क्या मुझे यह जवाब निकालना चाहिए?
नाथन हार्टले

1
सामान्य पुनर्निर्देशन के लिए यहां आने वालों के लिए, Powershell ने जोड़ा है -OutVariable -WarningVariable -ErrorVariable, जो सीधे मेरी 3 जनवरी '14 टिप्पणी का जवाब देता है।
नाथन हार्टले

2
नहीं, इसे छोड़ना ठीक है। अप-वोटों की संख्या को देखते हुए यह स्पष्ट रूप से उपयोगी है। यह सवाल लगभग निश्चित रूप से उन लोगों से Google हिट हो रहा है जो स्क्रिप्ट को कॉल करने के तरीके को बदलने में सक्षम हैं।
ज़ॉडेचेस

36

उपयोग:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
यह ओपी के सवाल को हल नहीं करता है क्योंकि यह "निष्पादन के दौरान" काम नहीं करता है। लेकिन मैंने इसे +1 कर दिया है क्योंकि यह जानना उपयोगी है कि पॉवर्सशेल में कैसे पाइप किया जाए।
पॉल मासरी-स्टोन

28

मैं इसे लेता हूं आप संशोधित कर सकते हैं MyScript.ps1। फिर इसे बदलने की कोशिश करें:

$(
    Here is your current script
) *>&1 > output.txt

मैंने अभी पावरशेल 3 के साथ यह कोशिश की है। आप सभी पुनर्निर्देशन विकल्पों का उपयोग कर सकते हैं जैसे कि नाथन हार्टले के उत्तर में


मुझे यह समाधान पसंद है। आप संलग्न करने के लिए >> output.txt का उपयोग कर सकते हैं। किसी को भी पता है कि अगर वहाँ यूनिकोड के बजाय ascii बनाने के लिए एक रास्ता है?
प्रोफेसर वॉन लेमोन्गर्ल

1
आप कुछ इस तरह की कोशिश कर सकते हैं: *>&1 | Out-File $log -Encoding ascii -Append -Width 132लेकिन पॉवरशेल वास्तव में बदसूरत है अगर आपको आउटपुट को ठीक से नियंत्रित करने की आवश्यकता है।
mplwork

मुझे यह पसंद है क्योंकि यह आपकी स्क्रिप्ट में काम करता है। योनि के लिए बिल्कुल सही।
user3505901

25

एक संभव समाधान, अगर आपकी स्थिति इसकी अनुमति देती है:

  1. MyScript.ps1 को TheRealMyScript.ps1 का नाम दें
  2. एक नया MyScript.ps1 बनाएं जो दिखता है:

    । \ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
यह था केवल कई विकल्प है कि मेरी स्क्रिप्ट उत्पादन के लिए काम किया है।
कोरी

17

आप cmdlet टी-ऑब्जेक्ट पर एक नज़र डालना चाहते हैं । आप टी को आउटपुट दे सकते हैं और यह पाइपलाइन को और एक फाइल को भी लिख देगा


1
"आउटपुट" | सेट-कंटेंट -PassThru और "आउटपुट" | Add-Content -PassThru टी-ऑब्जेक्ट की तरह भी काम करेगा, इसके अतिरिक्त लाभ है कि आप एन्कोडिंग सेट कर सकते हैं।
नाथन हार्टले

16

यदि आप किसी फ़ाइल में सभी आउटपुट का एक सीधा पुनर्निर्देशन चाहते हैं, तो प्रयोग करके देखें *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

चूंकि यह फ़ाइल के लिए एक सीधा रीडायरेक्ट है, इसलिए यह कंसोल (अक्सर सहायक) के लिए आउटपुट नहीं होगा। यदि आप कंसोल आउटपुट की इच्छा रखते हैं *&>1, तो सभी आउटपुट को संयुक्त करें , और उसके बाद पाइप करें Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

मेरा मानना ​​है कि ये तकनीक PowerShell 3.0 या बाद में समर्थित हैं; मैं PowerShell 5.0 पर परीक्षण कर रहा हूं।


4

यदि आप इसे कमांड लाइन से करना चाहते हैं और स्क्रिप्ट में ही नहीं बनाया गया है, तो उपयोग करें:

.\myscript.ps1 | Out-File c:\output.csv

7
पूछने वाला स्पष्ट रूप से समझा रहा है कि स्क्रिप्ट कॉल को बदला नहीं जा सकता है।
फेर

2
प्रश्न से संबंधित नहीं है, लेकिन मेरे लिए उपयोगी है, मैं पाइप के साथ आउट-फाइल में सही सिंटैक्स प्राप्त करने के लिए जा रहा था।
geeX

0

इसे अपनी स्क्रिप्ट में एम्बेड करने के लिए, आप इसे इस तरह कर सकते हैं:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

यह ट्रिक काम आना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.