web-dev-qa-db-ja.com

バッチスクリプトサブルーチン:引数の受け渡し

私の理解では、サブルーチンに渡されたファイルから引数として日付を取得するには、その引数をサブルーチン内の変数としてリセットする必要があります。これは正しいです?これは私には関係ないので、何が起こっているのか完全には理解していないのではないかと思います。渡された引数は、日付の抽出を除いて、実質的に他のすべてのサブルーチンコードで使用できます。

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
9
Fractal

_%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
_
9
dbenham

バッチスクリプトを真剣に作成したい場合は、構文に注意する必要があります。

@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

:: ------------------
:
0
Endoro