Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理脚本中的命令不工作_Batch File_Cmd - Fatal编程技术网

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