Мне нужно получить все файлы, включая файлы, находящиеся во вложенных папках, которые относятся к определенному типу.
Я делаю что-то подобное, используя Get-ChildItem :
Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}
Однако он возвращает мне только имена файлов, а не весь путь.
powershell
powershell-2.0
Гаган
источник
источник
*.txt*
(-Filter
использует подстановочные знаки CMD). Если это не то, что вам нужно, используйте-Include *.txt
.Вы также можете использовать Select-Object так:
Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
источник
Select-Object
возвращаетPSCustomObject
, а не строку. Это может не сработать, если вы используете результат в качестве параметра для другой программыPSCustomObject
, используйте-ExpandProperty FullName
вместо простоFullName
. Насколько я понимаю,-ExpandProperty
параметр заставляет командлет возвращать результаты в виде указанного свойства (собственного?) Типа, а не в виде какого-то настраиваемого объекта.Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Вот более короткий:
источник
(gci -r c:\).fullname
(ls -r c:\).fullname
(ls -r c:).fullname
Если вам нужны относительные пути, вы можете просто использовать
-Name
флаг.Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name
источник
Действительно раздражающая вещь в PS 5, где $ _ не будет полным путем в foreach. Это строковые версии объектов FileInfo и DirectoryInfo. По какой-то причине подстановочный знак в пути исправляет это или используйте Powershell 6 или 7. Вы также можете передать по конвейеру get-item посередине.
Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" } Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }
Похоже, это была проблема с .Net, которая была решена в .Net Core (Powershell 7): поведение Stringification экземпляров FileInfo / Directory изменилось с версии v6.0.2 # 7132
источник
Попробуй это:
источник
Это то, что я использовал. Мне кажется, это более понятно, поскольку в нем нет синтаксиса цикла.
источник
Это сработало для меня и дает список имен:
$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname
Я нашел это с помощью
get-member -membertype properties
невероятно полезной команды. к большинству параметров, которые он дает, добавляется.<thing>
, напримерfullname
, здесь. Вы можете придерживаться той же команды;в конце любой команды, чтобы получить дополнительную информацию о том, что вы можете с ними делать и как получить к ним доступ:
get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties
источник
Почему еще никто не использовал цикл foreach? Плюс в том, что вы можете легко назвать свою переменную:
# Note that I'm pretty explicit here. This would work as well as the line after: # Get-ChildItem -Recurse C:\windows\System32\*.txt $fileList = Get-ChildItem -Recurse -Path C:\windows\System32 -Include *.txt foreach ($textfile in $fileList) { # This includes the filename ;) $filePath = $textfile.fullname # You can replace the next line with whatever you want to. Write-Output $filePath }
источник
$
передtextfile
:$textfile = $fileList[$i].FullName
. Предполагая, что$i
имеет числовое значение, то есть.gci "C:\WINDOWS\System32" -r -include .txt | select fullname
источник
[альтернативный синтаксис]
Некоторым людям не по вкусу операторы направленных каналов, они предпочитают цепочку. Посмотрите несколько интересных мнений по этой теме в системе отслеживания проблем roslyn : dotnet / roslyn # 5445 .
В зависимости от случая и контекста один из этих подходов можно считать неявным (или косвенным). Например, в этом случае использование конвейера для enumerable требует специального токена
$_
(akaPowerShell's "THIS" token
) кому-то может показаться неприятным.Для таких ребят вот более лаконичный и простой способ сделать это с помощью цепочки точек :
(gci . -re -fi *.txt).FullName
(<напыщенная> Обратите внимание , что PowerShell в командные аргументы парсер принимает частичные имена параметров Таким образом , в дополнение к.
-recursive
,-recursiv
,-recursi
,-recurs
,-recur
,-recu
,-rec
и-re
принимаются, но , к сожалению , не-r
.. , который является единственно правильным выбором , который имеет смысл с одного-
символа (если мы следовать соглашениям POSIXy UNIXy)! </rant>)источник
-r
краткая форма слова-Recurse
.-File
переключателя-fi
в примере:-fil
и-file
работает, но не работает-f
. В соответствии со стилем POSIX это должно быть--file
(многобуквенное) и-f
(однобуквенное, если -f не зарезервировано для чего-то еще, скажем,force
switch, тогда это может быть что-то еще, например,-l
или вообще не однобуквенный вариант).Я использую сценарий ниже для извлечения всего пути к папке:
Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"
Полный путь к папке не подходит. После 113 символов идет:
источник
Я использовал эту строковую команду для поиска файлов ".xlm" в "C: \ Temp", и в результате вывести путь к полному имени в файле "result.txt":
(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt
В моих тестах этот синтаксис прекрасно работает.
источник