批处理错误:|此时并未预料到

时间:2016-10-25 17:26:35

标签: windows batch-file command-line cmd

我检查了几乎所有关于这个问题的其他问题,我已经尝试了所有这些但仍然没有成功,有人可以告诉我我做错了什么我得到错误“|此时没有预料到”运行时

@echo off
Setlocal EnableDelayedExpansion

set LOGFILE=pathBackup.csv
FOR /F "delims=" %%i IN ('time /t') DO set vtime2=%%i

IF NOT EXIST Logs mkdir Logs
echo DATE,TIME,HOSTNAME,CONNECTION,PATH > Logs\%LOGFILE%

FOR /F %%i in (clientList.txt) DO (

    set _tempus=%%i
    sc \\!_tempus! start remoteregistry > NUL
    set RegCommand=reg query "\\!_tempus!\HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

    FOR /f "tokens=1,2* delims= " %%a in ('%RegCommand% ^| find "REG_"') do set vPath=%%c
    echo %date%,%vtime2%,!_tempus!,Successful,%vPath% >> Logs\%LOGFILE%
    sc \\!_tempus! stop remoteregistry > NUL
)

echo.
echo clientList.txt reading complete.
echo :::::::::::::::::::::::::::::::::
echo.
pause

clientList.txt只包含我想要连接的远程计算机的主机名/ IP地址。

LABORATORY1-PC
BRANCH3
UnknownnamePC
192.168.0.3

2 个答案:

答案 0 :(得分:1)

嗯,这就是我不使用延迟扩展的方式。

@echo off

set regpath=HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set regval=/v Path
set logfile=pathlog.txt

FOR /F "delims=" %%G in (clientList.txt) DO (
    sc \\%%G start remoteregistry > NUL
    FOR /f "tokens=1,2* delims= " %%H in ('reg query "\\%%G\%regpath%" %regval% ^| find "REG_"') do (
        echo %date%,%time%,%%G,Successful,%%J >>logs\%LOGFILE%
    )
    sc \\%%G stop remoteregistry > NUL
)

答案 1 :(得分:1)

原样,代码中唯一的问题是RegCommand变量的扩展。当它在for /f %%i循环内被更改和重新引导时,您需要延迟扩展以检索其值。因为它没有被使用,解析器会替换没有任何内容的变量(进入循环之前变量中的值),因此for命令中的命令直接从管道开始。

%RegCommand%更改为!RegCommand!(扩展调用批处理中的变量)或更改为%%RegCommand%%(以扩展spawn cmd实例中的变量)应解决问题

但是不必处理它会好得多。 Squashman answer中的代码显示了对其进行编码的正确方法,而不需要通过直接使用for可替换参数来延迟扩展。