获取函数参数获取命令行参数 - 批处理

时间:2016-11-03 10:24:32

标签: batch-file

我将命令行参数传递给批处理脚本并将其设置为如下变量:

SET dirWhereKept=%1

我的问题是,我用3个参数调用批处理脚本中的函数。当试图获得这3个参数时,它会通过命令行传入:

FOR /f "delims=" %%i IN ('DIR /B') DO (
    IF EXIST "%%~i\" (
        rem nothing
    ) ELSE (
        CALL :checkIfWantedFile %%i "%%~xi" %%~zi
    )
)

:checkIfWantedFile
SET file=%~1
SET fileExtension=%~2
SET fileSizeInBytes=%~3

ECHO FILE: %file%
ECHO EXTENSION: %fileExtension%
ECHO SIZE: %fileSizeInBytes%

例如,如果我传入"Avatar ECE (2009)"作为命令行参数(这是一个目录),然后在调用我传递的函数时:

  • %%i Avatar.mp4
  • "%%~xi" ".mp4"
  • %%~zi some_int

当我在ECHO中执行checkIfWantedFile时,输出将为:

FILE: Avatar ECE (2009)
EXTENSION:
SIZE:

因为它获取命令行参数而不是函数参数。

我已经看过this和其他一些人,但无法让它发挥作用。

修改

此批处理脚本的目的是进入给定目录(由命令行参数提供)和提取和视频文件(.mp4.mkv,{ {1}})也许在那里。有时,视频文件嵌套在子目录中,这就是我检查.avi循环中的项是否是文件夹的原因。如果是,则批处理脚本打算进入子目录并检查是否有任何想要的视频文件并提取它们。

我添加了一个选项,如果脚本遇到不需要的文件,它就会被删除。但这不是必须的。

目的还在于,当递归清除所有视频文件的目录(在命令行参数中)时,它将被删除。

由于有时会出现不需要的视频样本文件,我也会检查文件的大小,以MB为单位,如果是FOR,那么GTR那么它就是想要的文件,可以提取

我的完整代码如下:

%minimumSize%

2 个答案:

答案 0 :(得分:0)

将CALL语句中的 %% i 更改为" %% i"

示例:

@ECHO OFF
SET "dirWhereKept=%~1"
IF /I NOT "%CD%"=="%~1" PUSHD "%~1"2>Nul||Exit/B
FOR %%i IN (*.*) DO CALL :checkIfWantedFile "%%i" "%%~xi" "%%~zi"
TIMEOUT -1
EXIT/B

:checkIfWantedFile
ECHO FILE: %~1
ECHO EXTENSION: %~2
ECHO SIZE: %~3

答案 1 :(得分:0)

您的问题很简单,批次没有sectionprocedure的概念。它只是执行下一个语句,直到它到达文件结尾或exit

因此,call执行例程:checkIfWantedFile,当它到达文件结尾时,它返回到call之后的下一个逻辑语句 - 这是例程{{ 1}},因此它继续执行,使用提供给批次本身的参数:checkIfWantedFile

您需要在%n标签前插入goto :eof行,以便在:checkIfWantedFile执行该例程后跳过该例程。请注意call中的冒号是至关重要的。 :eof:eof定义为文件结尾。

cmd了许多子程序。您需要在每个子例程的末尾专门call,否则批处理只是继续逐行执行。例如

goto :eof

如果您:deleteFile ECHO "Delete called!" :moveFileToCompress MOVE %file% %needCompressingDir% ,则执行回显,并尝试call :deletefile

如果您move,则只尝试call :moveFileToCompress

如果将其更改为

move

然后
如果你:deleteFile ECHO "Delete called!" GOTO :EOF :moveFileToCompress MOVE %file% %needCompressingDir% goto :eof 则执行回声。

如果您call :deletefile,则尝试call :moveFileToCompress

当然,文件末尾的move是多余的。我习惯性地使用它,所以我不需要记住在新的添加例程之前插入它以防止流过。

您需要为goto :eof

的每个子程序遵循类似的模式

当我说"报告"我的意思是批处理call与控制台有关,所以在你的代码中

echo

这将设置变量,然后报告其值。

(顺便说一下 - 你可能想用

:checkIfWantedFile
SET file=%~1
SET fileExtension=%~2
SET fileSizeInBytes=%~3

ECHO FILE: %file%
ECHO EXTENSION: %fileExtension%
ECHO SIZE: %fileSizeInBytes%

用于报告这些值,这些值将显示以set file 开头的每个现有变量的值和名称 - 更少的输入... ...