Добавление выходных данных в 1 текстовый файл
Как вы можете видеть ниже, содержимое всех MSG-файлов в папке извлекается. Тем не менее, я вижу только 1 .msg содержимого в выходной файл content.txt, а не все файлы.msg. Как я могу выполнить цикл команды и добавить в тот же файл.txt?
$output_file3 = ‘c:\outlook_files\content.txt’
# Search messages
Get-ChildItem "c:\outlook_files\msg\" -Filter *.msg | Foreach-Object {
# Read current message content
$content = Get-Content $_.FullName >$output_file3
}
4 ответа
Вместо перенаправления используйте Out-File -append
или же Add-Content
так измени
$content = Get-Content $_.FullName >$output_file3
в
Get-Content $_.FullName | out-file $output_file3 -append
Я отбросил присвоение переменной, потому что она ничего не делает в этом контексте.
>
оператор перенаправления усекает существующие файлы. Либо используйте операцию добавления:
Get-Content $_.FullName >>$output_file3
Get-Content $_.FullName | Add-Content $output_file3
Get-Content $_.FullName | Out-File $output_file3 -Append
или выполните операцию записи после ForEach-Object
цикл:
ForEach-Object {
Get-Content $_.FullName
} >$output_file3
ForEach-Object {
Get-Content $_.FullName
} | Set-Content $output_file3
ForEach-Object {
Get-Content $_.FullName
} | Out-File $output_file3
Обычно вы бы предпочли *-Content
или же Out-File
Командлеты над операторами перенаправления, потому что они дают вам лучший контроль над тем, что записывается в файл (а именно, кодирование). Основное различие между Out-File
а также Set-Content
/Add-Content
в том, что первый по умолчанию использует Unicode (точнее, UTF-16 с прямым порядком байтов), а второй - Ascii (фактически кодировка ANSI windows-1252).
Вы можете использовать добавить контент, как этот пример:
add-content -path "c:\test.txt" -value "$value"
Вы можете сделать это просто, если вы не хотите цикл ни за что
Get-Content "c:\outlook_files\msg\\*.msg" | Out-File "c:\outlook_files\content.txt"
или же
Get-Content "c:\outlook_files\msg\\*.msg" > "c:\outlook_files\content.txt"