如何根据当前文件夹中文件的位置有效地删除多个文件(编辑:或按文件编号检索文件)?
最好我需要一个带有普通 .bat 文件的解决方案。
问题是如何为设置事件定义多个值(而不仅仅是一个值,如下面的示例代码所示),而不是定义多个字节值,新值应该引用文件夹中文件的位置。
例如(下图)删除文件夹中位置 2、11、12、14 的文件。
:: Size is in bytes
set "equal.size=20725"
for /f "usebackq delims=;" %%A in ('dir /b /A:-D *.*') do If %%~zA EQU %equal.size% del "%%A"
或者,我也可以像这样命名文件夹中的文件:
1
2
3
4
5
...
100
删除多个文件并调用其编号的有效方法是什么?
上面的 .bat 代码可以在那个方向上轻松扩展/更改吗?
(在一个 .bat 中使用数组或类似的解决方案?- 我不需要有关如何从数字列表中删除文件的信息)。
答案1
更新
观察:还考虑您的评论:
没问题。
文件夹中有.png
图块 - 3 种类型basically(ABC)
:
其中一些完全充满了彩色pixels(A)
有些只装满了一半pixels(B)
而其他的则没有填充像素all(C)
。
目前,您的脚本删除all C
和B
,但它应该只删除all C
。如果当前脚本正在删除
B
和C
,我们需要测试两件事:
如果在|findstr /b "99\. 100\."
rem :: where B and C : B == 99\. C == 100\. rem :: The findstr command would be with || ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "
99\.100\." >nul || echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "100\." >nul || echo=del /q /f "%%~fi" rem :: The findstr command would by with && ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\.100\." >nul && echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "100\." >nul && echo=del /q /f "%%~fi"rem :: where B and C : B == 100\. C == 99\. rem :: The findstr command would be with || ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\.
100\." >nul || echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\." >nul || echo=del /q /f "%%~fi" rem :: The findstr command would be with && ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\.100\." >nul && echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\." >nul && echo=del /q /f "%%~fi"rem :: where C : C == 0%. rem :: The findstr command would be with || ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "
99\. 100\." >nul || echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "0%" >nul || echo=del /q /f "%%~fi" rem :: The findstr command would be with && ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\. 100\." >nul && echo=del /q /f "%%~fi" ')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "0%" >nul && echo=del /q /f "%%~fi"
考虑到您的评论:
- 嗯,在我的情况下,确定方法也可以是文件名——只要稍微改变一下我的工作流程,我就可以将这 77 个文件命名为数字 1-77。我需要删除全部完全透明(“空”) .png来自多个文件夹的图块和文件大小可能会有所不同,但具体位置或数量始终相同。
您可能需要第三个工具来检查您的文件,然后True
在每种情况下将其删除。
因此,你可以使用图像魔术师,它可以读取文件并验证它是否具有不透明度/透明度框架:
@echo off && cd /d "%~pd0"
Set "_Path_to_Yours_Files=%userprofile%\Pictures\Seletive_PNGs"
Set "_Path_to_ImageMagick=C:\Program Files\ImageMagick-7.0.10-Q16-HDRI"
for /f %%i in ('%__APPDIR__%where.exe "%_Path_to_Yours_Files%:*.png"
')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%% fx:100.00*mean]%%" info:|findstr /b "99\. 100\." >nul || echo=del /q /f "%%~fi"
%__APPDIR__%timeout.exe -1
检查输出后,只需删除echo=
即可有效删除文件:
')do "%_Path_to_ImageMagick%\magick.exe" "%%~fi" -channel a -separate -format "%%[fx:100.00*mean]%%" info:|findstr /b "99\. 100\." >nul || echo=del /q /f "%%~fi"
观察: 为了测试此脚本,我下载了ImageMagick-7.0.10-13-Q16-HDRI-x64-static.exe
- 资料来源:检查图像是否具有透明度
答案2
如果知道命名约定,这是一项非常简单的任务。
@Echo off
Set "No.File=INFO: Could not find files for the given pattern(s)."
Set "Remove#=2 4 8 16 32 64" & REM Arbitrary index.
Set "Ext=Extension type to act upon"
::: - %%I Iterate over index of known file numbers of defined Extension type
::: - %%O Retrieve full path of file If exists using 'where' and Delete
::: - (Nested Loops) 2>Nul Redirect to STDERR when file does not exist.
(For %%I in (%Remove#%) Do For /F "UsebackQ Tokens=* Delims=" %%O In (`"where *_%%I.%Ext%"`) Do If Not "%%~O" == "%No.File%" Del /Q %%O) 2>Nul
REM _ or other 'unique' string prior to file number should be used to ensure pattern is matched to the correct file number
至于跨多个目录操作文件,根据具体情况,有几种方法可以修改上述内容。
- 将其变成一个子程序,并从遍历每个目录的 for 循环中调用它
- 在嵌套外部添加额外的 for 循环来迭代目录
- 如果文件夹存在于单个父文件夹中,请修改“Where”命令以包含
/R
递归开关,后跟目录路径:Where /R C:\Path_To\ParentDirectory *_%%I.%Ext%
答案3
对于这种类型的事情,PowerShell 更加好用并且不那么神秘。
要创建特定类型的文件集合并为每个文件分配一个编号,可以使用以下代码:
$Folder = 'c:\Users\Keith\Screenshots'
Get-ChildItem $Folder *.png | ForEach-Object {$i=1}{
[PSCustomObject]@{
Index = $i++ ;
Path = $_.FullName
}
}
它将产生类似以下的集合:
Index Path
----- ----
1 C:\Users\Keith\Screenshots\Add user to Permissions.PNG
2 C:\Users\Keith\Screenshots\Apply to Folders.png
3 C:\Users\Keith\Screenshots\ArrangeBy.png
4 C:\Users\Keith\Screenshots\Attributes - ReadOnly.png
5 C:\Users\Keith\Screenshots\Attributes Column Added.png
6 C:\Users\Keith\Screenshots\Attributes Column.png
7 C:\Users\Keith\Screenshots\Attributes Detail.png
8 C:\Users\Keith\Screenshots\background on-off.png
9 C:\Users\Keith\Screenshots\Capture.PNG
10 C:\Users\Keith\Screenshots\Command wrapped Shortcut.PNG
11 C:\Users\Keith\Screenshots\Context Bacground.png
12 C:\Users\Keith\Screenshots\Context Foreground.png
13 C:\Users\Keith\Screenshots\Date Column Precedence.png
14 C:\Users\Keith\Screenshots\dd-MM-yy.PNG
15 C:\Users\Keith\Screenshots\Deny Delete Permissions.PNG
16 C:\Users\Keith\Screenshots\Display Scaling.png
17 C:\Users\Keith\Screenshots\Display.PNG
18 C:\Users\Keith\Screenshots\Downloads FolderTyype Topview reg settings.png
19 C:\Users\Keith\Screenshots\Explorer Taskbar Thumbnail Context Menu.png
20 C:\Users\Keith\Screenshots\FIle Type Different Display.png
21 C:\Users\Keith\Screenshots\Folder OPtions 1.PNG
22 C:\Users\Keith\Screenshots\Folder options 2.PNG
23 C:\Users\Keith\Screenshots\Folder Properties Customize tab.png
24 C:\Users\Keith\Screenshots\FolderTypes.png
25 C:\Users\Keith\Screenshots\ForumLayoutWrong.PNG
26 C:\Users\Keith\Screenshots\GPS Columns Added.png
27 C:\Users\Keith\Screenshots\GPS Columns Available.png
28 C:\Users\Keith\Screenshots\HKCR Namespace Venn Diagram.png
29 C:\Users\Keith\Screenshots\IDLIist_Absolute.png
30 C:\Users\Keith\Screenshots\Inheritance.png
31 C:\Users\Keith\Screenshots\JumpList Customized.png
32 C:\Users\Keith\Screenshots\JumpList Default.png
33 C:\Users\Keith\Screenshots\Junction Warning.PNG
34 C:\Users\Keith\Screenshots\Libraries.png
35 C:\Users\Keith\Screenshots\Library.png
36 C:\Users\Keith\Screenshots\Location tab.png
37 C:\Users\Keith\Screenshots\MyStats.PNG
38 C:\Users\Keith\Screenshots\ow1.png
39 C:\Users\Keith\Screenshots\ow2.png
40 C:\Users\Keith\Screenshots\ow3.PNG
41 C:\Users\Keith\Screenshots\Permission.PNG
42 C:\Users\Keith\Screenshots\Permissions 1.PNG
43 C:\Users\Keith\Screenshots\Permissions 2.PNG
44 C:\Users\Keith\Screenshots\Permissions 3.PNG
45 C:\Users\Keith\Screenshots\Permissions 4.PNG
46 C:\Users\Keith\Screenshots\Permissions 5.PNG
47 C:\Users\Keith\Screenshots\QuickStop.png
48 C:\Users\Keith\Screenshots\Read-only.png
49 C:\Users\Keith\Screenshots\Repace Permissions.png
50 C:\Users\Keith\Screenshots\Replace Owner.PNG
51 C:\Users\Keith\Screenshots\Reset Folders.png
52 C:\Users\Keith\Screenshots\SaulsalitStats.PNG
53 C:\Users\Keith\Screenshots\Screenshot (1).png
54 C:\Users\Keith\Screenshots\Screenshot (10).png
55 C:\Users\Keith\Screenshots\Screenshot (100).png
56 C:\Users\Keith\Screenshots\Screenshot (101).png
57 C:\Users\Keith\Screenshots\Screenshot (102).png
58 C:\Users\Keith\Screenshots\Screenshot (103).png
59 C:\Users\Keith\Screenshots\Screenshot (104).png
60 C:\Users\Keith\Screenshots\Screenshot (105).png
61 C:\Users\Keith\Screenshots\Screenshot (106).png
62 C:\Users\Keith\Screenshots\Screenshot (107).png
63 C:\Users\Keith\Screenshots\Screenshot (108).png
64 C:\Users\Keith\Screenshots\Screenshot (109).png
65 C:\Users\Keith\Screenshots\Screenshot (11).png
66 C:\Users\Keith\Screenshots\Screenshot (110).png
67 C:\Users\Keith\Screenshots\Screenshot (111).png
68 C:\Users\Keith\Screenshots\Screenshot (112).png
69 C:\Users\Keith\Screenshots\Screenshot (113).png
70 C:\Users\Keith\Screenshots\Screenshot (114).png
71 C:\Users\Keith\Screenshots\Screenshot (115).png
72 C:\Users\Keith\Screenshots\Screenshot (116).png
73 C:\Users\Keith\Screenshots\Screenshot (117).png
74 C:\Users\Keith\Screenshots\Screenshot (118).png
75 C:\Users\Keith\Screenshots\Screenshot (119).png
76 C:\Users\Keith\Screenshots\Screenshot (12).png
77 C:\Users\Keith\Screenshots\Screenshot (120).png
78 C:\Users\Keith\Screenshots\Screenshot (121).png
79 C:\Users\Keith\Screenshots\Screenshot (122).png
80 C:\Users\Keith\Screenshots\Screenshot (123).png
81 C:\Users\Keith\Screenshots\Screenshot (124).png
82 C:\Users\Keith\Screenshots\Screenshot (125).png
83 C:\Users\Keith\Screenshots\Screenshot (126).png
84 C:\Users\Keith\Screenshots\Screenshot (127).png
85 C:\Users\Keith\Screenshots\Screenshot (128).png
86 C:\Users\Keith\Screenshots\Screenshot (129).png
87 C:\Users\Keith\Screenshots\Screenshot (13).png
88 C:\Users\Keith\Screenshots\Screenshot (130).png
89 C:\Users\Keith\Screenshots\Screenshot (131).png
90 C:\Users\Keith\Screenshots\Screenshot (132).png
91 C:\Users\Keith\Screenshots\Screenshot (133).png
92 C:\Users\Keith\Screenshots\Screenshot (134).png
93 C:\Users\Keith\Screenshots\Screenshot (135).png
94 C:\Users\Keith\Screenshots\Screenshot (136).png
95 C:\Users\Keith\Screenshots\Screenshot (137).png
96 C:\Users\Keith\Screenshots\Screenshot (138).png
97 C:\Users\Keith\Screenshots\Screenshot (139).png
98 C:\Users\Keith\Screenshots\Screenshot (14).png
99 C:\Users\Keith\Screenshots\Screenshot (140).png
100 C:\Users\Keith\Screenshots\Screenshot (141).png
101 C:\Users\Keith\Screenshots\Screenshot (142).png
102 C:\Users\Keith\Screenshots\Screenshot (143).png
103 C:\Users\Keith\Screenshots\Screenshot (144).png
104 C:\Users\Keith\Screenshots\Screenshot (145).png
105 C:\Users\Keith\Screenshots\Screenshot (146).png
106 C:\Users\Keith\Screenshots\Screenshot (147).png
107 C:\Users\Keith\Screenshots\Screenshot (148).png
108 C:\Users\Keith\Screenshots\Screenshot (149).png
109 C:\Users\Keith\Screenshots\Screenshot (15).png
110 C:\Users\Keith\Screenshots\Screenshot (150).png
111 C:\Users\Keith\Screenshots\Screenshot (151).png
112 C:\Users\Keith\Screenshots\Screenshot (152).png
113 C:\Users\Keith\Screenshots\Screenshot (153).png
114 C:\Users\Keith\Screenshots\Screenshot (154).png
115 C:\Users\Keith\Screenshots\Screenshot (155).png
116 C:\Users\Keith\Screenshots\Screenshot (156).png
117 C:\Users\Keith\Screenshots\Screenshot (157).png
118 C:\Users\Keith\Screenshots\Screenshot (158).png
119 C:\Users\Keith\Screenshots\Screenshot (159).png
120 C:\Users\Keith\Screenshots\Screenshot (16).png
121 C:\Users\Keith\Screenshots\Screenshot (160).png
通过此集合,我们可以轻松地按索引/位置选择文件:
$FileNums = @(2,11,12,14)
$Folder = 'c:\Users\Keith\Screenshots'
Get-ChildItem $Folder *.png | ForEach-Object {$i=1}{
[PSCustomObject]@{
Index = $i++ ;
Path = $_.FullName
}
} | Where Index -in $FileNums
这给了我们以下输出:
Index Path
----- ----
2 C:\Users\Keith\Screenshots\Apply to Folders.png
11 C:\Users\Keith\Screenshots\Context Bacground.png
12 C:\Users\Keith\Screenshots\Context Foreground.png
14 C:\Users\Keith\Screenshots\dd-MM-yy.PNG
由于我们的目标是删除文件,因此我们可以将这些文件通过管道传输到Remove-Item
。我们将“FullName”映射到“Path”的原因是为了将值与接受管道输入的参数Remove-Item
匹配。-Path
您可以安全地运行以下代码来测试它是否找到了正确的文件。如果找到了,请-whatif
从Remove-Item
cmdlet中删除该参数
$FileNums = @(2,11,12,14)
Get-ChildItem $Folder *.png | ForEach-Object {$i=1} {
[PSCustomObject]@{
Index = $i++ ;
Path = $_.FullName
}
} | Where Index -in $FIleNums | Remove-Item -whatif