web-dev-qa-db-ja.com

現在のフォルダー内の位置/ファイル名に応じてファイルを削除する/複数の値を効果的に定義する

現在のフォルダー内の位置に応じていくつかのファイルを効果的に削除するにはどうすればよいですか(編集:または番号でファイルを取得します)。
できれば、通常の.batファイルを使用した解決策が必要です。
問題は、セットイベントに複数の値を定義する方法です(以下のサンプルコードに示すように1つの値だけではありません)。複数のバイト値を定義する代わりに、新しい値はファイル内のファイルの位置を参照する必要がありますフォルダー。
例(下の画像)は、2、11、12、14の位置にあるフォルダー内のファイルを削除します。

IMG:

:: 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コードをその方向に簡単に拡張/変更できますか?
(1つの.batで配列または類似のソリューションを使用していますか?-番号のリストからファイルを削除する方法に関する情報は必要ありません)。

2
atereou

更新

Obs.:あなたのコメントも考慮してください:

問題ありません。
フォルダには_.png_タイルがあります-3種類basically(ABC)
それらのいくつかは色付きで完全に塗りつぶされていますpixels(A)
一部はpixels(B)で半分だけ埋められます
all(C)で、他のピクセルはピクセルで塗りつぶされていません。
現在、スクリプトは_all C_B、ただし、_all C_
のみを削除する必要があります

現在のスクリプトがBC、テストすることが2つあります。

_|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"
    _

あなたのコメントを考慮する:

  • まあ、私の場合も決定方法はファイル名である可能性があります-ワークフローに小さな変更を加えると、1〜77の番号が付いた77個のファイルを作成できます。私が必要なのは、複数のフォルダからすべて完全に透明な(「空の」).pngタイルを削除することです。これらのタイルのファイルサイズはさまざまですが、特定の位置または番号は常に同じです。

ファイルをチェックし、その結果Trueの場合は削除するために、3番目のツールが必要になることがあります。

したがって、ImageMagickを使用して、ファイルを読み取り、不透明度/透明度フレームがあることを確認できます。

_@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"_

Obs.:このスクリプトのテスト目的で、ImageMagick-7.0.10-13をダウンロードしました-Q16-HDRI-x64-static.exe

1
It Wasn't Me

命名規則がわかっている場合、これは非常に簡単な作業です。

@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%
0
T3RR0R

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パラメータを削除します

$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
0
Keith Miller