0

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

不进入 WSUS。也不是 SCCM。我知道可以使用它们来完成,但我希望将我的部署时间保持在每个给定操作系统的最新版本接近 15-20 分钟。

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

我从来没有真正接触过批处理脚本,但是嘿,它似乎几乎可以完成我能想到的所有技巧,而且我一直在寻找优化我的代码的方法。

也许有人可以看到我在这里尝试用我的批处理文件做什么,告诉我我做错了什么?

我已经写了很长的路,但我想用 =< 1 for 循环压缩这段代码。

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 1/1/19 指出的错误(谢谢老兄)
4

2 回答 2

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
        )
    )
 )

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

于 2019-01-01T19:51:26.843 回答
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 (

于 2019-01-01T21:06:46.223 回答