כתיבה לקבצים באמצעות PowerShell Set-Content: מדריך מלא

Set-Content הוא אחד מפקודות ה- PowerShell הקריטיות שאני לא יכול לעבוד בלעדיה. אני עדיין זוכר שהשתמשתי ב- VBscript לפני שיצא לי להשתמש ב- PowerShell כדי לכתוב לקובץ. אני תמיד זוכר שניסיתי לזכור איזה אובייקט הייתי צריך להשתמש ואת שם השיטה. האם זה היה FileSystemObject, FileObject או מה? זה היה כאב ראש! אפילו כשזכרתי ששם השיטה היה CreateTextFile(), תמיד שכחתי להוסיף את True כארגומנט שני.

הנה דוגמה לאיומה שאני מדבר עליה.

Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile="c:\file.txt"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write "test string"
objFile.Close

השווה את VBScript הזו עם PowerShell הזו:

Set-Content -Path 'C:\file.txt' -Value 'test string'

איזה אתה מעדיף? אני אקח את הדרך של PowerShell! הדרך של PowerShell משתמשת בפקודת אחת בלבד בשם Set-content. פקודה זו מאפשרת לנו להשתמש בצורה הרבה יותר פשוטה ב- PowerShell כדי לכתוב לקובץ. פקודת PowerShell זו היא פקודה מובנית שיש לה מטרה אחת; לכתוב לקובץ.

יש לה כמה פרמטרים פה ושם שיכולים לשנות את ההתנהגות קצת, אך היא מתמקדת באופן בלעדי בכתיבה לקובץ. אל תתבלבל עם Add-Content הכלולה, מאחר והן דומות. Set-Content דורסת את כל הקובץ כש Add-Content מוסיפה לקובץ. למדתי את זה בדרך הקשה מספר רב של פעמים כשהתחלתי!

יצירת קובץ/דרסו של קובץ

פקודת Set-Content פשוטה יחסית. למטה דוגמה טובה. דוגמה זו מראה ש- Set-Content יכולה ליצור קובץ אם אינו קיים או להחליף את כל התוכן בתוך קובץ קיים.

PS> Test-Path -Path C:\test.txt
False
PS> Set-Content -Path C:\test.txt -Value 'foo'
PS> Get-Content -Path C:\test.txt
foo
PS> Set-Content -Path C:\test.txt -Value 'bar'
PS> Get-Content -Path C:\test.txt
bar

פלט לקובץ

הפקודה אחת שיכולה להוציא לקובץ היא Out-File, אך Set-Content יכולה לבצע אותה המשימה עם קצת שינויים קלים.

אולי תרצה למשל לשלוף חלקים ספציפיים של טקסט מקובץ טקסט אחד ולהוציא שורות לקובץ אחר. על ידי שימוש ב־Get-Content ו־Set-Content, אפשר לעשות זאת. אולי יש לי קובץ טקסט עם שרת אחד והסטטוס שלהם לכל שורה. אשמח לקרוא את הסטטוס של כל שרת ולהוציא אותו לקובץ. באמצעות Get-Content לקרוא את הקובץ ו־Set-Content לכתוב לקובץ, זה אפשרי.

PS> Get-Content -Path C:\test.txt
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up
PS> Get-Content -Path C:\test.txt | ForEach-Object {
>>> $srvName = $_.Split(' ')[0]
>>> Set-Content -Path "C:\$srvName.txt" -Value $_
}
PS> Get-ChildItem -Filter 'SRV*'
Directory: C:\
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       10/29/2017  12:38 PM             17 SRV1.txt
-a----       10/29/2017  12:38 PM             19 SRv2.txt
-a----       10/29/2017  12:38 PM             17 SRV3.txt

PS> Get-ChildItem -Filter 'SRV*' | Get-Content
SRV1 Status: Up
SRV2 Status: Down
SRV3 Status: Up

Set-Content היא אחת מהפקודות המרכזיות האלו שמשמשות באופן קבוע. זה לא מפואר אבל עובד בכל פעם והוא אחת שצריך לך בתיק הכלים שלך ב־PowerShell.

לפירוט מלא, ראה את תיעוד ה־Set-Content של Microsoft.

Source:
https://adamtheautomator.com/powershell-write-to-file/