Скрипт Powershell для отправки содержимого файлов в директорию на запись-вывод - PullRequest
1 голос
/ 06 февраля 2020

У меня есть папка со следующими файлами:

C:\temp\installer_logs\main.log
C:\temp\installer_logs\component1.log
C:\temp\installer_logs\component2.log

Мне нужен скрипт Powershell, который получает список всех файлов в C: \ temp \ installer_logs и отправляет содержимое каждого файла в Write-Output. Следующее не работает. Помощь?

dir -Recurse C:\temp\installer_logs | Get-ChildItem | Select FullName | Write-Output

Ответы [ 3 ]

2 голосов
/ 06 февраля 2020

Вам просто нужен Get-Content, чтобы действительно прочитать содержимое и передать его в Write-Output

Get-ChildItem C:\temp\installer_logs | Get-Content | Write-Output
2 голосов
/ 06 февраля 2020

Забавная вещь о PowerShell, но такие команды, как dir и ls, на самом деле являются просто псевдонимами для Get-ChildItem, поэтому первые две команды в вашей цепочке на самом деле делают то же самое.

Давайте посмотрим на что вам нужно сделать:

  1. Получить список файлов
  2. Получить содержимое каждого из этих файлов
  3. Вывести каждое содержимое в Write-Output

Глядя на этот шаг за шагом, нам нужно

  1. dir -Recurse C: \ temp \ installer_logs
  2. Для каждого из вышеперечисленных Get-Content для чтения данных из файла
  3. Передача этого содержимого в Write-Output

Предполагая, что это правильно, это сделает то, что вы ищете:

dir -Recurse -File C:\temp\installer_logs | % {Get-Content $_.FullName} | Write-Output

Добавлена ​​опция -File для получения только файлов. При необходимости можно удалить% - псевдоним для командлета ForEach-Object. $ _ - текущий объект, а свойство .FullName дает полный путь

РЕДАКТИРОВАТЬ: ForEach-Object необходим только для командлетов, которые выполняют не принимать входные данные конвейера сами. Поскольку командлет Get-Content понимает объекты Get-ChildItem в конвейере, мой ответ может быть упрощен до:

dir -Recurse -File C:\temp\installer_logs | Get-Content | Write-Output

И, tbh, также не уверен, что запись-вывод также необходима. Насколько я понимаю, его отключение, похоже, делает то же самое.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Ответ на 1-й комментарий ...

Я всегда скажите моим коллегам, что ответ "возможно ли это?" всегда "да". Иногда слишком ресурсоемкий или дорогой, но почти никогда не возможный. Попробуйте что-то вроде этого:

dir -Recurse -File C:\temp\installer_logs | % {"----- $($_.FullName) -----";Get-Content $_.FullName} | Write-Output

Даже не уверен, что «Write-Output» необходим, если вы не пытаетесь перенаправить куда-то, кроме экрана.

0 голосов
/ 06 февраля 2020

Попробуйте:

dir -Recurse C:\temp\installer_log *.log  | Get-ChildItem | Get-Content

Приветствия,

~ G

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...