Batch file 批处理脚本中的命令不工作
我制作了以下脚本:Batch file 批处理脚本中的命令不工作,batch-file,cmd,Batch File,Cmd,我制作了以下脚本: 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\sys
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>(设置磁盘=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>(设置磁盘=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
我不明白为什么它不起作用,我缺少什么?我有一些改进建议
%~dp0
是包含运行脚本的目录的驱动器和路径。当目录不可能不存在时,我对您为什么要尝试mkdir%~dp0
感到困惑。您正在尝试创建与脚本同名的目录吗?如果是这样,请尝试改为md%~dpn0
,并set“logger=%~dpn0\%~n0.log”
for
循环中提供驱动器号的静态列表,为什么不要求WMI提供该列表<代码>wmic logicaldisk,其中“DriveType=3”将为您提供系统中不可移动、非网络驱动器的列表cd%windir%\system32
?通过更改到脚本运行目录中尚未具有的目录,您可以获得什么能力?我认为你不需要它chkdsk c:
安装卷时,会出现一个错误,说明无法检查卷吗?我建议先添加chkdsk/x
卸载驱动器。对于C:
驱动器,您可能会得到“Chkdsk无法运行,因为该卷正被另一个进程使用。是否计划在下次系统重新启动时检查该卷?(Y/N)”。您可以通过管道和echo Y | chkdsk/x%drive%提前提供Y
@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:
)
)
在我将“cd C:”更改为“cd/D C:”之后,它就可以工作了。我希望对列出的每个卷执行chkdsk。“cd”似乎没有被执行,chkdsk也没有。您可以看到
echo
ed命令中有一些奇怪的东西。应该是SET logger=“%~dp0%~n0.log”
(省略反斜杠并移动关闭”
quote)而不是%disk%>>%logger%
尝试echo%disk%>>%logger%
而是cd C:\windows\system32
尝试cd/D C:\windows\system32
或更好的pushd C:\windows\system32
并将相应的popd
放在适当的位置。您发现了问题,JosefZ:)在我换了cd之后它就可以工作了C:到cd/D C:。如果您将其添加为答案,我会将其标记为解决方案“'wmic'不被识别为内部或外部命令、可操作程序或批处理文件。“如果我不输入windows/system32,即使是从cmd行输入,chkdsk命令对我也不起作用。至于chkdsk C:,我没有收到任何这样的错误或提示。。。从cmd
控制台,输入where wmic.exe
和where chkdsk.exe
wmic.exe
应位于c:\windows\system32\wbem
中,chkdsk.exe
应位于c:\windows\system32
中。现在输入路径。您是否在%PATH%
中看到这两个目录?如果没有,并且由于某种原因不适合添加它们,您可以根据需要调用%windir%\system32\wbem\wmic
和%windir%\system32\chkdsk
。您的%PATH%
中不存在这些路径是不寻常的。我在路径中添加了%windir%\system32\wbem\wmic和%windir%\system32\chkdsk,但wmic仍然无法工作。不过Chkdsk现在工作得更好了:p