但是,我想删除文件名中不包含特定字符串的文件或路径(不仅仅是文件名),并且我希望该字符串是字符®。
基于此修订历史,以下方法适用于字符串“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