Понимание пакета для циклов с входом (% variable1%,% variable2% ...) - PullRequest
0 голосов
/ 01 января 2019

У меня есть несколько инструментов, которые я пытаюсь пакетировать на внутреннем сервере MDT.Одним из таких инструментов является DISM / ImageX.То, что я пытаюсь автоматизировать, - это сценарий, который проверяет папки, чтобы DISM мог извлекать отдельные файлы WIM, а затем я мог бы использовать другую утилиту для проскальзывания обновлений.

Не в WSUS.Ни SCCM.Я знаю, что это можно сделать с ними, но я стараюсь, чтобы время развертывания было как можно ближе к 15-20 минутам для самой последней версии данной ОС.

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

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

Возможно, кто-то сможетПосмотрите, что я пытаюсь сделать здесь с моим пакетным файлом, скажите, что я не так делаю?

Я давно это написал, но хочу сжать этот код до = <1цикл for. </p>

setlocal
set EnabledDelayedExpansion
set _d=\\cp
set 3d_=G:\DISM
set 3d7a=%3d_%\7
set 3d7b=%3d_%\7\7.1
set 3d7c=%3d_%\7\7.2
set 3d7d=%3d_%\7\7.3
set 3d7e=%3d_%\7\7.4
set 3d8a=%3d_%\8
set 3d8b=%3d_%\8\8.1
set 3d8c=%3d_%\8\8.2
set 3d8d=%3d_%\8\8.3
set 3d8e=%3d_%\8\8.4
set 3dxa=%3d_%\10
set 3dxb=%3d_%\10\10.1
set 3dxc=%3d_%\10\10.2
set 3dxd=%3d_%\10\10.3
set 3dxe=%3d_%\10\10.4
goto :3d7f

:3d7f
for /f "tokens=5 delims= " %%a in ('%3d7a% %3d7b% %3d7c% %3d7d% %3d7e%') do 
(
if not exist %%a (
mkdir %%a)
goto :3d8f

:3d8f
for /f "tokens=5 delims= " %%a in ('%3d8a% %3d8b% %3d8c% %3d8d% %3d8e%') do 
(
if not exist %%a (
mkdir %%a)
goto :3dxf

:3dxf
for /f "tokens=5 delims= " %%a in ('%3dxa% %3dxb% %3dxc% %3dxd% %3dxe%') do 
(
if not exist %%a (
mkdir %%a)
goto :exit
)

Нужно создать каталоги, перечисленные в наборе переменных вверху, используя итеративный цикл for, который проверяет, есть ли каталоги, а если нет, то создает их.

Каждая ступенька переменной локализует нужный целевой каталог в другом глобальном пакетном файле, который я использую, чтобы в конечном итоге распространить на другие серверы MDT, над этим разделом я сейчас работаю.

  • Отредактированы ошибки, отмеченныеSquashman @ 5: 34EST 01.01.199 (Спасибо, чувак)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вам не нужно устанавливать так много переменных (точнее ни одной).
Как уже прокомментировал Squashman, &&a должно быть %%a,
, вам не хватает закрывающих скобок и
нет необходимости проверять папку на наличие (просто перенаправьте сообщение об ошибке в NUL).
Также ваши циклы for неверны.Вы не хотите использовать только пятый токен и не хотите выполнять список переменных ('the single quotes' делает это).

Вам нужны только простые циклы for.Следующий код имеет тот же результат, но он намного проще и короче:

for %%a in (7 8 10) do (
  for /l %%b in (1,1,4) do (
    ECHO Debug: md "G:\DISM\%%a\%%a.%%b"
    md "G:\DISM\%%a\%%a.%%b" >nul
  )
)

Вместо for /l вы также можете сделать for %%b in (1 2 3 4) do (

0 голосов
/ 01 января 2019

Похоже, вы пытаетесь построить структуру, такую ​​как IP-адреса или аналогичные.Трудно сказать со странным именованием переменных.В любом случае, это должно дать вам представление о том, как это сделать.Это создает папки и подпапки от «0 \ 0 \ 0» до «255 \ 255 \ 255».

 setlocal enableDelayedExpansion
 for /L %%a in (0,1,255) do (
    set a=%%a
    for /L %%b in (0,1,255) do (
        set b=%%b
        for /L %%c in (0,1,255) do (
            set c=%%c
            echo.!a!\!b!\!c!
            mkdir !a!\!b!\!c! >nul 2>&1
        )
    )
 )

Если ваша цель использует некую форму согласованной структуры, то вы сможете использовать ее в качестве основы для достижения цели.

...