了解in(%variable1%,%variable2%...)的批处理循环

时间:2019-01-01 17:16:56

标签: loops batch-file for-loop dism

我有一些工具正在尝试在MDT服务器的后端上批处理脚本。这些工具之一是DISM / ImageX。我正在尝试自动化的是一个脚本,该脚本检查文件夹,以便DISM可以提取单个WIM文件,然后可以使用另一个实用程序进行补充更新。

不加入WSUS。也没有SCCM。我知道可以用它们完成此操作,但我希望将给定OS的最新版本的部署时间保持在15-20分钟之间。

我有很多后端工具可以正常工作,但是在将批处理文件的这一部分压缩下来时遇到了问题,因此它使用for循环来检查目录,而不是重复相同的代码来重复结束。

我从来没有真正涉足过批处理脚本,但是,嘿,它似乎发挥了我能想到的几乎所有技巧,并且我一直在寻找优化代码的方法。

也许有人也许可以在我的批处理文件中看到我要在这里做什么,告诉我我出了什么问题?

我已经写了很长一段路,但是我想用= <1 for loop压缩这段代码。

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
)

试图创建在set变量顶部列出的目录,使用迭代的for循环检查目录是否存在,然后创建目录。

每个变量逐步将正确的目标目录本地化到另一个我最终用于分发到其他MDT服务器的全局批处理文件中,这是我现在正在研究的部分。

  • 编辑了Squashman @ 19:1/1/19(感谢伙计)记录的错误

2 个答案:

答案 0 :(得分:0)

您似乎正在尝试构建类似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
        )
    )
 )

如果您的目标使用某种形式的一致结构,那么您应该可以以此为基础来完成它。

答案 1 :(得分:0)

您不需要设置太多变量(准确地说,完全没有设置)。
正如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 (