如何在PowerShell中递归检索具有特定扩展名的任何文件?

Gib*_*boK 37 powershell

对于特定文件夹,我需要列出所有带扩展名的文件,.js即使嵌套在任何级别的子文件夹中也是如此.

输出控制台的结果应该是一个文件名列表,没有逐行扩展名,可以轻松地复制并粘贴到另一个应用程序中.

目前我正在尝试这个,但在输出控制台中,我得到了几个元信息,而不是一个简单的列表.

Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending
Run Code Online (Sandbox Code Playgroud)

你能给我一些提示吗?

Mat*_*sen 56

如果按长度排序不是必需的,您可以使用该-Name参数只Get-ChildItem返回名称,然后使用[System.IO.Path]::GetFileNameWithoutExtension()删除路径和扩展名:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File -Name| ForEach-Object {
    [System.IO.Path]::GetFileNameWithoutExtension($_)
}
Run Code Online (Sandbox Code Playgroud)

如果需要按长度排序,请删除-Name参数并输出BaseName每个FileInfo对象的属性.您可以将输出(在两个示例中)传递给clip,以将其复制到剪贴板:

Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName
} | clip
Run Code Online (Sandbox Code Playgroud)

如果您想要完整路径,但没有扩展名,请替换$_.BaseName为:

$_.FullName.Remove($_.FullName.Length - $_.Extension.Length)
Run Code Online (Sandbox Code Playgroud)

  • @GibboK只需使用`$_.FullName`,这是文件的路径 (2认同)
  • @escapecharacter FWIW `ls 。*.js -re -file` 将在 PowerShell 中执行相同的操作。您可以使用“Get-Alias”(或“alias”或“gal”)查看所有现有别名 (2认同)

Ste*_*nne 8

简单的选项是使用管道中项目的.Name属性,FileInfo然后删除扩展名:

Get-ChildItem -Path "C:\code\" -Filter *.js -r | % { $_.Name.Replace( ".js","") }
Run Code Online (Sandbox Code Playgroud)


Mov*_*GP0 6

有两种方法用于过滤文件:通配符使用通配符,或使用正则表达式(正则表达式)。

警告: 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$' }
Run Code Online (Sandbox Code Playgroud)

然后,您可以根据需要按名称或文件大小排序:

# sort the output 
Sort-Object -PropertyName 'Length'
Run Code Online (Sandbox Code Playgroud)

将其格式化为路径和文件名的简单列表:

# format output
Format-List -Property ('Path','Name')
Run Code Online (Sandbox Code Playgroud)

要删除文件扩展名,您可以使用选择来映射结果:

Select-Item { $_.Name.Replace( ".js", "")
Run Code Online (Sandbox Code Playgroud)

综上所述,还有一个非常简短的版本,您不应该在脚本中使用它,因为它几乎不可读:

ls -r | ? { $_.Name -matches '.*\.js' } | sort Length | % { $_.Name.Replace( ".js", "") | fl
Run Code Online (Sandbox Code Playgroud)


Jas*_*n S 6

如果您喜欢简洁,可以删除 ForEach-Object 和引号。-Path默认为当前目录,因此您可以省略它

(Get-ChildItem -Filter *.js -Recurse).BaseName | Sort length -Descending
Run Code Online (Sandbox Code Playgroud)