2017-08-30 5 views
1

これは私の2つのスクリプトの出力です。最初のものは、他を呼び出し、echo"%~nx1"使用%1他のスクリプトを呼び出すときに感嘆符が渡されないのはなぜですか?

D:\VIDEOS\SHORTS>for %v in (*) do call namer "%v" 

D:\VIDEOS\SHORTS>call namer "10 Products You’ll Never Buy Again Knowing How They Are Made!.mp4" 

D:\VIDEOS\SHORTS>echo "10 Products You’ll Never Buy Again Knowing How They Are Made.mp4" | find /i ".tmp" 1>nul && exit /b 

としてファイル名を提供します。

私の質問は:なぜ感嘆符は消えませんか?

これは昨日起こっ始めたが、私はこれを引き起こすためにやったことができるものか分かりません。これは大規模なバッチスクリプトクラスタの一部ですが、サイズの制限のためにここに投稿できないので、詳細を尋ねたり一般化してください。

編集:要求されたファイルのnamer.cmd

set "full=" & set "file=" & set "name=" & set "type=" & set "year=" & set "episode=" & set "strict=" & set "loose=" 
echo "%~nx1" | find /i ".tmp" >nul && exit /b 
set "file=%~n1" 

:: ============================================================================================================================= 
::  1. file VALIDATOR 
:: ============================================================================================================================= 

set "original=%file%" 
set "file=%file:!=%" 
set "file=%file:#=%" 
set "file=%file: _ = - %" 
set "file=%file:’='%" 
set "file=%file:“='%" 
set "file=%file:”='%" 
set "file=%file:[=(%" 
set "file=%file:]=)%" 
set "file=%file:_= %" 
set "file=%file:—=-%" 
set "file=%file: = %" 
set "file=%file: = %" 
set "file=%file:&=and%" 

:: exclamation point has to be removed before we enable delayed expansion 
if not "%file%"=="%original%" ren "%~1" "%file%%~x1" 2>nul && echo validated "%file%%~x1" 
if not "%file%"=="%original%" if exist "%original%" ren "%~1" "%file% - copy%~x1" && echo validated "%file% - copy%~x1" 
if not "%file%"=="%original%" if exist "%original%" ren "%~1" "%file% - copy 2%~x1" && echo validated "%file% - copy 2%~x1" 

setlocal enabledelayedexpansion 
set "original=!file!" 
set "file=!file:%%=_percent!" 
if not "%file%"=="%original%" ren "%~dp1%original%%~x1" "for /f "delims=" %%v in ('where /r "d:\videos" "%strict%*" 2^>nul') do" && echo validated "%original%" 

set "original=!file!" 
:: this needs to separated in order to add s01 tag if no season tag present 
for /l %%s in (0,1,9) do set "file=!file:series.%%s.=S0%%s!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof2=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof3=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof4=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof5=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof6=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof7=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof8=E0%%e!" 
for /l %%e in (0,1,9) do set "file=!file:%%eof9=E0%%e!" 
:: if file has changed but no season tag present add s01 
if not "%file%"=="%original%" echo "%file%" | find /i "s0" >nul || set "file=!file:E0=S01E0!" 
if not "%file%"=="%original%" ren "%~dp1%original%%~x1" "%file%%~x1" && echo validated "%original%" 

:: ============================================================================================================================= 
::  2. EXTRAPOLATOR 
:: ============================================================================================================================= 

:extrapolate 
set "type=" & set "year=" & set "ss=" & set "ep=" & set "episode=" 
set "name=%file%" 
echo "%name%"| find " " >nul || set "name=%name:.= %" & rem if no spaces then then safer to replace dots 

:: if short do complete skip of movie/series extrapolator breakdown 
echo "%~n1" | find /i "trailer" >nul && set "type=misc" && goto skipyear 
echo "%~p1" | find /i "\shorts\" >nul && set "type=misc" && goto skipyear 
echo "%~p1" | find /i "\movies\" >nul && set "type=film" && goto skipss 
echo "%~p1" | find /i "\series\" >nul && set "type=show" 

:: episode number: last tag first 
FOR /L %%e IN (100,1,199) DO (
SET "modname=!name:E%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:E%%e=& set ep=E%%e& set type=show& rem !" 
    GOTO gotep 
) 
) 
FOR /L %%e IN (10,1,99) DO (
SET "modname=!name:E%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:E%%e=& set ep=E%%e& set type=show& rem !" 
    GOTO gotep 
) 
SET "modname=!name:E0%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:E0%%e=& set ep=E0%%e& set type=show& rem !" 
    GOTO gotep 
) 
) 

FOR /L %%e IN (0,1,9) DO (
SET "modname=!name:E0%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:E0%%e=& set ep=E0%%e& set type=show& rem !" 
    GOTO gotep 
) 
SET "modname=!name:E00%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:E00%%e=& set ep=E00%%e& set type=show& rem !" 
    GOTO gotep 
) 
SET "modname=!name:%%eof=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:%%eof=& set ep=E0%%e& set type=show& rem !" 
    GOTO gotep 
) 
SET "modname=!name:x0%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:x0%%e=& set ep=E0%%e& set type=show& rem !" 
    GOTO gotep 
) 
) 

GOTO skipep 
:gotep 
%setcmd% 
:skipep 

:: season number: second to last tag second 
FOR /L %%e IN (0,1,9) DO (
SET "modname=!name:S0%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:S0%%e=& set ss=S0%%e& set type=show& rem !" 
    GOTO gotss 
) 
) 
FOR /L %%e IN (10,1,99) DO (
SET "modname=!name:S%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:S%%e=& set ss=S%%e& set type=show& rem !" 
    GOTO gotss 
) 
) 
FOR /L %%e IN (0,1,9) DO (
SET "modname=!name:series.%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:series.%%e=& set ss=S0%%e& set type=show& rem !" 
    GOTO gotss 
) 
) 

GOTO skipss 
:gotss 
%setcmd% 
:skipss 

if defined ep if not defined ss set ss=S01 
set "episode=%ss%%ep%" 

:: year number: first tag last (first with brackets so not to confuse with imdb tag) 
FOR /L %%e IN (1960,1,2020) DO (
SET "modname=!name:(%%e)=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:(%%e)=& set year=%%e& if not defined type set type=film& rem !" 
    GOTO gotyear 
) 
) 
FOR /L %%e IN (1960,1,2020) DO (
SET "modname=!name:%%e=!" 
IF "!modname!" neq "%name%" (
    SET "setcmd=set name=!name:%%e=& set year=%%e& if not defined type set type=film& rem !" 
    GOTO gotyear 
) 
) 
GOTO skipyear 
:gotyear 
%setcmd% 
:skipyear 

if not defined type set type=misc 

:: other trimming for misc etc 
set name=%name: - copy=&rem % 
set name=%name: (1)=&rem % 
set name=%name: (2)=&rem % 
set name=%name: (3)=&rem % 
set name=%name: [1]=&rem % 
set name=%name: [2]=&rem % 
set name=%name:360p=&rem % 
set name=%name:480p=&rem % 
set name=%name:720p=&rem % 
set name=%name:1080p=&rem % 
set name=%name:2160p=&rem % 

:: changes for general use 
set "name=%name: - = %" 
set "name=%name: = %" 

:: trim last useless letter from name 
set "name=%name%endtrimmer" 
set "name=%name:(endtrimmer=endtrimmer%" 
set "name=%name:[endtrimmer=endtrimmer%" 
set "name=%name:.endtrimmer=endtrimmer%" 
set "name=%name:-endtrimmer=endtrimmer%" 
set "name=%name: endtrimmer=endtrimmer%" 
set "name=%name: endtrimmer=%" 
set "name=%name:_endtrimmer=%" 
set "name=%name:endtrimmer=%" 

:: set strings 
if "%type%"=="misc" set "strict=%name: =?%" 
if "%type%"=="film" if defined year set "strict=%name: =?%?(%year%)" 
:: caution: this allows movie to be renamed without year tag 
:: if "%type%"=="film" if not defined year set "strict=%name: =?%" 
if "%type%"=="show" if defined year set "strict=%name: =?%?(%year%)?%episode%" 
if "%type%"=="show" if not defined year set "strict=%name: =?%?%episode%" 
if "%type%"=="show" if defined year set "loose=%name: =?%?(%year%)?s" 
if "%type%"=="show" if not defined year set "loose=%name: =?%?s" 

FOR %%a IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO SET "name=!name:%%a=%%a!" 
endlocal & set "full=%~dp1%file%%~x1" & set "file=%file%%~x1" & set "name=%name%" & set "type=%type%" & set "year=%year%" & set "episode=%ss%%ep%" & set "strict=%strict%" & set "loose=%loose%" 

:: declare (disable never delete) 
echo extrapolated %type% "%strict:?= %" 

:: ============================================================================================================================= 
::  3. FILEBOT MODERATOR 
:: ============================================================================================================================= 

:: if rename not needed exit 
if "%type%"=="misc" exit /b 
if "%~2"=="-norename" exit /b 

:: if already renamed we are done here 
echo "%file%" | find /i " tt" >nul && exit /b 

:: prep fake temp file 
set tempdir=%temp%\%date:~3,2%%date:~6,2%%date:~11,2%%time:~1,1%%time:~3,2%%time:~6,2%%time:~9,2% 
mkdir "%tempdir%" && copy /y nul "%tempdir%\%file%" >nul 

:: variables (to shorten lines) 
if "%type%"=="film" set cf=--db TheMovieDb --format "{n} ({y}) {director} {genres} r{rating} {vf} {vc} {ac} {imdbid}" 
if "%type%"=="show" set cf=--db TheTVDb --format "{n} {s00e00} {t} {vf} {vc} {ac}-mallSanta" 

:: rename fake temp file 
filebot -rename "%tempdir%\%file%" --q "%name% %year%" %cf% >nul 2>nul 

:: new name into variable 
for /r "%tempdir%" %%i in (*) do set "new=%%~nxi" 

:: declare failure 
if "%file%"=="%new%" echo failed, reason: && filebot -rename "%tempdir%\%file%" --log warning --q "%name% %year%" %cf% & exit /b 

:: check all strings against renamed orphan fake file and if successful rename 4real 
for /f "delims=" %%v in ('where "%tempdir%:%strict%*" 2^>nul') do goto 4real 
for /f "delims=" %%v in ('where "%tempdir%:%strict:s?='s?%*" 2^>nul') do goto 4real 
for /f "delims=" %%v in ('where "%tempdir%:%strict:?-?=?%*" 2^>nul') do goto 4real 

:: declare failure and confirm override 
echo. 
echo file "%file%" was renamed 
echo to a "%new%", which was unexpected, 
:: try the interactive command prompt mode in filebot? 
choice /t 20 /c yn /n /d n /m "override and approve this rename? [Y]es or [N]o: " 
if "%errorlevel%"=="1" goto 4real 
exit /b 

:4real 
filebot -rename "%~dp1%file%" --q "%name% %year%" %cf% >nul 2>nul 
if not exist "%~dp1%file%" echo successfully renamed "%file%" 

:: validate the new file (maybe just send to validate with a -norename? takes longer but clearer code 
set "original=%file%" 
set "file=%file:!=%" 
set "file=%file:#=%" 
set "file=%file: _ = - %" 
set "file=%file:’='%" 
set "file=%file:“='%" 
set "file=%file:”='%" 
set "file=%file:_= %" 
set "file=%file:—=-%" 
set "file=%file: = %" 
set "file=%file: = %" 
set "file=%file:&=and%" 
if not "%file%"=="%original%" ren "%~1" "%file%" && echo validated "%original%" 
setlocal enabledelayedexpansion 
set "original=!file!" 
set "file=!file:%%= percent!" 
if not "%file%"=="%original%" ren "%~dp1%original%%~x1" "%file%" && echo validated "%original%" 
endlocal 
exit /b 
それは(1)は、ファイル名からファイル名(2)から問題のある文字を削除

外挿し、ビデオnameyear、他の変数、(3)はありません監督されたfilebotの名前を変更しました。 setlocalendlocalビットが良く見えます。問題はまだ別のスクリプトから継承されている可能性がありますか?

+0

delayedexpansionがオフの場合、 '^! 'の使用はどうですか? – SteveFest

+0

あなたは '^!'をdelayedexpansion offと一緒に使うことができます。あるいは!enable delayedexpansion'を使うときに '^^! 'を使うことができます! '^!'を使用する必要があります。 –

+0

この '^! 'は、未知のファイル名になったときどのように役立ちますか? mediary変数をハックするよりも問題を修正するほうが良いと思われる – bricktop

答えて

3

あなたはどこかにバッチスクリプトnamerECHOライン以上setlocal EnableDelayedExpansionで遅延環境変数の展開を有効にしています。

したがって感嘆符は、さらに、リテラル文字として解釈するが、遅延拡張変数参照の開始/終了などされていません。

私たちは、あなたがこの問題を解決する手助けするnamerバッチファイルのバッチコードが必要になります。

ファイルに.tmpが含まれているかどうかを確認するための行があると思われます。つまり、ファイル拡張子が.tmpである場合は、ファイルを無視してください。

私はその後namerバッチファイルで全く処理されていないファイルの拡張子を持つファイル.tmp

for %%I in (*) do if /I not "%%~xI" == ".tmp" call "%~dp0namer.cmd" "%%I" 

にあなたの最初のバッチファイル

for %%v in (*) do call namer "%%v" 

に変更することをお勧めします。とcall /? IF %~dp0についてのヘルプは、コマンドについてのヘルプは

%~xI(ファイルのファイル拡張子)のヘルプのための遅れ拡大とfor /?の詳細については、コマンドプロンプトウィンドウset /?のRunなどif /?

namer.cmdに使用することも可能である。

if /I "%~x1" == ".tmp" goto :EOF 

最初の引数のファイル拡張子が.tmp(比較大文字と小文字を区別しない)である場合、これはバッチファイルnamer.cmdの処理を終了します。この比較では、遅延展開が有効かどうかは関係ありません。.tmpは、ファイルの拡張子ではなく、どこかのファイル名内にある場合もWhere does GOTO :EOF return to?


に答えてください、文字列置換を有するのIFを使用することが可能です。

バッチファイルnamer.cmdの例。

set "FileName=%~nx1" 
if not "%FileName:.tmp=%" == "%FileName%" goto :EOF 

最初の行は、拡張子ではなく、環境変数FileNameへのパスなしでファイル名を割り当てます。

のすべての出現が大文字と小文字を区別しないファイル名文字列を大文字と小文字を区別して比較します。空の文字列とファイル名文字列はまったく変更されません。ファイル名文字列に実際に.tmpが1回以上含まれていて、バッチファイルの処理が終了した場合、比較された2つの文字列は等しくありません。環境変数に割り当てられた文字列は、大文字と小文字を区別しない:=間に指定された文字列含有 IF条件チェック言い換えれば

Cに使用することに類似している:

#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    if(argc > 1) 
    { 
     /* Does first argument contain the string ".tmp"? */ 
     if(strstr(argv[1],".tmp") != NULL) return 1; 
    } 
    return 0; 
} 

機能strstrは、大文字と小文字が区別されます。

+0

実際には.tmpは拡張子だけでなく完全なファイル名の一部です。一時的なYTDファイルが処理されないようにするためです。ダウンロード中にトラックに '.tmp'拡張子を使用し、それらを' * .tmp.mp4'に結合します。 namer.cmdが追加されました。 – bricktop

+0

遅延搭載が有効かどうかを確認する方法はありますか? – bricktop

+1

@bricktopはい、例えば 'if"で! " == ""エコー遅延拡張が有効です。 "__IF__条件は、遅延拡張が有効な場合にのみ真です。そうでない場合は、比較された2つの文字列は決して等しくありません。 – Mofi

1

ここでは、エスケープ文字を使用せずにdelayedexpansionを使用できる方法を示します。

@echo off 
setlocal disabledelayedexpansion 
set myfile="10 Products You’ll Never Buy Again Knowing How They Are Made!.mp4" 
echo %DB_password% 
setlocal enabledelayedexpansion 
echo !myfile! 
+1

'setlocal disabledelayedexpansion'と' setlocal enabledelayedexpansion'の2つの行に正確に何が起こるかを説明するとよいでしょう。遅延拡張を無効/有効にするだけではなく、スタックオーバーフローやその他の予期せぬ動作が残りますバッチコードの'setlocal'と' endlocal'コマンドが何をするかについては、[この回答]の下半分(https://stackoverflow.com/a/38676582/3074564)を参照してください。 – Mofi

+0

これが私のためにうまくいかなかったとき、私が持っていた問題に私を導く。私は有効になった拡張の中で名字スクリプトを呼んでいました。私はまだスクリプトに問題がありますが、私はそれらをデバッグし続けます。 – bricktop

関連する問題