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

neskvpey  于 2022-11-10  发布在  Shell
关注(0)|答案(7)|浏览(197)

对于特定的文件夹,我需要列出扩展名为.js的所有文件,即使嵌套在任何级别的子文件夹中。
输出控制台的结果应该是一个不带扩展名的文件名列表,可以逐行轻松复制和粘贴到另一个应用程序中。
目前我正在尝试这样做,但在输出控制台中,我得到了几个元信息,而不是一个简单的列表。

Get-ChildItem -Path C:\xx\x-Recurse -File | sort length –Descending

你能给我一些提示吗?

gdx19jrr

gdx19jrr1#

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

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

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

Get-ChildItem -Path .\ -Filter *.js -Recurse -File| Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName
} | clip

如果需要完整路径,但不带扩展名,请将$_.BaseName替换为:

$_.FullName.Remove($_.FullName.Length - $_.Extension.Length)
9lowa7mx

9lowa7mx2#

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

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

o2g1uqev3#

有两种过滤文件的方法:使用通配符或使用正则表达式(Regex)的globbing

**警告:**BLOBING方法的缺点是它也匹配不应该匹配的文件,如*.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来Map结果:

Select-Item { $_.Name.Replace( ".js", "") }

总而言之,还有一个非常简短的版本,您不应该在脚本中使用它,因为它很难读懂:

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

dgjrabp24#

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

(Get-ChildItem -Filter *.js -Recurse).BaseName | Sort length -Descending
0yg35tkg

0yg35tkg5#

上面的答案很好用。但是,在Windows中有一个名为ls的别名,与Linux上的别名相同,因此也可以使用另一个较短的命令ls -Filter *.exe

i7uq4tfw

i7uq4tfw6#

使用BaseName作为不带文件扩展名的文件名。

Get-ChildItem -Path ".\*.js" | Sort-Object Length -Descending | ForEach-Object {
    $_.BaseName  
}
ltskdhd1

ltskdhd17#

我过去总是用Cygwin来做这个。我的上一个雇主封锁了我们的环境,但没有。我喜欢查看我经常修改的最新文件。我创建了名为LatestCode的以下环境变量来存储脚本。然后,我使用:iex$env:Latest代码执行它。
脚本是这样的:Get-子项目“.”-Recurse-Include*.ts,.html,.sass,.Java,.js,*.css|where-Object{$_.mode-notMatch“d”}|排序lastWritetime-降序|Select-Object-first 25|Format-table lastWritetime,Fullname-AutoSize

相关问题