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" : %pathfile% を単純にエコーするサブルーチン内の debug-echo: "\\opennas\media\Movies\Gattaca (1997)\Gattac.mkv"(引用符は本来あるべき出力に含まれています) If ステートメントである必要がある次の行、エラー: '\ はこの時点で予想外でした時間。'

私が見逃しているのは、これがメインで機能する理由について論理的なものでなければなりませんが、同じ内容を持つ変数を使用したまったく同じコードはサブでは機能しません。

ご覧いただきありがとうございます。

4

1 に答える 1

0

IF解析されると、ステートメント全体からIF閉じ括弧までがスキャンされ、ANY %var% がそのPARSE-TIMEコンテンツに置き換えられます。

その結果、 の閉じ括弧はand(1997)の閉じ括弧と見なされ、 *THATはコードを誤った形式に変換します。IF

解決策は、その閉じ括弧をキャレット ( ^) でエスケープすることですが、変数内にある場合、これは不便な場合があります。

役立つコードを次に示します。

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