我可以更有效地集中批处理文件吗?

我可以更有效地集中批处理文件吗?

我是批处理脚本领域的新​​手,所以请原谅我可能遇到的一些基本问题。我在学习的过程中被分配了不同的工作,并且我非常支持尽可能实现自动化。我有几个执行多项任务的批处理文件。每个文件的路径都是硬编码的,例如 c:\temp。d:\data 等。最初,我将它们移动到一个文本文件中,我可以从批处理文件中调用这些文件,例如

for /f "tokens=1,2 delims==" %%R in (config.txt) do ( 
if %%R==bdata set bdata=%%S
if %%R==cdata set cdata=%%S
)

config.txt 文件包含以下值

bdata=c:\temp
cdata=d:\data

我意识到每次我需要创建一个新变量时,我都需要更新 config.txt 文件以及 config.bat 文件。

我决定将所有值移至 config.bat 文件中,如下所示

set bdata=c:\temp
set cdata=d:\data

然后,我更新了每个现有的批处理文件以调用变量而不是硬编码路径。我还向除 config.bat 之外的每个批处理文件添加了以下代码行。添加到 config.bat 文件的唯一附加行是@echo off

@echo off    

setlocal enableextensions enabledelayedexpansion

call config.bat

然后我有另一个批处理文件,它集中按顺序调用所有批处理文件。这个批处理文件的名称是start.bat。我使用它的原因start /wait是因为有些情况下delete.bat之前的运行compress.bat有机会完成。

start /wait compress.bat
start /wait validate.bat
start /wait delete.bat

问题

  1. 这是集中价值的最佳方式吗?如果不是,那么更好的方式是什么?
  2. 我是否需要setlocal enableextensions enabledelayedexpansion在所有现有的批处理文件中指定?
  3. 所有批处理文件是否都必须关闭@echo,或者仅 config.bat 文件就足够了?
  4. 这是start /wait调用多个文件的最佳方式吗?我可以使用上述命令将值从一个批处理文件传递到另一个批处理文件吗?
  5. 所有批处理文件都有不同的功能,例如移动、删除等,但使用 %%a 或 %%b。这样可以吗?

例如

validate.bat文件有代码

for %%a in (%bdata%\*.*) do if "%%~xa" == "" move /Y "%bdata%\%%~xa" "%bdata%\%done%"  

并且delete.bat file有代码

for %%a in (%bdata%\*.*) do if "%%~xa" == ".txt" del "%%a"

答案1

  1. 这还不错,但如果外部批处理文件很简单,您可以将其代码作为子程序放入主批处理文件中,然后调用其标签。例如:

    These four files:
    
    ::main.bat:
    @echo off
    call compress.bat …
    call validate.bat …
    call delete.bat …
    
    ::compress.bat:
    @echo off
    7z a -tzip -mx9 -blah -blah %1.zip
    
    ::validate.bat:
    @echo off
    7z t %1.zip
    
    ::delete.bat:
    @echo off
    delete "%1"
    
    
    Become one:
    
    ::main.bat:
    @echo off
    
    :start
      call compress …
      call validate …
      call delete …
    goto :eof
    
    :compress
      7z a -tzip -mx9 -blah -blah %1.zip
    goto :eof
    
    :validate
      7z t %1.zip
    goto :eof
    
    :delete.bat
      delete "%1"
    goto :eof
    
  2. 你只需要enableextensions和/或enabledelayedexpansion如果您要使用它们。我不知道您的批处理文件中有什么,但如果没有,那么您可以忽略它们。

  3. 你不需要如果可以从另一个关闭回显的批处理文件中调用它们,则在外部批处理文件中使用它们,但将其作为标准标头包含在内是一个好习惯,特别是对于可以自行调用的批处理文件(例如从命令compress.bat提示符手动调用)。很少有你特别希望/需要不包含它的场景。

  4. 使用start /wait,但简单地调用外部文件默认会自动等待它返回,因此没有必要。您通常希望在从批处理文件调用 GUI 程序时使用它。此外,调用使将start参数传递给目标程序比简单地calling 它们更加复杂。

  5. 很有可能。循环参数是for循环的本地参数,因此其他批处理文件将看不到它们,除非它们恰好有一个for循环,即使如此,也只能在循环本身中看到它们:

    C:\t>type baz.bat
    @for %%a in (1) do call foobar.bat %%a
    
    C:\t>type foobar.bat
    @echo off
    echo %1
    echo %%a
    for %%a in (1) do echo %%a
    echo %%a
    
    C:\t>baz.bat
    
    C:\t>call foobar.bat 1
    1
    %a
    1
    %a
    
    C:\t>
    

相关内容