【发布时间】:2017-03-16 21:28:51
【问题描述】:
我将命令行参数传递给批处理脚本并将其设置为如下变量:
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
当我在checkIfWantedFile 中执行ECHO 时,输出将是:
FILE: Avatar ECE (2009)
EXTENSION:
SIZE:
因为它获取的是命令行参数而不是函数参数。
我查看了 this 和其他一些,但无法使其正常工作。
编辑:
此批处理脚本的目的是进入给定目录(由命令行参数提供)并提取和视频文件(.mp4、.mkv、.avi)也许在里面。有时,视频文件嵌套在子目录中,这就是为什么我要检查FOR 循环中的项目是否是文件夹。如果是,那么批处理脚本打算进入子目录并检查那里是否有任何想要的视频文件并提取它们。
我添加了一个选项,即如果脚本遇到不需要的文件,则会将其删除。但这不是必需的。
意图也是当目录(在命令行参数中提供)递归地清除所有视频文件时,它被删除。
由于有时会出现不需要的视频示例文件,我还检查了文件的大小(以 MB 为单位),如果是 GTR 然后是 %minimumSize% 那么它是一个想要的文件并且可以被提取
我的完整代码如下:
@ECHO off
SET "dirWhereKept=%1"
SET mp4=".mp4"
SET mkv=".mkv"
SET avi=".avi"
SET needCompressingDir="E:\Need_compressing"
SET minimumSize=200
CD %needCompressingDir%
CD %dirWhereKept%
FOR /f "delims=" %%i IN ('DIR /B') DO (
IF EXIST "%%~i\" (
rem do nothing
) ELSE (
GOTO :EOF
CALL :checkIfWantedFile "%%i" "%%~xi" "%%~zi"
)
)
:checkIfWantedFile
SET file=%~1
SET fileExtension=%~2
SET fileSizeInBytes=%~3
IF "%fileExtension%" == %mp4% (
CALL :checkFileSize %fileSizeInBytes%
) ELSE (
IF "%fileExtension%" == %mkv% (
CALL :checkFileSize %fileSizeInBytes%
) ELSE (
IF "%fileExtension%" == %avi% (
CALL :checkFileSize %fileSizeInBytes%
) ELSE (
rem this is not required!
CALL :deleteFile
)
)
)
:checkFileSize
SET /a fileSizeInMB=%~1/1024/1024
IF %fileSizeInMB% GTR %minimumSize% (
CALL :moveFileToCompress
)
:deleteFile
ECHO "Delete called!"
:moveFileToCompress
MOVE %file% %needCompressingDir%
【问题讨论】:
-
始终正确使用引号:将
SET dirWhereKept=%1更改为SET "dirWhereKept=%~1",因此引号不会成为变量值的一部分,但可以防止行因特殊字符而失败;然后将%%i改为"%%~i"等;~删除潜在的引号;与显式""一起,这确保了值周围始终存在一对""...
标签: batch-file