كيفية إعادة توجيه إخراج PowerShell إلى ملف أثناء تنفيذه

StackOverflow https://stackoverflow.com/questions/1215260

  •  06-07-2019
  •  | 
  •  

سؤال

لدي برنامج PowerShell النصي الذي أرغب في إعادة توجيه الإخراج إليه إلى ملف.المشكلة هي أنني لا أستطيع تغيير طريقة استدعاء هذا البرنامج النصي.لذلك لا أستطيع أن أفعل:

 .\MyScript.ps1 > output.txt

كيف يمكنني إعادة توجيه مخرجات البرنامج النصي PowerShell أثناء تنفيذه؟

هل كانت مفيدة؟

المحلول

وربما Start-Transcript سيعمل لك. أولا وقف لو انها تعمل بالفعل، ثم تشغيله، ووقفها عند الانتهاء.

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path C:\output.txt -append
# Do some stuff
Stop-Transcript

ويمكنك أيضا أن يكون هذا الركض بينما كان يعمل على الأشياء، وأنها إنقاذ جلسات سطر الأوامر الخاص بك للرجوع إليها فيما بعد.

إذا كنت ترغب في منع تماما الخطأ عند محاولة وقف نص غير الاختزال، هل يمكن أن تفعل هذا:

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

نصائح أخرى

أعلن على موقع الويب بوويرشيل واتصالات (2012-02-15 في 16:40) أنه في الإصدار 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

استخدم:

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

أحد الحلول الممكنة، إذا كان وضعك يسمح بذلك:

  1. أعد تسمية MyScript.ps1 إلى TheRealMyScript.ps1
  2. قم بإنشاء MyScript.ps1 جديد يبدو كما يلي:

    . heRealMyScript.ps1 > ملف الإخراج.txt

وأنا أعتبر يمكنك تعديل MyScript.ps1. ثم محاولة تغييره مثل ذلك:

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

ولقد حاول هذا مع بوويرشيل 3. يمكنك استخدام جميع الخيارات إعادة توجيه كما هو الحال في <لأ href = "https://stackoverflow.com/questions/1215260/how-to-redirect-the-output-of-a -powershell-إلى-ملف-خلال-في-تنفيذ / 2916392 # 2916392 "> ناثان هارتلي في الإجابة .

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

إذا كنت ترغب في إعادة توجيه التوالي من كافة الإخراج إلى ملف، حاول استخدام *>>:

# 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 ;

وأعتقد معتمدة هذه التقنيات في بوويرشيل 3.0 أو في وقت لاحق. أنا على اختبار على بوويرشيل 5.0.

إذا كنت تريد أن تفعل ذلك من سطر الأوامر وليس في صلب النص نفسه، الاستخدام:

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

لتضمين هذا في السيناريو الخاص بك، يمكنك القيام بذلك مثل هذا:

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

وهذا ينبغي أن تفعل خدعة.

scroll top