批处理脚本子例程:传递参数

Posted

技术标签:

【中文标题】批处理脚本子例程:传递参数【英文标题】:batch script subroutine: Passing arguments 【发布时间】:2013-10-01 02:42:30 【问题描述】:

我的理解是,为了从作为参数传递给子例程的文件中获取日期,您必须将该参数重新设置为子例程中的变量。它是否正确?这对我来说并没有,所以我想知道我是否不完全理解发生了什么。除了日期提取之外,我几乎可以在任何其他子例程代码中使用传入的参数。

set setupEXE=setup.exe

CALL :SUB_CheckCorrectDate %setupEXE%
GOTO EOF
::----------------------------------

:SUB_CheckCorrectDate
set filename=%1%

:: SUCCESSFUL
for %%x in (%filename%) do set FileDate=%%~tx
@For /F "tokens=1-3 delims=-/ " %%A in ('@echo %FileDate%') do @( 
Set file_Month=%%A
Set file_Day=%%B
Set file_Year=%%C
)

:: GET ERROR    
for %%x in (%1%) do set FileDate=%%~tx
@For /F "tokens=1-3 delims=-/ " %%A in ('@echo %FileDate%') do @( 
Set file_Month=%%A
Set file_Day=%%B
Set file_Year=%%C
)    

GOTO:EOF

:: ------------------
:EOF

【问题讨论】:

【参考方案1】:

使用%1 访问参数,而不是%i%

参数变量与 FOR 变量具有相同的修饰符,因此您可以使用%~t1

无需在 FOR /F 中执行命令。使用in ("string") 处理字符串文字更简单。

不需要:EOF 标签。每个脚本都有一个隐含的:eof。我喜欢改用exit /b

@echo off
setlocal
set "setupEXE=setup.exe"

call :SUB_CheckCorrectDate "%setupEXE%"
exit /b

::----------------------------------

:SUB_CheckCorrectDate
set "filename=%~1"
for /F "tokens=1-3 delims=-/ " %%A in ("%~t1") do ( 
  set "file_Month=%%A"
  set "file_Day=%%B"
  set "file_Year=%%C"
)
exit /b

【讨论】:

您添加了setlocal。是否不需要endlocal,是否可以通过exit 命令隐式完成? @Wolf - 是的,对于在该例程中实例化但尚未结束的任何剩余 SETLOCAL 的脚本或 Called 子例程,总是有一个隐式的 ENDLOCAL。即使例程或脚本由于到达文件末尾而结束,即使没有明确的 EXIT /B,也会发生这种情况。 谢谢,很高兴知道。在页面setlocal | Microsoft Docs 上,他们错过了添加exit 选项。这是一个新功能吗?而且,更重要的是,本地环境是否正确堆叠在一起? @Wolf - 是的,它们正确堆叠,并且自引入 SETLOCAL 以来行为一直是一致的。而且 Microsoft batch/cmd.exe 文档通常都是废话 - 缺少大量信息,有时甚至完全是错误的。【参考方案2】:

如果你真的想写批处理脚本,你应该注意语法:

@echo off &setlocal
set "setupEXE=setup.exe"

CALL :SUB_CheckCorrectDate "%setupEXE%"
GOTO EOF
::----------------------------------

:SUB_CheckCorrectDate
set "filename=%~1"

:: SUCCESSFUL
for %%x in ("%filename%") do set "FileDate=%%~tx"
For /F "tokens=1-3 delims=-/ " %%A in ("%FileDate%") do ( 
    Set "file_Month=%%A"
    Set "file_Day=%%B"
    Set "file_Year=%%C"
)

:: GET ERROR    
for %%x in ("%~1") do set "FileDate=%%~tx"
For /F "tokens=1-3 delims=-/ " %%A in ("%FileDate%") do ( 
    Set "file_Month=%%A"
    Set "file_Day=%%B"
    Set "file_Year=%%C"
)    

GOTO:EOF

:: ------------------
:

【讨论】:

...也许还要注意通过exit /b从子例程返回的正确方法 @Endoro "如果你真的想写批处理脚本,你应该......"使用Rem而不是像@987654324这样的姑息疗法@ 等。由于这个糟糕的指导序言而投反对票。

以上是关于批处理脚本子例程:传递参数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 unix shell 调用带有参数的子例程

进入由 shell 脚本设置的 perl 程序环境变量

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数

将两个或多个数组传递给 Perl 子例程

在 FORTRAN 子例程中传递不同的变量集

在Abaqus中运行连续作业时,仅编译一次用户子例程