Powershell - список всей альтернативной информации о потоке данных из одного каталога
Моя конечная цель здесь - перейти в каталог в powershell и затем перечислить все файлы альтернативного потока данных, а затем вывести все их содержимое в CSV.
В настоящее время у меня есть первые две части сценария:
cd c:\users\profilename\downloads\
gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data'
Чтобы открыть пример файла потока данных, откройте cmd, cd в каталоге и запустите:
dir /r
После этого возьмите определенное в зоне имя одного из файлов и выполните эту команду без:$data.
Пример перед удалением:$Data
notepad test.docx:Zone.Identifier:$Data
После удаления (запустите эту команду):
notepad test.docx:Zone.Identifier
Как мне взять выходные данные второй команды и использовать поле PSPath, чтобы открыть каждый из этих файлов, а затем вывести все содержимое в один файл CSV?
Любая помощь с благодарностью.
3 ответа
Предполагая, что вы находитесь за потоком контента:
## Q:\Test\2018\11\19\SO_53380498.ps1
Pushd $ENV:USERPROFILE\Downloads
Get-ChildItem -Recurse | ForEach-Object {
Get-Item $_.FullName -Stream *
} | Where-Object Stream -ne ':$Data' |
Select-Object FileName,Stream,
@{n='CreationTime';e={(Get-Item $_.FileName).CreationTime}},
@{n='LastWriteTime';e={(Get-Item $_.FileName).LastWriteTime}},
@{n='Content';e={gc "$($_.FileName):$($_.Stream)"}} |
Export-Csv Streams.csv -NoTypeInformation
Короткий вывод сгенерированного файла Streams.csv
(формат даты зависит от локали / пользовательских настроек):
> gc .\Streams.csv
"FileName","Stream","CreationTime","LastWriteTime","Content"
"C:\Users\LotPings\Downloads\2018-06-27-raspbian-stretch.zip","Zone.Identifier","2018-07-29 22:13:03","2018-07-29 22:16:41","[ZoneTransfer] ZoneId=3"
Если ваш конечный пункт назначения для csv поддерживает многострочные поля, вы можете выполнить -join "`n" для содержимого.
Поскольку ADS может содержать двоичные данные, я бы не стал сбрасывать их в текстовый файл, особенно в форматированный текстовый файл, такой как CSV. Чтобы просмотреть содержимое ADS, вы можете отобразить шестнадцатеричный дамп его содержимого, например. г.:
Get-ChildItem -Recurse | Get-Item -Stream * | ? {$_.Stream -ne ':$DATA'} | % {
Write-Host "`n`n$($_.FileName):$($_.Stream)" -NoNewline
Get-Content -LiteralPath $_.FileName -Stream $_.Stream -Raw | Format-Hex
}
Это решение также будет работать для путей UNC, например путей к сетевому ресурсу.
Я думаю, что это может быть близко к тому, что вы хотите:
$files = gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data' | select filename,stream,@{'name'='identifier';"e"={"$($_.filename)$($_.stream)"}}
Разбит на несколько строк для удобочитаемости:
$files = Get-ChildItem -Recurse |
Where-Object { Get-Item $_.FullName -Stream * } |
Where-Object {$_.Stream -ne ':$Data'} |
Select-Object -Properties filename, stream, @{'name'='identifier';"e"={"$($_.filename)$($_.stream)"}}