我制作了以下剧本:
SET localfolder="%~dp0"
mkdir %localfolder%
SET logger="%~dp0"\%~n0.log
echo %date% %time% logger=%logger% >> %logger%
set "list=a b c"
set disk=""
FOR %%i IN (%list%) DO (
SET disk=%%i: & call :chk
)
:chk
cd C:\windows\system32
%disk% >> %logger%
chkdsk %disk% >> %logger%
运行此脚本文件会产生以下输出:
22.12.2014 11:38:36,82 logger =“W:\ Scripts \”\ chkdsk_all.log
W:\ Scripts>(SET disk = b:& call:chk)
W:\ Scripts> cd C:\ windows \ system32
W:\ Scripts> b:1>>“W:\ Scripts \”\ chkdsk_all.log
W:\ Scripts> chkdsk b:1>>“W:\ Scripts \”\ chkdsk_all.log
W:\ Scripts>(SET disk = c:& call:chk)
W:\ Scripts> cd C:\ windows \ system32
W:\ Scripts> c:1>>“W:\ Scripts \”\ chkdsk_all.log
W:\ Scripts> chkdsk c:1>>“W:\ Scripts \”\ chkdsk_all.log
我不明白为什么它不起作用,我错过了什么?
答案 0 :(得分:2)
我有一些改进建议。
%~dp0
是包含正在运行的脚本的目录的驱动器和路径。我很困惑你为什么试图mkdir %~dp0
当该目录不可能存在时。您是否尝试创建与脚本同名的目录?如果是,请尝试使用md %~dpn0
和set "logger=%~dpn0\%~n0.log"
。
为什么不让WMI提供列表,而不是在for
循环中提供驱动器号的静态列表? wmic logicaldisk where "DriveType=3"
会为您提供系统中不可移动的非网络驱动器的列表。
你为什么要做cd %windir%\system32
?通过从脚本的运行目录更改到您还没有的目录,您获得了什么样的能力?我认为你不需要它。
您知道当chkdsk c:
时出现错误,说明在安装时无法检查音量?我建议先添加chkdsk /x
来卸载驱动器。对于C:
驱动器,您可能会得到“Chkdsk无法运行,因为该卷正在被另一个进程使用。您是否要在下次系统重新启动时安排检查此卷?(Y / N)”。您可以通过管道和Y
提前提供echo Y| chkdsk /x %drive%
。
所以这就是我的建议:
@echo off
setlocal
set "logfile=%~n0.log"
for /f "tokens=2 delims==:" %%I in ('wmic logicaldisk where "DriveType=3" get DeviceID /format:list ^| find "="') do (
>>"%logfile%" (
echo Checking "%%I:"
echo y| chkdsk /x %%I:
)
)
答案 1 :(得分:0)
在我改变" cd C:"到" cd / D C:"