【问题标题】:Batch file: START "" /W CMD /C doesn't seem to work inside a foor loop批处理文件: START "" /W CMD /C 在 for 循环中似乎不起作用
【发布时间】:2013-11-29 13:49:40
【问题描述】:

我有一个批处理文件,它的内容是:

SETLOCAL enabledelayedexpansion
SET /A FT=500
FOR /F "skip=1 tokens=1-6" %%A IN ('START "" /wait WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year
/Format:table ') DO (
 IF NOT !FT!==500 GOTO proceed
 SET  FD=%%F-%%D-%%A
 SET  FT=%%B:%%C:%%E
:proceed
 SET /A FX="DS"
)
echo %FD% %FT% : %* >> "%LOGFILE%"

endlocal

最初是一行

FOR /F "skip=1 tokens=1-6" %%A IN ('START "" /wait WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year
    /Format:table ')

曾经

FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year
    /Format:table ')

但是由于在批处理中运行 WMIC 命令导致进程挂起,因此我想在新的 CMD 窗口上运行 WMIC 命令,这似乎解决了挂起问题,但现在运行 WMIC 命令的子窗口的内容不传递给父窗口。 (即)日志文件的输出只是“500”(FT 的值),而不是在 For 循环中更改的 FT 的值,由于某种原因,它只是跳过了 for 循环。

任何想法或建议为什么会发生这种情况?

我将非常感谢任何建议。

非常感谢。

【问题讨论】:

    标签: batch-file for-loop cmd wmic


    【解决方案1】:
    @ECHO OFF &SETLOCAL
    SET /A FT=500
    FOR /F "delims=" %%x IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,SEcond^,Year /Format:table ^|find "20"') DO (
        for /f "tokens=1-6" %%A in ("%%~x") do (
            IF NOT %FT%==500 GOTO proceed
            SET "FD=%%F-%%D-%%A"
            SET "FT=%%B:%%C:%%E"
            :proceed
            SET /A FX="DS"
        )
    )
    echo %FD% %FT% : %* 
    
    endlocal
    

    您也可以使用Tempfile

    @ECHO OFF &SETLOCAL
    set "Tempfile=%TEMP%\%random%.~"
    WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,SEcond,Year|find "20">"%Tempfile%"
    SET /A FT=500
    for /f "usebackqtokens=1-6" %%A in ("%Tempfile%") do (
        IF NOT %FT%==500 GOTO proceed
        SET "FD=%%F-%%D-%%A"
        SET "FT=%%B:%%C:%%E"
        :proceed
        SET /A FX="DS"
    )
    del "%Tempfile%"
    echo %FD% %FT% : %* 
    

    Tempfile 的 Hexdump:

    0000000: 32 39 20 20 20 31 37 20 20 20 20 30 20 20 20 20 29 17 0 0000010: 20 20 20 31 31 20 20 20 20 20 33 39 20 20 20 20 11 39 0000020: 20 20 32 30 31 33 20 20 0d 0d 0a 2013 ...

    输出:

    2013-11-29 15:52:59:

    【讨论】:

    • 您的解决方案不包含 START "",我想要一个带有 START 的解决方案,因为如果不使用 START "",它似乎会挂起。不过感谢您的回复。
    • 是的,我明白这一点,但我目前正在使用的系统上的 WMIC 似乎存在一些问题。即使我的旧代码没有开始和代码更改似乎也可以正常工作并且它已经工作了很长时间,只是我目前的系统无法正常工作。
    • @spaniard89 我和这里的其他人无法修复您的计算机。如果它工作正常,请回来。
    • 我理解你的沮丧。我更沮丧,ss64.com/nt/wmic.html 在注释部分,你会发现它为什么在 WMIC 时挂起。
    • @spaniard89 我知道这个问题很久了。我用第二个for 循环删除了额外的cr 命令。
    【解决方案2】:

    /b 添加到启动命令中,将在与父级相同的窗口中运行它。
    所以你可以捕获输出。

    FOR /F "skip=1 tokens=1-6" %%A IN ('START "" /B /wait WMIC ...
    

    但它也应该在没有START 的情况下运行,你的系统似乎坏了。

    【讨论】:

    • 非常感谢您的解决方案伙伴。但是,如果我在同一个窗口上运行 WMIC 命令,它似乎会挂起。不使用/B还有其他方法吗?就像以某种方式将值从一个窗口传递到另一个窗口。
    • 我建议先修复您的系统。否则我只能看到将输出重定向到文件的解决方案,因为两个窗口或多或少是独立的
    【解决方案3】:

    将 FOR 行更改为:

    FOR /F "usebackq skip=1 tokens=1-6" %%A IN (`START "" /wait WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year
    

    /Format:table `) DO (

    请注意,我添加了 usebackq,然后将 2 个单引号更改为反引号...最好复制粘贴 :) 见 FOR /?

    【讨论】:

    • 这似乎不起作用。我仍然在日志中得到 500 的值,而不是日历时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多