批处理文件:命令在主例程中有效 - 调用时失败(使用变量)

时间:2013-03-28 14:07:13

标签: batch-file

我需要帮助填补知识空白。不确定为什么处理方式不同,但确定有合理的解释。

以下代码适用于主程序。

IF exist "%pathfile%.mkv" (
set file_error=0
) ELSE (
        set file_error=1    
        call :ERROR
)

然而,在我运行脚本之后,我仔细阅读了回到我的结构化编程大学时代,并决定应该清理和组织更多的逻辑。所以我将这个文件检查移动到一个可以从main调用的子例程。

:ISFILETHERE
echo "%pathfile%.mkv"   -->placed only for debug
IF exist "%pathfile%.mkv" (
    set file_error=0
) ELSE (    
set file_error=1
ECHO -----------------------------ERROR------------------------------------------
ECHO   %file%.mkv does not exist in %fullpath%
ECHO ----------------------------------------------------------------------------
)
GOTO :EOF

变量说明:

set basepath=\\opennas\media\Movies\
set basefolder=%~1
set file=%~2
set fullpath=%basepath%%basefolder%\
set pathfile=%basepath%%basefolder%\%file%

因此%pathfile%.mkv是一个变量,存储从上述预设默认+用户条目组合派生的完整路径和文件名(不带扩展名)。

如果我对“%pathfile%.mkv”进行回显,那么输出就是我所期望的。但是它似乎有IF exist "%pathfile%.mkv" (的问题它在主要中正确地通过它,但是当它在从主要调用的子中时。 setlocal设置在文件的开头,没有endlocal,也没有额外的选项。

尝试运行脚本的输出: >mkv2wtv "Gattaca (1997)" "Gattac" 内部的debug-echo只是回显%pathfile%:"\\opennas\media\Movies\Gattaca (1997)\Gattac.mkv"(引号在输出中应该是) 下一行应该是If语句,错误:'\'此时是意外的。'

我缺少什么,必须是为什么这在主要工作中是合乎逻辑的,但具有相同内容的变量的完全相同的代码在子中不起作用。

感谢您一看。

1 个答案:

答案 0 :(得分:0)

解析IF后,扫描从IF到右括号的整个语句,并将 ANY %var%替换为 PARSE-TIME 内容。

因此,(1997)中的右括号被视为IF的右括号, * THAT 将代码转换为错误的格式。

治愈是用一个插入符号(^)来逃避那个近括号,但如果它在一个变量中,这可能会很不方便。

以下是一些可能有用的代码:

@ECHO OFF
SETLOCAL
SET var=1234)567)89
ECHO %var%
SET var=%var:)=^^^^)%
ECHO %var%