Захватить и разделить содержимое файла и использовать его как переменную в пакетном скрипте - PullRequest
0 голосов
/ 29 февраля 2020


Я пытаюсь получить список серверов из файла, а также диск root.
Это содержимое файла:

serverlist.config

WKS_LIST                           install  WKS1 WKS2 \
                                            WKS3 WKS4 WKS5 \
                                            WKS6

WKS_ROOT_PATHS                       install    C:\temp D:\temp \
                                                C:\temp C:\temp C:\temp \
                                                C:\temp


SERVER_LIST                       install   NODE0 NODE1 \
                                            APP1 APP2 APP3 \
                                            APP4 APP5 APP6 \
                                            APP7

SERVER_ROOT_PATHS              install          I:\temp E:\temp I:\temp \
                                            I:\temp I:\temp I:\temp \
                                            I:\temp I:\temp I:\temp \
                                            I:\temp

TEST_LIST                       install     TEST1 TEST2

TEST_ROOT_PATHS                 install     I:\temp I:\temp

Я хочу, чтобы пакетный скрипт просматривал serverlist.config и получал переменную например:

set serverlist=NODE0 NODE1 APP1 APP2 APP3 APP4 APP5 APP6 APP7
set rootpath=I E I I I I I I I I

FOR %%a in (%serverlist%) do robocopy \\%%a\%rootpath%$\temp\log I:\temp\TEST-LOG\%%a *mask1* *mask2* /S /copyall /maxage:20200227 /xd *mask3* >> I:\temp\output.log

Не могли бы вы предоставить помощь о том, как получить и разделить файл serverlist.config, чтобы получить их в переменную, как указано выше в пакетном скрипте?
Пожалуйста, дайте мне знать, если вам что-нибудь понадобится.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Это чрезвычайно негибко, но работает:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set config=serverlist.config

:a
set x=2
set y=2
for /f "tokens=1*" %%x in (%config%) do (
if "%%x" equ "SERVER_LIST" set x=0
if "%%x" equ "SERVER_ROOT_PATHS" (set x=1 & set y=0)
if "%%x" equ "TEST_LIST" goto :b
if !x! equ 0 echo %%x %%y>>serverlist.txt 
if !y! equ 0 echo %%x %%y>>rootpath.txt
)

:b
for /f "delims=\" %%x in (serverlist.txt) do set "SERVER_LIST=!SERVER_LIST!%%x"
for /f "tokens=3*" %%x in ("%SERVER_LIST%") do set "serverlist=%%x %%y"

:c
for /f "tokens=*" %%x in (rootpath.txt) do (
set "paths=%%x"
for %%a in (: \ temp) do set "paths=!paths:%%a=!"
set "ROOT_PATH=!ROOT_PATH!!paths!"
)
for /f "tokens=3*" %%x in ("%ROOT_PATH%") do set "rootpath=%%x %%y"

:d
del serverlist.txt
del rootpath.txt
FOR %%a in (%serverlist%) do robocopy \\%%a\%rootpath%$\temp\log I:\temp\TEST-LOG\%%a *mask1* *mask2* /S /copyall /maxage:20200227 /xd *mask3* >> I:\temp\output.log
ENDLOCAL

По сути, оно захватывает содержимое между:

  1. SERVER_LIST и SERVER_ROOT_PATHS
  2. SERVER_ROOT_PATHS и TEST_LIST
0 голосов
/ 29 февраля 2020
@echo off
setlocal enabledelayedexpansion

set "server_list=serverlist.config"

rem Set variables with leading underscores from the server list i.e. _SERVER_LIST=...
set "continuation="

for /f "tokens=*" %%A in (!server_list!) do @(
    set "line=%%~A"

    if "!line:~-1!" == "\" (
        set "continuation=y"
        if defined last_line (
            set "line=!last_line! !line:~,-1!"
        ) else (
            set "line=!line:~,-1!"
        )
    ) else if defined continuation (
        set "continuation="
        set "line=!last_line! !line!"
        for /f "tokens=1,2,* delims= " %%B in ("!line!") do set "_%%~B=%%~D"
        set "line="
    ) else (
        for /f "tokens=1,2,* delims= " %%B in ("!line!") do set "_%%~B=%%~D"
        set "line="
    )

    set "last_line=!line!"
)

rem Set _SERVER_ROOT_DRIVES from _SERVER_ROOT_PATHS
set "_SERVER_ROOT_DRIVES="

for %%A in (!_SERVER_ROOT_PATHS!) do (
    set "drive=%%~dA"

    if defined drive (
        set "drive=!drive:~,1!"
        if defined _SERVER_ROOT_DRIVES (
            set "_SERVER_ROOT_DRIVES=!_SERVER_ROOT_DRIVES! !drive!"
        ) else (
            set "_SERVER_ROOT_DRIVES=!drive!"
        )
    )
)

rem Run robocopy (Remove echo and carets if looks OK to actually run robocopy)
for %%A in (%_SERVER_LIST%) do (
    echo robocopy \\%%A\!_SERVER_ROOT_DRIVES!$\temp\log I:\temp\TEST-LOG\%%A *mask1* *mask2* /S /copyall /maxage:20200227 /xd *mask3* ^>^> I:\temp\output.log
)

Вывод echo команды robocopy совпадает с выводом кода в вопросе.

Код будет считывать список серверов и будет использовать такие ключевые слова, как SERVER_LIST, и будет добавить начальное подчеркивание для использования в качестве имен переменных. Значения set для имен переменных будут значениями в той же строке и будут включать значения в следующей строке, если обнаружен символ продолжения конца строки \.

Буквы дисков извлекаются из _SERVER_ROOT_PATHS и установлены в новую переменную с именем _SERVER_ROOT_DRIVES.

Команда robocopy будет отображена на консоли для просмотра, чтобы проверить, в порядке ли.

Может использовать set _ для просмотра ведущие подчеркнутые имена переменных и значения в скрипте для необходимости отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...