我想从指定目录和所有子目录递归地创建一个文本文件,其中包含某个文件类型的所有文件名加上文件大小。
例如:从一个巨大的照片集中列出所有.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
有人可以编辑其中之一吗?这样我就可以得到想要的列表,或者提出其他解决方案?
答案 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
。
还有一个powershell选项:
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
以外的文件,并且该列表中将不包含未请求的标头。