我使用批处理脚本删除脚本所在的本地文件夹中的某些文件。尽管如此,该脚本还是试图删除位于其他位置(“程序文件(x86)”文件夹)中的文件,这很可怕(希望这些文件受读保护):我收到以下错误消息:
C:\ Program Files(x86)\ PathToFile \ TimeSeries.DFSGenericBridge.dll访问被拒绝
C:\ Program Files(x86)\ PathToFile \ ClimateChange.DfsReader.dll访问被拒绝
...
我认为for循环仅在脚本所在的文件夹内循环。
@echo off
Set exten=*.dfs*
for /f "delims=" %%F in ('Where /F %exten%') do (
del %%F
)
)
我希望脚本仅尝试删除脚本文件所在文件夹中的文件。
如何避免这种副作用?
答案 0 :(得分:0)
在您的情况下,for
循环将枚举where
输出中的所有文件,而与当前文件夹无关。只需运行
where /f *.dfs*
在命令行中,您会看到问题:where
在驱动器上显示所有个文件。
如果要缩小范围,请使用/r
开关:
/R Recursively searches and displays the files that match the
given pattern starting from the specified directory.
答案 1 :(得分:0)
您完全不需要where
来执行此操作,实际上,我什至不建议为此使用位置。
只需使用for /R
即可从指定目录(从中启动脚本的目录)通过子目录递归。
@echo off
set "exten=*.dfs*"
for /R %%F in (%exten%) do (
echo del "%%F"
)
但是,如果您只想从启动脚本的根目录而不是子目录中删除文件:
@echo off
set "exten=*.dfs*"
for %%F in (%exten%) do (
echo del "%%F"
)
一旦对屏幕上的输出感到满意,请删除echo
,这是作为故障保护添加的。在原始脚本中添加echo
也会帮助您不删除从未打算删除的文件,因此请考虑下次执行此操作。
有关更多信息,for
命令,打开cmd.exe
并运行:
for /?
答案 2 :(得分:0)
where
command在搜索文件时也会考虑系统环境变量PATH
和PATHEXT
。要将搜索限制到当前目录,从而忽略PATH
,您需要像这样前缀.:
:
for /F "delims= eol=|" %%F in ('where ".:%exten%"') do (
ECHO del "%%F"
)
但是,这仍然涉及PATHEXT
,因此它也将与somefile.dfs.exe
之类的内容匹配-不确定是否要…
无论如何,更好的方法是直接使用for
loop:
for %%F in ("%exten%") do (
ECHO del "%%~F"
)
或者您改用dir
command:
for /F "delims= eol=|" %%F in ('dir /B /A:-D "%exten%"') do (
ECHO del "%%F"
)
但是请注意,where
对待通配符的方式与for
和dir
(它们是cmd
的内部命令)并不完全相同,因为后者也将短{ {3}}。
有以下几种方法可以避免这种情况:
使用8.3 file names过滤输出或dir /B
:
set "FILTER=\.dfs"
for /F "delims= eol=|" %%F in ('dir /B /A:-D "%exten%" ^| findstr /I /C:"%FILTER%"') do (
ECHO del "%%F"
)
根据搜索条件,您可能需要向/R
添加findstr
选项。
使用where
并暂时删除PATHEXT
:
set "PE=%PATHEXT%" & set "PATHEXT="
for /F "delims= eol=|" %%F in ('where ".:%exten%"') do (
ECHO del "%%F"
)
set "PATHEXT=%PE%"
请注意,更改PATHEXT
仅影响此cmd
实例和潜在的子实例。
答案 3 :(得分:0)
鉴于您提供的代码和任务,要删除脚本所在的本地文件夹中的某些文件,我看不出有任何理由通过For
循环来实现此目的。
如果您所需要做的只是从保存运行的batch-file 的目录中删除所有扩展名以.dfs
开头的文件,则只需一个命令:
@Del /Q "%~dp0*.dfs"
打开命令提示符窗口,然后输入 del /?
以读取其用法信息。
使用返回的信息,如果您想从保存正在运行的脚本及其所有子目录的目录中删除扩展名为.dfs
的文件,则可以使用:
@Del /Q /S "%~dp0*.dfs"