创建包含特定类型的所有文件及其文件大小的列表的文本文件

时间:2019-03-16 10:06:46

标签: powershell batch-file

我想从指定目录和所有子目录递归地创建一个文本文件,其中包含某个文件类型的所有文件名加上文件大小。

例如:从一个巨大的照片集中列出所有.jpg个文件及其大小。

我发现了几个类似的问题,但没有这个具体清单。

一个人用完整的路径名做到了这一点,但是我不需要这个,它会变得很长。 另一个列出所有文件,但没有大小。 另一个列出了所有具有大小的文件名,但是我无法指定文件类型。

PowerShell命令创建了所需的列表,但是我不知道如何将其限制为某种文件类型(例如.jpg

gci -rec|?{!$_.PSIsContainer}|%{"$($_.Fullname) $($_.Length)"} >filelist.txt

batch file列出了所有.jpg,但未显示文件大小。

dir /b /s z:\Filme\*.jpg > list1.txt
for /f "tokens=*" %%A in (list1.txt) do echo %%~nxA >> list.txt
del list1.txt

有人可以编辑其中之一吗?这样我就可以得到想要的列表,或者提出其他解决方案?

6 个答案:

答案 0 :(得分:1)

您了解else if (!item){ console.log('erreur'); } else if(item.text) { ... 修饰符,所以您没有注意到%%~nxA修饰符令我有些惊讶。

要进一步简化,请使用%%~zA循环,不要使用临时文件:

for /R

或者如果您需要完整的路径\名称,请使用(for /R %%A in (*.jpg) do echo %%~nxA %%~zA)>list.txt (明确),甚至只使用%%~fA

答案 1 :(得分:1)

文本输出:

Get-ChildItem -Path 'X:\PHOTO' -Filter '*.jp*g' -Recurse | 
    Where-Object {-not $_.PsIsContainer} | 
        Select-Object Name, Length | 
            Out-File -FilePath '.\FileList.txt'

CSV输出:

Get-ChildItem -Path 'X:\PHOTO' -Filter '*.jp*g' -Recurse | 
    Where-Object {-not $_.PsIsContainer} | 
        Select-Object Name, Length | 
            Export-Csv -Path '.\FileList.csv' -NoTypeInformation

P.S。我使用了*.jp*g通配符,该通配符还将匹配*.jpeg文件。不幸的是,* wildcard匹配零个或多个符号,因此您可以在列表中获取类似zzz.jpXXXg的文件。还有其他方法可以过滤Get-ChildItem的输出,而不会受到此问题的影响,例如使用管道和正则表达式进行过滤,但速度较慢:Where-Object {$_.Extension -match '^\.jp[e]{1}g$'}

答案 2 :(得分:1)

另一种选择是不使用-Filter参数,而使用-Include代替通配符模式按预期工作的位置,如下所示:

PowerShell 3.0及更高版本

Get-ChildItem 'z:\Filme' -File -Include '*.jpg' -Recurse | 
    Select FullName, Length | 
    Export-Csv '.\FileList.csv' -NoTypeInformation

PowerShell 3.0以下版本

Get-ChildItem 'z:\Filme' -Include '*.jpg' -Recurse | 
    Where-Object { !$_.PsIsContainer} | 
    Select FullName, Length | 
    Export-Csv '.\FileList.csv' -NoTypeInformation


请注意,-Include仅在您还指定-Recurse或路径在\*中像Get-Childitem 'z:\Filme\*'那样的情况下才有效。 同样,-Filter-Include(或-Exclude)参数的工作速度更快。 如the docs中所述:

“筛选器比其他参数更有效,因为提供程序在cmdlet获取对象时将其应用。否则,PowerShell将在检索到对象后对其进行筛选。”

答案 3 :(得分:0)

任何人都可以编辑其中之一,以便获得所需的列表吗?

批处理脚本几乎就在那里。

%~z1将显示文件大小(以字节为单位)。

您还可以通过使用稍有不同的for命令版本来删除临时文件。

使用以下批处理文件:

@echo off
setlocal
for /f "tokens=*" %%A in ('dir /b /s z:\Filme*.jpg') do (
  if /i "%%~xf" equ ".jpg" echo %%~nxf %%~zf
  ) > list.txt
endlocal

进一步阅读

答案 4 :(得分:0)

尝试

Get-ChildItem "yourdir" -File -Filter '*.jpg' -Recurse | 
    Select FullName, Length | 
        Export-Csv '.\FileList.csv' -NoType

答案 5 :(得分:0)

我从没从Where命令查看布局,但是如果在语言/语言环境之间没有变化,或者从技术上来说,如果您的布局与我的测试系统不太相似,那么

,您可以像这样在您的计算机上完成此操作:

从命令提示符处:

(For /F "Tokens=1,3*" %A In ('Where/T /R . *.jpg 2^>Nul')Do @Echo("%C","%A")>"list.txt"

从批处理文件中:

@(For /F "Tokens=1,3*" %%A In ('Where/T /R . *.jpg 2^>Nul')Do @Echo("%%C","%%A")>"list.txt"

很显然,如果Where命令输出中的布局不同,仍然可以调整Tokens和/或包括定界符以适合您的目标系统。

在上面的示例中,我使用 . 表示当前目录,您当然可以将其更改为另一个相对路径,例如..\Pictures或完整路径,例如C:\Users\Patrick\Pictures


还有一个选项:

Ls -Filt '*.jpg' -Fo -Rec -EA SilentlyContinue|?{!$_.PSIsContainer -And $_.Extension -Eq '.jpg'}|Select FullName,Length|ConvertTo-CSV -NoT|Select -Skip 1|SC '.\list.txt'

这还将包括例如系统文件和隐藏文件,将不包含扩展名为.jpg以外的文件,并且该列表中将不包含未请求的标头。