#powershell #output #txt #write
Вопрос:
У меня есть следующий код:
$readPath = "C:FirstFolder"
$writePath = "C:SecondFolder"
Function Recurse($folder, $lvl) {
Get-ChildItem -Path $folder -File | ForEach-Object {
Write-Host "$(" "*$lvl)> $($_.Name) - $((Get-Acl -Path $_.FullName).Owner)"
}
Get-ChildItem -Path $folder -Directory | ForEach-Object {
Write-Host "$(" "*$lvl)> $($_.Name)"
Recurse -folder $_.FullName -lvl $($lvl 1)
}
}
$root = Get-Item -Path $readPath
Recurse -folder $root.FullName -lvl 0
что дает такой результат:
> File0.xlsx - OwnerB
> Directory1
>File1.1.txt - OwnerB
>File1.2.ppt - OwnerA
>Directory2
>File2.1 - OwnerA
>File2.2 - OwnerA
Когда я добавляю код $log | Out-File $writePathOwnerTree.txt -Encoding UTF8
, мой выходной файл пуст.
Кто-нибудь знает, как получить выходной файл с тем же макетом, что и в PowerShell?
Ответ №1:
Всего несколько вещей:
- Сделайте так , чтобы ваша функция выводила строки вместо использования
Write-Host
, единственной целью которого является запись на экран консоли для отображения - запишите результат вашей функции в переменную и сохраните его в файл
- Если вы хотите записывать как в файл, так и в консоль , используйте
Set-Content
вместоOut-File
, потому что у этого также есть переключатель-PassThru
function Get-OwnerTree ([string]$folder, [int]$lvl) {
Get-ChildItem -Path $folder -File | ForEach-Object {
"$(" "*$lvl)> $($_.Name) - $((Get-Acl -Path $_.FullName).Owner)"
}
Get-ChildItem -Path $folder -Directory | ForEach-Object {
"$(" "*$lvl)> $($_.Name)"
Get-OwnerTree -folder $_.FullName -lvl ( $lvl)
}
}
$root = Get-Item -Path $readPath
$log = Get-OwnerTree -folder $root.FullName -lvl 0
$log | Set-Content -Path "$writePathOwnerTree.txt" -Encoding UTF8 -PassThru
Я также изменил имя функции в соответствии с соглашением PowerShell об именовании глаголов и существительных
Комментарии:
1. Похоже, это сделало трек — спасибо, Тео!