4

我正在尝试制作一个批处理文件以从 pendrive 中删除恶意文件。我知道这些恶意文件使用隐藏、只读和系统属性主要是为了向用户隐藏自己。目前我正在使用 cmd 通过删除恶意文件属性然后删除它来删除这些文件。现在我正在考虑制作一个小批量文件,只需输入驱动器号即可用于删除这些文件。

我在网站上找到了这段代码来查找文件的属性。但是在输入文件名后,批处理文件只是退出而不显示任何结果。

    @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

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

编辑

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

例如:在 cmd 我们可以使用这个命令来查找给定驱动器的文件属性

attrib *.*

提前感谢您的帮助

4

3 回答 3

2

我尝试了 bat 文件(没有检查细节),它似乎对我来说工作正常。我注意到的是,如果您不使用引号将文件路径括起来 - 例如“文件”,它会立即关闭。例子:

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

这希望能解决你的问题。

就您在EDIT中的问题而言,一个简单的选项是迭代文件列表并在每个文件上执行批处理。

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

最后一步生成具有完整结果的输出文件。诚然,这可以以更精致(可能更短)的方式完成,但这是您可以采取的一个明显方向。

于 2013-09-06T13:10:51.153 回答
2

您在for /f这里使用了一个循环,这不是必需的(如果文件名包含空格,可能会产生不希望的结果)。改变这个:

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

进入这个:

for %%i in ("%atname%") do set attribs=%%~ai
于 2013-09-06T13:23:56.337 回答
0

这是危险代码——但它会删除只读、隐藏和系统文件。它应该无法在 c: 驱动器上运行,但我尚未对其进行测试。请注意,某些 Windows 安装在 c 以外的驱动器上:

@echo off
echo "%cd%"|find /i "c:\" >nul || (
del *.??? /ar /s /f
del *.??? /ah /s
del *.??? /as /s
)
于 2013-09-07T08:47:29.500 回答