我想要一个批处理文件来删除绝对路径位置 (F:\work) 中的所有文件,除了两个名为 "txt1.txt" 和 "txt2.txt" 的文件

I want a batch file to delete all files in an absolute path location (F:\work) except two files named "txt1.txt" and "txt2.txt"

我正在使用 cmd 批处理代码删除 F:\Work 文件夹内的所有文件,文件 txt1.txt 除外,该文件夹包含两个文件 txt1.txttxt2.txt

这是我正在使用的批处理代码:

forfiles /p "f:\Work" /s /m *.*  /C "cmd /c if not @file==txt1.txt del @path" 

正在删除 txt1.txttxt2.txt。怎么了?

使用 PowerShell 很容易做到这一点。 PowerShell 可以 运行 在所有受支持的 Windows 系统上。当您确信正确的文件将被删除时,删除 WhatIf 开关。

Remove-Item -Path 'F:\work\*' -Recurse -Exclude txt1.txt,txt2.txt -WhatIf

如果您必须从 cmd.exe shell 或 .bat 文件脚本中 运行,

powershell.exe -NoLogo -NoProfile -Command ^
    "Remove-Item -Path 'F:\work\*' -Recurse -Exclude txt1.txt,txt2.txt" -WhatIf

没有必要用forfiles for your task, a standard for loop非常适合:

for /R "F:\Work" %%I in (*) do if /I not "%%~nxI"=="txt1.txt" del "%%~I"

但是,如果你坚持使用forfiles,那么:

  1. 不要指定掩码 /M *.*,而是使用 /M *(这是默认设置),因为前者会跳过没有扩展名的文件。
  2. 注意 forfiles 遍历文件和目录,因此使用 /C "cmd /C if @isdir==FALSE …" 仅处理文件。
  3. 转义 forfiles' /C 字符串中的引号,例如 \"0x22。 (我更喜欢后者,因为 \" 中的 " 仍然被命令处理器识别,这在某些情况下可能需要额外的 ^ 转义,可能导致相当复杂和难以辨认的转义序列.)
  4. 请注意,所有与文件名相关的 @ 变量 return 引用值,因此 if [not] @file==txt1.txt 永远不会 [不] 匹配,但 if [not] @file==\"txt1.txt\" 会 [不] ],而 if /I [not] @file==\"txt1.txt\" 甚至会忽略大小写(正如所说的转义 " 就像 \")。

因此正确的命令行是:

forfiles /S /P "F:\Work" /M * /C "cmd /C if @isdir==FALSE if /I not @file==\"txt1.txt\" del @path"

或者,使用替代引号转义和跳过掩码:

forfiles /S /P "F:\Work" /C "cmd /C if @isdir==FALSE if /I not @file==0x22txt1.txt0x22 del @path"