web-dev-qa-db-ja.com

名前またはパスに特殊文字®が含まれていないファイルを削除する

私は見た 名前に特定の文字列が含まれていないすべてのファイルを削除する方法

ただし、ファイル名またはパス(ファイル名だけでなく)に特定の文字列が含まれていないファイルを削除したいので、その文字列が必要ですキャラクター®になります。

この改訂履歴 に基づいて、文字列 "MS"に対して以下が機能しますが、特殊文字に対しては機能しません。

@echo off
setlocal disableDelayedExpansion
for /f "usebackq tokens=*" %%i in (`dir /a:-d /b /s *.Zip ^| findstr /v MS` ) do (
  echo del /s /q %%i
)
endlocal
2
root
# ®
$specialChar = [char]0x00AE
Get-ChildItem -File -Recurse | Where-Object {!$_.FullName.Contains($specialChar)} | Remove-Item

-Fileパラメーターをサポートしない古いバージョンのPowerShellの場合は、次を使用します。

Get-ChildItem -Recurse | Where-Object {!$_.FullName.Contains($specialChar) -and -not $_.PSIsContainer} | Remove-Item
3
FastEthernet

更新-Powershellの使用:


Get-childitem -re . | Where-Object {$_ -NotMatch '(?:®)'}|remove-item -recurse -force -Confirm:$false

# Or, by using alias #
gci -re . | ? {$_ -NotMatch '(?:®)'}| rd -re -force -Confirm:$false


•また、もっと短くすることもできますcmd/bat


:: in command line :: 
chcp 1252 >nul & for /f "tokens=*" %i in ('dir /a:-d /b /s *.Zip ^|find /v "®"')do echo=del /q /f "%~fi"

:: in cmd/bat file ::
@echo off && >nul chcp 1252

for /f "tokens=*" %%i in ('dir /a:-d /b /s *.Zip ^|find /v "®"')do echo=del /q /f "%%~fi"
  • 使用の可能性が疑わしい私の以前の答えですが、うまくいきます!:

@echo off & >nul chcp 1252 

for /f "tokens=*" %%i in ('dir /a:-d /b /s *.Zip')do (
    echo/"%%~i"|find "®">nul||echo=del /q /f "%%~fi" )

またはコマンドラインで::

>nul chcp 1252 && for /f "tokens=*" %i in ('dir /a:-d /b /s *.Zip')do @echo="%~fi"|find "®">nul||@echo=del /q /f "%~fi"

Obs。:追加するには®コードで、試してみてください...

  • を押し続ける alt (左)+(数字パッド) 169

enter image description here


多分これは助けることができますか?


実際、ページをアクティブにし、ファイル名の書き込み/読み取りに使用されるページをエンコードし、その情報を変数に移動し、すべてをアルファベットスープで読み取って比較する特別なコンソール文字は、cmd/batで処理するのが少し難しいです。 、それが私が言語の助けを求めた理由です...

したがって、偏執的な提案では、ファイルの削除アクションを考慮して、C#を使用して、文字列にbase64を使用して比較を実装してみました(ワイルドカードalt 169 =®)。


  • Obs。:169 = ®であり、0169 = ©

これらのアクションの結果は、スクリプトcmd/batであり、実行時に1つのC#ソースを実行可能ファイルにコンパイルします。この実行可能ファイルは、文字名が存在するかどうかに関係なく、ファイル名から文字列を取得するためにスクリプトで使用されます(base64)。名前に。


これは私の友達ですか、またはは、上で公開したものとはまったく異なるものであり、私の英語の制限により、明確に説明することができません:)


  • script cmd/bat
@echo off && setlocal EnableExtensions EnableDelayedExpansion & chcp 1252 1>nul

cd /d "%~dp0" && set "_.net=%windir%\Microsoft.NET" && title >nul && title Q1500545 
set "_arg=/t:exe /out:"%temp%\b64.exe" "%temp%\b64.cs" /platform:anycpu /unsafe+ /w:0 /o"
set "_here=." type nul >"%temp%\b64.cs" && set "_b64=%temp%\b64.exe" && >"%temp%\b64.cs"^
   (
    echo/ using System^;namespace b64 ^{class Program ^{static void Main^(string[] args^)
    echo/ ^{if ^(args.Length ^> 1 ^&^& args[0] ^=^= "-e" ^| args[0] ^=^= "-E"^)
    echo/ ^{byte[] plainTextBytes ^= System.Text.Encoding.UTF8.GetBytes^(args[1]^)^;
    echo/ Console.Write^(System.Convert.ToBase64String^(plainTextBytes^)^)^;
    echo/ ^}else if ^(args.Length ^> 1 ^&^& args[0] ^=^= "-d" ^| args[0] ^=^= "-D"^)
    echo/ ^{byte[] base64EncodedBytes ^= System.Convert.FromBase64String^(args[1]^)^;
    echo/ Console.Write^(System.Text.Encoding.UTF8.GetString^(base64EncodedBytes^)^)^;
    echo/ ^}^}^}^} 
    ) 

for /f delims^=^ eol^=* %%i in ('%__APPDIR__%where.exe /r "!_.net!" "csc.exe"^|findstr /li k\v2\.
')do "%%~i" !_arg! /nologo && cd /d "%~dp0" && goto :^?

:^?
for /f delims^=^ eol^=* %%i in ('%__APPDIR__%where.exe /r "." "*.Zip"')do call :^[ %%~fi
(for %%D in (exe,cs)do del /q "%temp%\b64.%%D") & endlocal && exit /b 

:^[
for /f tokens^=* %%a in ('"cmd /u /c echo=%~1|find /v """
')do "!_b64!" -e %%~a|findstr "wq4=" >nul && exit /b )
echo/del /f /q "%~1" && exit /b 

  • G:\SUPER_USER\Q1500545:でテストするための私のディレクトリツリー
G:.
¦   Q1500545.cmd
¦
+---Sub_Dir_01
¦       test_º.Zip
¦       test_¿.Zip
¦       test_®.Zip
¦
+---Sub_Dir_02
¦       test_®.Zip
¦       test_º.Zip
¦       test_¿.Zip
¦
+---Sub_Dir_03
¦       test_®.Zip
¦       test_º.Zip
¦       test_¿.Zip
¦
+---Sub_Dir_04_®
        test_®.Zip
        test_º.Zip
        test_¿.Zip

  • 私のスクリプトの結果byecho/del /f /q "%~1"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_01\test_º.Zip"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_01\test_¿.Zip"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_02\test_º.Zip"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_02\test_¿.Zip"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_03\test_º.Zip"
del /f /q "G:\SUPER_USER\Q1500545\Sub_Dir_03\test_¿.Zip"

  • 私のC#コード:
using System;
namespace b64 

{  
   class Program 
   {  
      static void Main(string[] args)
      {
         if (args.Length > 1 && args[0] == "-e" | args[0] == "-E")
         {  
            byte[] plainTextBytes = System.Text.Encoding.UTF8.GetBytes(args[1]);
            Console.Write(System.Convert.ToBase64String(plainTextBytes));

         }  
           else if (args.Length > 1 && args[0] == "-d" | args[0] == "-D")
         {  
             byte[] base64EncodedBytes = System.Convert.FromBase64String(args[1]);
             Console.Write(System.Text.Encoding.UTF8.GetString(base64EncodedBytes));
         }
      }
   }
}

  • コードのコンパイルに使用したコマンドラインC#
C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:exe /out:"%Temp%\b64.exe" "%Temp%\b64.cs" /platform:anycpu /unsafe+ /w:0 /o


enter image description here


enter image description here


1
It Wasn't Me

バッチはUnicode互換ではないため、®を©として認識します。バッチファイルで®を©に変更しただけですが、chcpでコードページを変更しても機能すると思います。名前に®が含まれていないすべてのファイルを削除しますか、それともZipファイルのみを削除しますか?すべてのファイルの場合は、forで* .Zipを*に変更します。

@echo off
Title Delete all files that don't have © in Name
setlocal EnabledelayedExpansion

Rem Specify the path to the folder here:
set Folder=%userprofile%\desktop\test

for /r %Folder% %%a in (*.Zip) do (
set Character=%%a
set Character=!Character:©=!
IF "!Character!"=="%%a" del /a /f "%%a"
)
pause
0
Ricardo Bohner