Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理脚本子例程:传递参数_Batch File_Arguments_Argument Passing_Subroutine - Fatal编程技术网

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

Batch file 批处理脚本子例程:传递参数,batch-file,arguments,argument-passing,subroutine,Batch File,Arguments,Argument Passing,Subroutine,我的理解是,为了从作为参数传递到子例程的文件中获取日期,必须将该参数重新设置为子例程中的变量。这是正确的吗?这对我来说并不重要,所以我想知道我是否还没有完全理解到底发生了什么。除了日期提取之外,我几乎可以在任何其他子例程代码中使用传入的参数 set setupEXE=setup.exe CALL :SUB_CheckCorrectDate %setupEXE% GOTO EOF ::---------------------------------- :SUB_CheckCorrectDat

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

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
访问参数,而不是
%i%

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

无需在FOR/F中执行命令。使用(“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

如果您真的想编写批处理脚本,则应注意语法:

@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
@endro从子程序返回的正确方式“如果你真的想编写批处理脚本,你应该…”使用
Rem
而不是像
等姑息疗法。由于这个糟糕的指导序言,你投了反对票。你添加了
setlocal
。是否不需要
endlocal
,是否可以通过
exit
命令隐式执行?@Wolf-是的,对于在该例程中实例化但尚未结束的任何剩余SETLOCAL,脚本或调用的子例程的末尾始终有一个隐式endlocal。如果例程或脚本由于到达文件末尾而结束,即使没有显式退出/B,也会发生这种情况。啊,谢谢,很高兴知道。在页面上,他们没有添加
exit
选项。这是新功能吗?而且,更重要的是,本地环境是否正确地相互堆叠?@Wolf-是的,它们正确地堆叠,自引入SETLOCAL以来,行为一直保持一致。而Microsoft batch/cmd.exe文档通常是一堆丢失的信息,有时甚至是错误的。