2017-06-22 48 views
0

我一直試圖使用%% f來操作目錄中每個文件上的腳本,但是當通過腳本引用它時,%% f和%%〜nf不會似乎工作。我限制了編程經驗,我試圖製作更有用的this video formatting tutorial版本。批量存儲%% f作爲變量

所以我想存儲%% f和%%〜nf作爲變量來引用腳本的其餘部分,儘管我無法解決這個問題。

@echo off 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO echo %%f 
set TEST=%%f 
echo %TEST% 
cmd/k 

如果我可以存儲這些將解決我的問題,但是這是我想要做的更長的形式,這個腳本工作,如果我有用戶輸入文件手動到一個變量(% VIDEO%= %% f和%〜nf)。雖然這遠非理想。

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO (
::IDFILE 
for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -show_entries format^=filename -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "FILENAME=%%I" 

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams v:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "Vcodec=%%I" 

for /F "delims=" %%I in ('C:\ffmpeg\bin\ffprobe.exe -v error -select_streams a:0 -show_entries stream^=codec_name -of default^=noprint_wrappers^=1:nokey^=1 "%%f"') do set "Acodec=%%I" 

echo %FILENAME% is using %Vcodec% and %Acodec% codecs 

if %Vcodec% == h264 (echo DO NOT CONVERT VIDEO) else (echo CONVERT VIDEO) 
if %Acodec% == ac3 (echo DO NOT CONVERT AUDIO) else (echo CONVERT AUDIO) 
timeout /t 5 

:: COPY V FIX A 
if %Vcodec% == h264 if not %Acodec% == ac3 (echo Copying Video, Converting Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec copy -scodec copy -acodec ac3 -b:a 640K "%%~nf"-AC3.mkv) 

:: FIX V COPY A 
if not %Vcodec% == h264 if %Acodec% == ac3 (echo Converting Video, Copying Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec libx264 -scodec copy -acodec copy "%%~nf-"h264.mkv) 

:: FIX V FIX A 
if not %Vcodec% == h264 if not %Acodec% == ac3 (echo Converting Video, Converting Audio 
timeout /t 5 
C:\ffmpeg\bin\ffmpeg.exe -i "%%f" -map 0 -vcodec libx264 -scodec copy -acodec ac3 -b:a 640K "%%~nf"-h264-AC3.mkv) 

:: COPY V COPY A 
if %Vcodec% == h264 if %Acodec% == ac3 (echo "Doesn't require any Conversion") 
) 
pause 
cmd/k 

回答

2

通過想念它!

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO (
set "video=%%f" 
set "namepart=%%~nf" 
call :idfile 
) 
pause 
goto :eof 

.. then the remainder of your code, except Modify the comment `::IDfile` to a 
    label `:idfile` (1 fewer colon) remove the `)` before the `pause` 
    and replace the `cmd /k` with `goto :eof` and replace `%%f`, `%%~nf` with 
    `%video%`, `%namepart%` respectively. 

兩個主要問題與您的代碼:delayed expansion(約合其中有這麼多,很多文獻 - 只是用在最上面一欄的search設施)和UE的`:: - 風格註釋(這是在事實上已損壞的標籤)在代碼塊(括號內的一系列行)中不允許使用標籤。

我建議的更改只是將您的代碼的整個肉變成一個子程序。

您還可以(並且可能優選地)的代碼變更爲

@echo off 
set /p FORMAT="Enter File Format: " 

FOR %%f IN (*.%FORMAT%) DO call :idfile "%%f" 

pause 
goto :eof 

然後,代替在子程序使用videonamepart,使用%~1%%~n1(因爲%1是子程序的第一個參數; ~刪除引號(這裏確保正確處理,如果%%f包含空格))

+0

非常感謝幫助我現在更接近了,但是當試圖使用%%〜n1作爲實際轉換名稱部分I已經嘗試使用%%〜n1,儘管它似乎沒有正確讀取。 ':: COPY V修復 如果%了vcodec%== H264若不%Acodec%== AC3(回聲複製視頻,轉換音頻 回聲 「%%〜N1」(也試過沒有 「」) 暫停 C:\ ffmpeg \ bin \ ffmpeg.exe -i「%〜1」-map 0 -vcodec copy -scodec copy -acodec ac3 -b:a 640K「%%〜nf」-AC3.mkv)' and it讀回''%%〜n1''或'%%〜n1'併產生稱爲%%〜n1的文件 – RyanMe321

0

嘗試這樣的:

@echo off 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO ( 
    echo %%f 
    set TEST=%%f 
) 
echo %TEST% 

@echo off 
setlocal enableDelayedExpansion 
set /p FORMAT="Enter File Format: " 
FOR %%f IN (*.%FORMAT%) DO ( 
    echo %%f 
    set TEST=%%f 
    echo !TEST! 
)