脚本删除文件夹中的文件,并尝试删除文件夹之外的其他文件

时间:2019-05-21 06:54:51

标签: batch-file

我使用批处理脚本删除脚本所在的本地文件夹中的某些文件。尽管如此,该脚本还是试图删除位于其他位置(“程序文件(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
    )
)

我希望脚本仅尝试删除脚本文件所在文件夹中的文件。

如何避免这种副作用?

4 个答案:

答案 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在搜索文件时也会考虑系统环境变量PATHPATHEXT。要将搜索限制到当前目录,从而忽略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对待通配符的方式与fordir(它们是cmd的内部命令)并不完全相同,因为后者也将短{ {3}}。

有以下几种方法可以避免这种情况:

  1. 使用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选项。

  2. 使用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循环来实现此目的。

如果您所需要做的只是从保存运行的 的目录中删除所有扩展名以.dfs开头的文件,则只需一个命令:

@Del /Q "%~dp0*.dfs"

打开命令提示符窗口,然后输入 del /? 以读取其用法信息。

使用返回的信息,如果您想从保存正在运行的脚本及其所有子目录的目录中删除扩展名为.dfs的文件,则可以使用:

@Del /Q /S "%~dp0*.dfs"