删除名称或路径中没有特殊字符 ® 的文件

删除名称或路径中没有特殊字符 ® 的文件

我见过如何删除名称中不包含特定字符串的所有文件

但是,我想删除文件名中不包含特定字符串的文件或路径(不仅仅是文件名),并且我希望该字符串是字符®。

基于此修订历史,以下方法适用于字符串“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

答案1

# ®
$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

答案2


更新- 使用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


• 也可以更短命令/命令


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

观察:补充®在您的代码中,尝试......

  • 按住 alt (左)+ (数字键盘)1 6 9

在此处输入图片描述


也许这能有帮助?


事实上,特殊的控制台字符,它激活页面并对其进行编码,用于写入/读取文件名,并将该信息移动到变量,读取并比较字母汤中的所有内容,在 cmd/bat 中处理有点困难,这就是为什么我寻求语言帮助...

因此,出于一个偏执的建议,考虑到删除文件的操作,我使用 C# 尝试使用 base64 对字符串进行比较(通配符 alt 169 = ®)。


  • 观察: 169 = ®不同于0169 = ©

这些操作的结果是一个脚本 cmd/bat,它在运行时将一个 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


  • 我的脚本结果经过echo/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



在此处输入图片描述


在此处输入图片描述


答案3

批处理不兼容 unicode,因此它将 ® 识别为 ©,因此我只需在批处理文件中将 ® 更改为 ©,但我想使用 chcp 更改代码页也有效。您是否要删除名称中没有 ® 的所有文件或仅删除 zip 文件?如果是所有文件,只需将 *.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

相关内容