如何使用批处理文件获取文件属性

4
我正在尝试制作一个批处理文件,用于从U盘中删除恶意文件。我知道这些恶意文件主要使用隐藏、只读和系统属性来隐藏自己。目前我是通过删除恶意文件的属性然后将其删除来删除这些文件。现在我想制作一个小型的批处理文件,只需输入驱动器号即可删除这些文件。
我在一个网站上找到了以下代码,用于查找文件的属性。但是,在输入文件名后,批处理文件只是退出而没有显示任何结果。
    @echo off
setlocal enabledelayedexpansion
color 0a
title Find Attributes in Files

:start
set /p atname=Name of the file:
if not exist %atname% (
cls
echo No file of that name exists!
echo.
echo Press any key to go back
pause>nul
goto start
)
for /f %%i in (%atname%) do set attribs=%%~ai
set attrib1=!attribs:~0,1!
set attrib2=!attribs:~1,1!
set attrib3=!attribs:~2,1!
set attrib4=!attribs:~3,1!
set attrib5=!attribs:~4,1!
set attrib6=!attribs:~5,1!
set attrib7=!attribs:~6,1!
set attrib8=!attribs:~7,1!
set attrib9=!attribs:~8,1!
cls
if %attrib1% equ d echo Directory
if %attrib2% equ r echo Read Only
if %attrib3% equ a echo Archived
if %attrib4% equ h echo Hidden
if %attrib5% equ s echo System File
if %attrib6% equ c echo Compressed File
if %attrib7% equ o echo Offline File
if %attrib8% equ t echo Temporary File
if %attrib9% equ l echo Reparse point
echo.
echo.
echo Press any key to go back
pause>nul
goto start

你能告诉我为什么这个批处理文件没有显示任何结果就退出了吗?或者你能提供更好的批处理脚本来获取文件属性。

编辑

我只能将上述代码用于单个文件。由于我的批处理文件的目的是通过输入驱动器号码来删除恶意文件,如何使用它来查找特定驱动器中文件所使用的属性。

例如: 在命令提示符中,我们可以使用以下命令来查找给定驱动器的文件属性:

attrib *.*

感谢您的帮助。

删除具有这些属性的每个文件都会破坏程序和系统。我认为你的计划应该修改... - foxidrive
@foxidrive 我只是为了U盘而制作这个批处理文件,不针对其他驱动器。 - Eka
3个回答

4
您正在使用一个不必要的for /f循环(如果文件名包含空格,可能会产生不良结果)。请将其更改为:
for /f %%i in (%atname%) do set attribs=%%~ai

把它转化成这样:

for %%i in ("%atname%") do set attribs=%%~ai

2

我尝试了这个批处理文件(没有仔细检查细节),对我来说似乎很好用。 我注意到如果您不用引号括起文件路径,它会立即关闭 - 例如 "file"。 示例:

Name of the file: path\file.txt // this will close immediately
Name of the file: "path\file.txt" // now it will stay open and display the result

希望这能解决你的问题。至于你在“编辑”中提出的问题,一个简单的选项是遍历文件列表并在每个文件上执行批处理。batch1.bat:(%1指代第一个命令行参数)
@echo off
setlocal enabledelayedexpansion

echo %1
set atname=%1

for %%i in ("%atname%") do set attribs=%%~ai
set attrib1=!attribs:~0,1!
set attrib2=!attribs:~1,1!
set attrib3=!attribs:~2,1!
set attrib4=!attribs:~3,1!
set attrib5=!attribs:~4,1!
set attrib6=!attribs:~5,1!
set attrib7=!attribs:~6,1!
set attrib8=!attribs:~7,1!
set attrib9=!attribs:~8,1!
cls
if %attrib1% equ d echo Directory
if %attrib2% equ r echo Read Only
if %attrib3% equ a echo Archived
if %attrib4% equ h echo Hidden
if %attrib5% equ s echo System File
if %attrib6% equ c echo Compressed File
if %attrib7% equ o echo Offline File
if %attrib8% equ t echo Temporary File
if %attrib9% equ l echo Reparse point
echo.
echo.

接下来,生成一个给定路径(比如“文件夹”包括所有子文件夹)中所有文件的列表:

dir /s /b folder > ListOfFiles.txt

main.bat(逐行读取 ListOfFiles.txt 并将每行作为命令行参数传递给 batch1.bat):

@echo off
for /f "tokens=*" %%l in (ListOfFiles.txt) do (batch1.bat %%l)

然后,从命令提示符(cmd)开始:
main.bat >> output.txt

最后一步生成一个包含完整结果的输出文件。当然,这可以用更加简洁、更加高效的方式来完成,但这是一个明显可行的方向。

0

这是危险的代码 - 但它将删除只读、隐藏和系统文件。它应该无法在C:驱动器上运行,但我还没有测试过。请注意,某些Windows安装在除C:以外的驱动器上。

@echo off
echo "%cd%"|find /i "c:\" >nul || (
del *.??? /ar /s /f
del *.??? /ah /s
del *.??? /as /s
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接