Получение всех файлов в каталоге с PowerShell Get-ChildItem - PullRequest
1 голос
/ 28 июня 2019

Я использовал следующую команду для получения хэшей MD5 для всех файлов в каталоге (и всех его подкаталогах):

Get-FileHash -Algorithm MD5 -LiteralPath (Get-ChildItem "*.*" -Recurse)

Однако я понял, что в некоторых подкаталогах есть файлы без расширения.

В чем разница между следующими двумя командами и является ли хорошим способом получить все файлы в каталоге (включая файлы без расширения файла)? Их выходные данные выглядят одинаково для моего тестового каталога, но только первый работает как вход для командлета Get-FileHash.

Get-ChildItem "*" -Recurse

Get-ChildItem -Recurse | where {!$_.PsIsContainer}

Редактировать: Спасибо, Матиас, оба они работают с Get-FileHash (включая файлы без расширения файла, а также файлы с квадратными скобками в имени файла):

Get-FileHash -Algorithm MD5 -LiteralPath (Get-ChildItem "*" -Recurse)

Get-ChildItem -Recurse | where {!$_.PsIsContainer} | Get-FileHash -Algorithm MD5

1 Ответ

0 голосов
/ 28 июня 2019

Помогает публиковать сообщения об ошибках. Это сработало бы, если бы вы действительно хотели сделать это таким образом. Это является частью раздражающей проблемы с PS 5, где строковая версия, которую возвращает get-childitem, не является полным путем. Странно, что *. * Возвращает полный путь. Один из обходных путей заключается в том, чтобы после этого передать его получателю.

get-filehash -Algorithm MD5 -LiteralPath (Get-ChildItem -Recurse | get-item | 
where {!$_.PsIsContainer})

Другой способ. Get-ChildItem теперь имеет опцию -File. И получите полное имя.

get-filehash -Algorithm MD5 -LiteralPath (Get-ChildItem -Recurse -File).fullname

Простая демонстрация проблемы:

get-childitem * -recurse | foreach-object { "$_" }

foo2
hi.doc
hi2.doc


get-childitem *.* -recurse | foreach-object { "$_" }

C:\Users\js\foo\foo2\hi2.doc
C:\Users\js\foo\hi.doc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...