我是批处理脚本领域的新手,所以请原谅我可能遇到的一些基本问题。我在学习的过程中被分配了不同的工作,并且我非常支持尽可能实现自动化。我有几个执行多项任务的批处理文件。每个文件的路径都是硬编码的,例如 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
问题
- 这是集中价值的最佳方式吗?如果不是,那么更好的方式是什么?
- 我是否需要
setlocal enableextensions enabledelayedexpansion
在所有现有的批处理文件中指定? - 所有批处理文件是否都必须关闭@echo,或者仅 config.bat 文件就足够了?
- 这是
start /wait
调用多个文件的最佳方式吗?我可以使用上述命令将值从一个批处理文件传递到另一个批处理文件吗? - 所有批处理文件都有不同的功能,例如移动、删除等,但使用 %%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
这还不错,但如果外部批处理文件很简单,您可以将其代码作为子程序放入主批处理文件中,然后调用其标签。例如:
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
你只需要
enableextensions
和/或enabledelayedexpansion
如果您要使用它们。我不知道您的批处理文件中有什么,但如果没有,那么您可以忽略它们。你不需要有如果可以从另一个关闭回显的批处理文件中调用它们,则在外部批处理文件中使用它们,但将其作为标准标头包含在内是一个好习惯,特别是对于可以自行调用的批处理文件(例如从命令
compress.bat
提示符手动调用)。很少有你特别希望/需要不包含它的场景。你能使用
start /wait
,但简单地调用外部文件默认会自动等待它返回,因此没有必要。您通常希望在从批处理文件调用 GUI 程序时使用它。此外,调用使将start
参数传递给目标程序比简单地call
ing 它们更加复杂。很有可能。循环参数是
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>