【发布时间】:2014-09-03 17:50:28
【问题描述】:
我正在使用以下代码删除未启动 "S" 的 .txt 文件:
del [^S]*.txt
但它不起作用。
如何做到这一点?
【问题讨论】:
-
dos 不是 unix。正则表达式在这里不起作用。
标签: batch-file cmd dos command-prompt
我正在使用以下代码删除未启动 "S" 的 .txt 文件:
del [^S]*.txt
但它不起作用。
如何做到这一点?
【问题讨论】:
标签: batch-file cmd dos command-prompt
为什么不直接将S*.txt 移动到其他文件夹,全部删除,然后再移回来?
move S*.txt somefolder\
del *.txt
move somefolder\S*.txt .\
【讨论】:
对于 windows Vista 或更高版本的操作系统,试试这个
@echo off
setlocal enableextensions disabledelayedexpansion
set "targetFolder=%cd%"
set "tempFolder=%temp%\%~nx0.%random%.tmp"
md "%tempFolder%" >nul 2>nul
robocopy "%tempFolder%" "%targetFolder%" /nocopy /purge /xf s* /l
rd "%tempFolder%" >nul 2>nul
这将创建一个空文件夹,用作清除目标文件夹的源,即删除源中不存在而目标中存在的文件。由于源为空,所有文件都被删除,但/xf s* 向robocopy 指示应排除以s 开头的文件。包含结尾的/l 开关以仅列出将被删除的文件。如果输出正确,请将其删除。
对于没有robocopy 的windows 版本,可以使用这个。
@echo off
setlocal enableextensions disabledelayedexpansion
set "targetFolder=%cd%"
for /f "delims=" %%a in ('
dir /b /a-d "%targetFolder%" ^| findstr /i /v /b /c:"s"
') do echo del "%%~fa"
效率较低,因为将为每个要删除的文件执行del 命令。想法是使用dir 命令检索所有文件的列表并使用findstr 来,忽略大小写(/i)过滤器仅检索开头不包括(/v)的元素列表行的 (/b) 字符串 S (/c:"s")
del 命令只回显到控制台。如果输出正确,去掉echo命令
【讨论】:
这不漂亮,但你可以:
这是一个例子:
for /f %F in ('dir /B ^| find /v "S"') do del %F /f
更新:为了回应反对票,这里是一个更正和简化的示例:
for /f %F in ('dir S*.txt /B') do del %F /f
这不涉及递归搜索或任何比所述问题更高级的问题。
更新:我应该说“如果可以,请使用 Powershell”。命令提示符是一个可怕的外壳:
gci -Filter S*.txt -recurse | rm
【讨论】:
"delims=" 处理空格并用双引号将最后一个%F 括起来,还可以在dir 命令中添加/a-d 以排除文件夹。