Как получить рекурсивно любые файлы с определенными расширениями в PowerShell?
Для конкретной папки мне нужно указать все файлы с расширением .js
, даже если они вложены в подпапки на любом уровне.
Результатом для выходной консоли должен быть список имен файлов без расширения строки за строкой, чтобы их можно было легко скопировать и вставить в другое приложение.
В настоящий момент я пытаюсь это сделать, но в выходной консоли я получаю несколько метаинформаций, а не простой список.
Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending
Не могли бы вы дать мне несколько советов?
Ответы
Ответ 1
Если сортировка по длине не является необходимостью, вы можете использовать параметр -Name
, чтобы Get-ChildItem
возвращал только имя, затем используйте [System.IO.Path]::GetFileNameWithoutExtension()
, чтобы удалить путь и расширение:
Get-ChildItem -Path .\ -Filter *.js -Recurse -File -Name| ForEach-Object {
[System.IO.Path]::GetFileNameWithoutExtension($_)
}
Если сортировка по длине желательна, отбросьте параметр -Name
и выведите свойство BaseName
для каждого объекта FileInfo
. Вы можете передать вывод (в обоих примерах) на clip
, чтобы скопировать его в буфер обмена:
Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object {
$_.BaseName
} | clip
Если вы хотите полный путь, но без расширения, замените $_.BaseName
на:
$_.FullName.Remove($_.FullName.Length - $_.Extension.Length)
Ответ 2
Простой вариант заключается в использовании свойства .Name
элемента FileInfo
в конвейере и последующего удаления расширения:
Get-ChildItem -Path "C:\code\" -Filter *.js -r | % { $_.Name.Replace( ".js","") }
Ответ 3
Существует два метода фильтрации файлов: globbing с использованием подстановочного знака или с использованием регулярного выражения (регулярное выражение).
Предупреждение: Метод globbing имеет тот недостаток, что он также соответствует файлам, которые не следует сопоставлять, например *.jsx
.
# globbing with Wildcard filter
# the error action prevents the output of errors
# (ie. directory requires admin rights and is inaccessible)
Get-ChildItem -Recurse -Filter '*.js' -ErrorAction 'SilentlyContinue'
# filter by Regex
Where-Object { $_.Name -Match '.*\.js$' }
Затем вы можете сортировать по имени или размеру файлов по мере необходимости:
# sort the output
Sort-Object -PropertyName 'Length'
Отформатируйте его как простой список путей и имени файла:
# format output
Format-List -Property ('Path','Name')
Чтобы удалить расширение файла, вы можете использовать выбор для отображения результата:
Select-Item { $_.Name.Replace( ".js", "")
Объединяя все вместе, есть также очень короткая версия, которую вы не должны использовать в скриптах, потому что она вряд ли читаема:
ls -r | ? { $_.Name -m '.*\.js' } | sort Length | % { $_.Name.Replace( ".js", "") | fl