Batch file 批处理文件按指定的扩展名删除文件

Batch file 批处理文件按指定的扩展名删除文件,batch-file,Batch File,我需要删除所有扩展名未在参数中指定的文件(除了.sys文件)。问题在于我的变量赋值 以下是我的命令(抱歉重复,我不知道如何使用或声明): 如果您能就如何使此代码按我的预期工作提出建议,我将不胜感激。您的代码的主要问题是变量扩展。在批处理文件中,当读取一个命令或一个命令块(括号中包含多个命令)时,将对其进行解析,然后执行。在解析阶段,变量读取操作(%var%)将从要替换为变量内值的代码中删除。完成此操作后,将执行命令或块 所有这一切都意味着,在执行代码时,如果更改变量(存在于代码中),则在同一命令

我需要删除所有扩展名未在参数中指定的文件(除了.sys文件)。问题在于我的变量赋值

以下是我的命令(抱歉重复,我不知道如何使用或声明):


如果您能就如何使此代码按我的预期工作提出建议,我将不胜感激。

您的代码的主要问题是变量扩展。在批处理文件中,当读取一个命令或一个命令块(括号中包含多个命令)时,将对其进行解析,然后执行。在解析阶段,变量读取操作(
%var%
)将从要替换为变量内值的代码中删除。完成此操作后,将执行命令或块

所有这一切都意味着,在执行代码时,如果更改变量(
存在于代码中
),则在同一命令/块内无法检索更改的值,因为没有任何变量读取操作,只有开始执行阶段前变量中的值

使用
setlocal enabledelayedexpansion
可以避免这种情况。此命令允许您根据需要更改用于将变量从
%var%
读取到
的语法!瓦尔,向解析器指示变量扩展必须延迟到命令执行时,而不是在解析阶段

因此,您的代码可能类似于

@echo关闭
延迟扩展
cls
cd试验
对于(*.*)中的%%f,请执行以下操作(
设置“exist=false”
对于%%a in(%*)do(
如果/i“%%~xf”==”%%a“set”存在=真
如果/i“%%~xf”==”.sys“设置”exist=true”
)
如果“!exist!”==“false”(
del“%%f”
)
)
暂停
注意

  • set var=value
    已更改为
    set var=value
    。空格很重要,您正在定义一个名为
    var[space]
    的变量,该变量的值为
    [space]value

  • 所有变量赋值都被引用,以防止变量值中包含不必要的结束空格。如果包含空格,则测试可能失败。小心这是不必要的,但这是一个好习惯

  • 包含引号是为了防止文件名或扩展名中出现空格问题

  • %exists%
    已更改为
    !存在
    以便在同一块中检索更改的值(
    对于%%f

  • if
    扩展比较包括用于不区分大小写测试的
    /i
    开关

您还应该注意,当启用延迟扩展时,
字符成为问题,因为解析器将其视为变量读取操作的一部分。如果您有可能包含此字符的文件或扩展名,则延迟扩展是一个问题。可以这样做,但只需要在真正需要时启用延迟扩展,在不需要时再次禁用

@echo关闭
setlocal disabledelayedexpansion
cls
cd试验
对于(*.*)中的%%f,请执行以下操作(
设置“exist=false”
对于%%a in(%*)do(
如果/i“%%~xf”==”%%a“set”存在=真
如果/i“%%~xf”==”.sys“设置”exist=true”
)
延迟扩展
如果“!exist!”==“false”(
端部
del“%%f”
)否则(
端部
)
)
暂停
但是,在您的情况下,您只是在两个值之间更改变量值,并且这些值是不相关的,它只是一个标志,您可以忽略延迟扩展和变量内的实际值,并使用另一种语法,
(如果定义)
)来测试变量是否包含值。您的
true/false
可以是
已定义/未定义的测试

@echo关闭
setlocal enableextensions disabledelayedexpansion
cd试验
对于(*)中的%%f,请执行以下操作(
设置“removeFile=1”
对于%%x英寸(sys%*)执行(
如果/i“%%~xf”==”%%~x“设置”removeFile=”
)
如果定义了removeFile del“%%f”
) 
暂停
如果扩展名与任何参数匹配,则变量内容将被删除,也就是说,现在变量未定义

编辑以适应Magoo的评论

处理文件系统元素时,可能会在文件/文件夹选择中看到意外行为

不遵循
8.3
传统命名(名称最多8个字符,扩展名最多3个字符,无特殊字符,无空格)的文件和文件夹具有长名称,但它们也具有与长名称关联的短
8.3
名称。使用
dir
命令中的
/x
开关可以看到它

虽然不直接可见,但在完成通配符搜索时会检查这些短名称,从而导致选择的文件/文件夹的长文件名或扩展名与请求的通配符表达式不匹配,但短名称或扩展名与通配符匹配

如果短名称或扩展名需要在
for
循环中处理,则在
for
可替换参数(例如
%%f
)中用于检索这些参数的修饰符为

%%~snxf    Short name and short extension of the element being referenced by %%f
%%~snf     Short name of the element being referenced by %%f
%%~sxf     Short extension of the element being referenced by %%f

代码的主要问题是变量扩展。在批处理文件中,当读取一个命令或一个命令块(括号中包含多个命令)时,将对其进行解析,然后执行。在解析阶段,变量读取操作(
%var%
)将从要替换为变量内值的代码中删除。完成此操作后,将执行命令或块

所有这一切都意味着,当代码执行时,如果您更改一个变量(
存在于您的co中
%%~snxf    Short name and short extension of the element being referenced by %%f
%%~snf     Short name of the element being referenced by %%f
%%~sxf     Short extension of the element being referenced by %%f