Пакетный файл пропускается для цикла - PullRequest
0 голосов
/ 09 мая 2018

UPDATE Я удалил токены = 4, и он начал выводить данные. Это не пропустить мимо петли. Я пропускал слишком далеко впереди с жетонами. Я все еще немного озадачен тем, почему он работает как одна партия, а не из этой партии, но теперь, по крайней мере, я знаю, в чем проблема. Спасибо всем, кто смотрел на это для меня.

Я пишу скрипт для копирования данных с одного компьютера на другой. Проблема в том, что он пропускает сообщение FOR LOOP, которое я звоню из другого абонента FOR LOOP. Если вы тестируете сценарий, ему требуется два компьютера и подключенный диск T: где-нибудь на втором компьютере. Я могу написать сценарий, чтобы он искал внешний диск, если он кому-то полезнее.

FOR /F "tokens=4 skip=1" %%a in ('REG QUERY "%_regshell%" /v "%_regdesktop%"') DO (
     SET _dt=%%a
     echo robocopy "!_dt!" "!_NetworkDrive!\!_fndesktop!" !_params!
     echo attrib -h -r "!_NetworkDrive!\!_fndesktop!"
    )

Если я сам напишу выше для цикла LOOP в пакете и просто выведу %% a, то это будет работать без проблем. В этом я вижу, что он действительно вызывает: _backup, но он пропускает непосредственно цикл FOR, и я не уверен, почему. Я писал подобные сценарии много раз, но никогда не имел сценариев, которые полностью игнорировали бы цикл FOR. Кто-нибудь может взглянуть и помочь? Спасибо.

@echo off
:: Set Variables
SET _driveID=T:
SET _params=/Z /E /COPY:DT /R:1 /W:0 /XD LocalService NetworkService temp "temporary internet files" winsxs Content.IE5 cache /XF ntuser.* *.tmp /XJ /FP /NC /NS /NP /NJH
SET _regshell=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
SET _regdesktop=Desktop

:: Set Current Directory
pushd %SystemDrive%\

:: Start Menu - Create Choices and Options.  Send to various places to perform the actions.
:_start
cls
ECHO   Please type either option 2 or 3 and then press ENTER on the keyboard?
Echo     2. TRANSFER FILES FROM DESKTOP TO LAPTOP
Echo     3. EXIT THE PROGRAM
echo.
set /p choice=Enter Number: 

if '%choice%'=='2' goto _desktopToLaptop
if '%choice%'=='3' goto :EOF
echo "%choice%" is not a valid option.  Please try again
echo.
goto _start

:: Detect Drive Letters
:_desktopToLaptop
setlocal EnableDelayedExpansion
FOR /F "usebackq skip=1" %%a IN (`WMIC logicaldisk where DeviceID^="%_driveID%" get caption`) DO (
    SET _NetworkDrive=%%a
    if exist %%a ( 
      CALL :_backup
      goto :EOF
    ) else (
      echo.
      echo The laptop does not appear to be attached to the computer.
      echo.
      pause
      goto :EOF
    )
)

:_backup
:: Detect the folder locations and begin to backup each location to the laptop.
FOR /F "tokens=4 skip=1" %%a in ('REG QUERY "%_regshell%" /v "%_regdesktop%"') DO (
 SET _dt=%%a
 echo robocopy "!_dt!" "!_NetworkDrive!\!_fndesktop!" !_params!
 echo attrib -h -r "!_NetworkDrive!\!_fndesktop!"
)
echo we are past the for loop
pause
:: Return to directory program was run from
popd

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Учитывая, что основной проблемой в вашем скрипте является установка переменной для данных в пределах определенного ключа и значения реестра, вы можете использовать:

Set "_regshell=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
Set "_regdesktop=Desktop"

Set "_dt="
For /F "EOL=H Tokens=2*" %%A In ('Reg Query "%_regshell%" /V "%_regdesktop%"'
) Do Set "_dt=%%~B"
If Not Defined _dt GoTo :EOF
Echo "%_dt%"
0 голосов
/ 09 мая 2018

Если кто-то еще столкнется с этой проблемой или чем-то подобным, проверьте свои токены и свой пропуск. Мой работал просто отлично, как одна партия, но когда я включил в качестве вызова, мне пришлось изменить параметры с токенов = 4 пропустить = 1 на токены = 3 * пропустить = 2, чтобы получить правильный вывод.

Правильные токены в этом поле FOR LOOPS должны быть:

@echo off
:: Set Variables
SET _driveID=T:
SET _params=/Z /E /COPY:DT /R:1 /W:0 /XD LocalService NetworkService temp "temporary internet files" winsxs Content.IE5 cache /XF ntuser.* *.tmp /XJ /FP /NC /NS /NP /NJH
SET _regshell=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
SET _regdesktop=Desktop

:: Set Current Directory
pushd %SystemDrive%\

:: Start Menu - Create Choices and Options.  Send to various places to perform the actions.
:_start
cls
ECHO   Please type either option 2 or 3 and then press ENTER on the keyboard?
Echo     2. TRANSFER FILES FROM DESKTOP TO LAPTOP
Echo     3. EXIT THE PROGRAM
echo.
set /p choice=Enter Number: 

if '%choice%'=='2' goto _desktopToLaptop
if '%choice%'=='3' goto :EOF
echo "%choice%" is not a valid option.  Please try again
echo.
goto _start

:: Detect Drive Letters
:_desktopToLaptop
setlocal EnableDelayedExpansion
FOR /F "usebackq skip=1" %%a IN (`WMIC logicaldisk where DeviceID^="%_driveID%" get caption`) DO (
    SET _NetworkDrive=%%a
    if exist %%a ( 
      CALL :_backup
      goto :EOF
    ) else (
      echo.
      echo The laptop does not appear to be attached to the computer.
      echo.
      pause
      goto :EOF
    )
)

:_backup
:: Detect the folder locations and begin to backup each location to the laptop.
FOR /F "tokens=3* skip=2" %%a in ('REG QUERY "%_regshell%" /v "%_regdesktop%"') DO (
 SET _dt=%%a
 echo robocopy "!_dt!" "!_NetworkDrive!\!_fndesktop!" !_params!
 echo attrib -h -r "!_NetworkDrive!\!_fndesktop!"
)
echo we are past the for loop
pause
:: Return to directory program was run from
popd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...