Оцените оценку, используя отложенное расширение, чтобы сделать значение переменной пригодным для использования в качестве переменной (из внешнего пакетного файла) - PullRequest
0 голосов
/ 27 февраля 2019

Когда я впервые начал пытаться построить это, чтобы сохранить внешний файл, содержащий переменные для IP-адресов, чтобы мне приходилось редактировать только один список, я чувствовал, что что-то не так делаю.Но тогда это сработало.Однако он также вывел The system cannot find the drive specified между «IP» и «Name». это прекратилось, когда я изменил :: на rem, (код обновлен)

Я намерен основывать на этом много автоматического развертывания и обслуживания,при обращении к серверам, например, pscp / plink (PuTTY), и при записи в файлы журнала, например, Deploying on [name] xxxx.Это надежный / подходящий способ написания этого кода?Мне это кажется странно чистым.

Могу ли я проверить: использует ли !xxx! отложенное расширение?Если это так, следует ли вам всегда заключать переменные в ! для отложенного расширения?(Я прочитал Пакетные файлы Windows: что такое расширение переменных и что означает EnableDelayedExpansion? , но мне не на 100% ясно, что именно это вызывает !.)

Как это называется?Использую ли я значение переменной в качестве имени переменной, и есть ли для этого компьютерная фраза?Это eval?

@echo off
setlocal EnableDelayedExpansion 

set ips[0]=192.168.0.1
set 192.168.0.1=router
set ips[1]=192.168.0.2
set 192.168.0.2=printer
set ips[2]=192.168.0.3
set 192.168.0.3=nas

for /F "tokens=2 delims==" %%a in ('set ips[') do (
    rem the next line outputs the IP as it is evaluating the dynamic 
    rem variable being temp created with the for loop
    echo IP is %%a
    rem with delayed expansion set (see top) we can use the value 
    rem of the IP that is being used with the for loop
    rem and further lookup by essentially evaluating again 
    echo Name of IP is !%%a!
)
pause

РЕЗУЛЬТАТ:

IP is 192.168.0.1
Name of IP is router
IP is 192.168.0.2
Name of IP is printer
IP is 192.168.0.3
Name of IP is nas
Press any key to continue . . .

Вставка массива IP во внешний файл

Итак, продолжая редактировать код (правки отражены выше), яТеперь попробуйте переместить массив IP во внешний файл и вызвать его, и он выдаст Environment variable ips[ not defined

demo.bat:

@echo off
setlocal EnableDelayedExpansion

call info_IPs.bat

for /F "tokens=2 delims==" %%a in ('set ips[') do (
    rem the next line outputs the IP as it is evaluating the dynamic 
    rem variable being temp created with the for loop
    echo IP is %%a
    rem with delayed expansion set (see top) we can use the value 
    rem of the IP that is being used with the for loop
    rem and further lookup by essentially evaluating again 
    echo Name of IP is !%%a!
)
pause

info_IPs.bat:

@echo off
setlocal EnableDelayedExpansion

set ips[0]=192.168.0.1
set 192.168.0.1=router
set ips[1]=192.168.0.2
set 192.168.0.2=printer
set ips[2]=192.168.0.3
set 192.168.0.3=nas
...