Batch file: START “” /W CMD /C doesn't seem to work inside a foor loop

放肆的年华 提交于 2019-12-14 03:36:33

问题


I have a batch file and it's content is:

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

Initially the line

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

was

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

but as running the WMIC command within the batch caused the process to hang therefore I thought of running WMIC command on a new CMD windows and that seems to solve the hang issue, but now the content of the child windows running the WMIC command is not passed to the parent window. (i.e) The output to the log file is just "500" (Value of FT) and not the value of FT that is changed inside in the For loop, due to some reason it just skips the for loop.

Any idea or suggestion why this occurs?

I will really appreciate any suggestion.

Thanks a ton in advance.


回答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

You can also use a 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% : %* 

Hexdump of the Tempfile:

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  ...

Output:

2013-11-29 15:52:59 :



回答2:


Adding the /b to the start command, will run it in the same window like the parent.
So you can capture the output.

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

But it should also run without the START, your system seems to be broken.




回答3:


Change the FOR line to this:

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 (

Note that I added usebackq and then changes 2 single quotes to back quotes... best to copy paste :) See FOR /?



来源:https://stackoverflow.com/questions/20287297/batch-file-start-w-cmd-c-doesnt-seem-to-work-inside-a-foor-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!