Пакетный файл - не может удалить переменную в подпрограмме - PullRequest
0 голосов
/ 17 сентября 2018

Я борюсь с командным файлом Windows, который будет запускаться на сервере SERVER через определенные промежутки времени и будет оценивать все компьютеры в сети, а затем извлекать новые и измененные файлы на резервное устройство NAS.Для такого подхода я решил использовать только 1 сценарий для поддержки 150 резервных копий на 150 компьютерах.

У меня проблема в том, что мне нужно извлечь имя компьютера, которое я храню в файле .txt как:

Имя: computername.domain.name на чистое имя компьютера:

computername.domain.name

Я сделал это, потянув .txtсодержимое файла в VARIABLE, затем я убираю первые 9 символов в подпрограмме SUB : SUBfound :

 setlocal enabledelayedexpansion
 for /L %%i in (0,1,255) do (call :SUBscan 192.168.79.%%i)

:SUBscan ip
 echo|set /p dummyOutput="Scanning %1 ... "
 ping -n 1 -w 200 -4 %1 >nul
 if %ERRORLEVEL% NEQ 0 (echo not a computer) else (
   if exist "\\%1\d$\DataFolder\" (call :SUBfound %1) else (call :SUBnotfound %1)
 )
 EXIT /B

:SUBfound
 set targetname=<backup_id.txt
 set "targetname=!targetname:~9!"
 ...other code
EXIT /B

Но имя цели в: SUBfound не оценивает:

 echo !targetname!  -->  echoes me:~9!
 echo %targetname%  -->  echoes !targetname!

Я знаю, что должно быть что-то не так с оценкой переменных SET в подпрограммах, но не могу понять это.

1 Ответ

0 голосов
/ 17 сентября 2018

MC ND диагностировал вашу проблему в своем комментарии.

Вы не можете прочитать файл с простым SET, вместо этого вы должны использовать SET /P.

set /p "targetname=" <backup_id.txt

Но есть другой способ, использующий FOR / F, который позволяет вам читать значение непосредственно за один шаг. Установите для DELIMS двоеточие и пробел, а для TOKENS - 2.

Если ваш файл имеет только одну строку, тогда

for /f "tokens=2 delims=: " %%A in (backup_id.txt) do set "targetname=%%A"

Если есть несколько строк, а значение находится в первой строке, тогда

set "targetname="
for /f "tokens=2 delims=: " %%A in (backup_id.txt) do if not defined targetname set "targetname=%%A"

или

for /f "tokens=2 delims=: " %%A in (backup_id.txt) do set "targetname=%%A" & goto skip
:skip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...