我想要一个批处理文件来删除绝对路径位置 (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.txt
和 txt2.txt
。
这是我正在使用的批处理代码:
forfiles /p "f:\Work" /s /m *.* /C "cmd /c if not @file==txt1.txt del @path"
正在删除 txt1.txt
和 txt2.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
,那么:
- 不要指定掩码
/M *.*
,而是使用 /M *
(这是默认设置),因为前者会跳过没有扩展名的文件。
- 注意
forfiles
遍历文件和目录,因此使用 /C "cmd /C if @isdir==FALSE …"
仅处理文件。
- 转义
forfiles
' /C
字符串中的引号,例如 \"
或 0x22
。 (我更喜欢后者,因为 \"
中的 "
仍然被命令处理器识别,这在某些情况下可能需要额外的 ^
转义,可能导致相当复杂和难以辨认的转义序列.)
- 请注意,所有与文件名相关的
@
变量 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"
我正在使用 cmd 批处理代码删除 F:\Work
文件夹内的所有文件,文件 txt1.txt
除外,该文件夹包含两个文件 txt1.txt
和 txt2.txt
。
这是我正在使用的批处理代码:
forfiles /p "f:\Work" /s /m *.* /C "cmd /c if not @file==txt1.txt del @path"
正在删除 txt1.txt
和 txt2.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
,那么:
- 不要指定掩码
/M *.*
,而是使用/M *
(这是默认设置),因为前者会跳过没有扩展名的文件。 - 注意
forfiles
遍历文件和目录,因此使用/C "cmd /C if @isdir==FALSE …"
仅处理文件。 - 转义
forfiles
'/C
字符串中的引号,例如\"
或0x22
。 (我更喜欢后者,因为\"
中的"
仍然被命令处理器识别,这在某些情况下可能需要额外的^
转义,可能导致相当复杂和难以辨认的转义序列.) - 请注意,所有与文件名相关的
@
变量 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"