Запись в файлы с помощью Set-Content в PowerShell: Полное руководство

Set-Content – это одна из основных cmdlet в 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 использует единственную cmdlet под названием Set-content. Эта cmdlet позволяет нам гораздо проще использовать PowerShell для записи в файл. Эта cmdlet PowerShell встроенная и имеет всего одну цель: запись в файл.

Не путайте с Add-Content, поскольку они похожи. Set-Content перезаписывает весь файл, в то время как Add-Content добавляет в файл. Я узнал это несколько раз с трудом, когда только начинал!

Создание файла/Перезапись файла

Cmdlet 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

Вывод в файл

Один из cmdlet, который может выводить в файл, это 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 – один из тех основных cmdlet, который используется постоянно. Он не фантастичен, но работает каждый раз и является одним из тех, которые должны быть у вас в арсенале командлетов PowerShell.

Для полного описания смотрите документацию Microsoft по Set-Content.

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