Мне нужно получить все файлы, включая файлы, находящиеся в подпапках, принадлежащих к определенному типу.
Я делаю что-то вроде этого, используя Get-ChildItem:
Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}
Однако он возвращает мне только имена файлов, а не весь путь.
Добавьте | select FullName
в конец вашей строки выше. Если вам нужно что-то делать с этим позже, вам, возможно, придется перевести его в цикл foreach, например:
get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % {
Write-Host $_.FullName
}
Это должно выполняться намного быстрее, чем использование поздней фильтрации:
Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
Вы также можете использовать Select-Object так:
Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
Здесь короче:
(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
Если относительные пути – это то, что вы хотите, вы можете просто использовать флаг -Name
.
Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name
Get-ChildItem -Recurse *.txt | Format-Table FullName
Вот что я использовал. Я считаю, что это более понятно, поскольку он не содержит синтаксиса цикла.
Попробуйте следующее:
Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Это сработало для меня и создает список имен:
$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname
Я нашел его, используя get-member -membertype properties
, невероятно полезную команду. большинство параметров, которые оно дает вам, добавляются с помощью .<thing>
, например fullname
. Вы можете использовать ту же команду;
| get-member -membertype properties
в конце любой команды, чтобы получить дополнительную информацию о том, что вы можете с ними сделать и как получить доступ к ним:
get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
[альтернативный синтаксис]
Для некоторых людей операторы с направленными трубами не являются их вкусом, но скорее предпочитают цепочки. См. Некоторые интересные мнения по этой теме, разделяемые в roslyn tracker: dotnet/roslyn # 5445.
Исходя из случая и контекста, один из таких подходов можно считать неявным (или косвенным). Например, в этом случае с использованием pipe fromnumerable требуется специальный токен $_
(aka PowerShell "THIS" token
), который может показаться неприятным для некоторых.
Для таких ребята, это более сжатый, прямой способ сделать это с помощью цепочки точек:
(gci . -re -fi *.txt).FullName
(<rant> Обратите внимание, что парсер PowerShell-аргументов аргументов принимает имена парциальных параметров. Таким образом, помимо -recursive
; -recursiv
, -recursi
, -recurs
, -recur
, -recu
, -rec
и -re
, но, к сожалению, не -r
.., который является единственным правильным выбором, который имеет смысл с единственным символом -
(если мы идем по соглашениям POSIXy UNIXy)! </rant> )
Действительно раздражающая вещь в PS 5, где $ _ не будет полным путем в foreach. Это строковые версии объектов FileInfo и DirectoryInfo. По какой-то причине подстановочный знак в пути исправляет это, или используйте PS 6. Вы также можете направить pipeку, чтобы получить элемент посередине.
Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }
Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }
Я использую приведенный ниже скрипт для извлечения всего пути к папке:
Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"
Полный путь к папке не идет. После 113 символов, идет:
Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...