Как получить рекурсивно любые файлы с определенными расширениями в 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