批处理脚本中的命令不起作用

时间:2014-12-22 10:42:58

标签: 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\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

我不明白为什么它不起作用,我错过了什么?

2 个答案:

答案 0 :(得分:2)

我有一些改进建议。

  1. %~dp0是包含正在运行的脚本的目录的驱动器和路径。我很困惑你为什么试图mkdir %~dp0当该目录不可能存在时。您是否尝试创建与脚本同名的目录?如果是,请尝试使用md %~dpn0set "logger=%~dpn0\%~n0.log"

  2. 为什么不让WMI提供列表,而不是在for循环中提供驱动器号的静态列表? wmic logicaldisk where "DriveType=3"会为您提供系统中不可移动的非网络驱动器的列表。

  3. 你为什么要做cd %windir%\system32?通过从脚本的运行目录更改到您还没有的目录,您获得了什么样的能力?我认为你不需要它。

  4. 您知道当chkdsk c:时出现错误,说明在安装时无法检查音量?我建议先添加chkdsk /x来卸载驱动器。对于C:驱动器,您可能会得到“Chkdsk无法运行,因为该卷正在被另一个进程使用。您是否要在下次系统重新启动时安排检查此卷?(Y / N)”。您可以通过管道和Y提前提供echo Y| chkdsk /x %drive%

  5. 所以这就是我的建议:

    @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:"