批处理存储%% f作为变量

时间:2017-06-22 07:38:47

标签: batch-file ffmpeg

我一直在尝试使用%% f来操作目录中每个文件的脚本,但是当通过脚本引用它时,%% f和%% ~nf似乎不是工作。我有限的编程经验我试图制作更有用的source code on github版本。

所以我想将%% 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 个答案:

答案 0 :(得分: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(关于SO有很多很多引用 - 只需使用顶部栏中的search工具)和`:: - style注释(在带有括号的系列行中)不允许使用标签的(实际上是破坏的标签)。

我建议的更改只是将代码的全部内容转换为子例程。

您也可以(也许最好)将代码更改为

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

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

pause
goto :eof

然后,不要在子例程中使用videonamepart,而是使用%~1%%~n1(因为%1是子例程的第一个参数; ~删除引号(如果%%f包含空格,则确保正确处理))

答案 1 :(得分: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!
)