1

我需要帮助填补知识空白。不知道为什么处理不同,但肯定有一个合乎逻辑的解释。

以下代码适用于主例程。

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

然而,在我的脚本运行后,我回顾了我的结构化编程大学时代,并决定应该清理它并更有逻辑地组织它。所以我把这个文件检查移到一个可以从主程序调用的子程序中。

: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" sub 内的调试回显,它简单地回显 %pathfile%:("\\opennas\media\Movies\Gattaca (1997)\Gattac.mkv"引号在输出中应该是这样)下一行,应该是 If 语句,错误:'\ 在这个时间。'

我错过了什么,必须是合乎逻辑的,为什么这在主程序中有效,但是具有相同内容的变量的完全相同的代码在子程序中不起作用。

谢谢你看。

4

1 回答 1

0

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

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

解决方法是用插入符号 ( ^) 转义该右括号,但如果它位于变量中,这可能会很不方便。

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

@ECHO OFF
SETLOCAL
SET var=1234)567)89
ECHO %var%
SET var=%var:)=^^^^)%
ECHO %var%
于 2013-03-28T14:22:39.257 回答