更新

更新

如何根据当前文件夹中文件的位置有效地删除多个文件(编辑:或按文件编号检索文件)?
最好我需要一个带有普通 .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 CB,但它应该只删除all C

如果当前脚本正在删除BC,我们需要测试两件事:

如果在|findstr /b "99\. 100\."

  1. 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"
  2. 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"
    
  3. 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

您可以安全地运行以下代码来测试它是否找到了正确的文件。如果找到了,请-whatifRemove-Itemcmdlet中删除该参数

$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

相关内容