我正在尝试编写一个 Windows 批处理脚本文件来删除只是.asp 文件。
如果我做:
del *.asp /s
这会产生副作用,即删除所有扩展名为 .aspx 的文件。这很糟糕,因为我想保留扩展名为 aspx 的文件。
有没有什么方法可以解决这个问题,而不需要安装自定义应用程序?
答案1
这似乎在 Vista 上有效:
for %i in (*.asp) do @if not %~xi==.aspx del %i
了解更多信息
help for
变量有各种类型的修饰符:
此外,FOR 变量引用的替换功能也得到了增强。现在您可以使用以下可选语法:
%~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
答案2
我怀疑是因为 del 是一个 DOS 老式命令,它不能理解长度超过 3 个字符的扩展名。
我能看到几种解决方案,其中只有一种你会喜欢,但没有一种能满足你的确切要求:
答案3
Powershell 将执行此操作。虽然dir -r *.asp
将匹配*.aspx
,但您可以轻松优化输出:
dir . -r -inc *.asp
使用-include
来匹配 PSH 中的通配符,而不是-filter
(通常更快)与 Win32 API 匹配(与 的结果相同cmd.exe
)。
您可能只想删除文件,因此,为了进行测试:
dir . -r -inc *.asp | ?{-not $_.PSIsContainer} | del -whatif
使用-whatif
仅列出将要发生的事情。使用-confirm
提示配置文件删除。在脚本中使用时避免使用别名,但列出已完成的操作:
Get-ChildItem -path . -recurse -include *.asp |
Where-Object {-not $_.PSIsContainer} |
Remove-Item -Verbose