如何在此 Windows 批处理文件中使用变量

如何在此 Windows 批处理文件中使用变量

我正在学习批处理脚本,取得了一些进展(虽然不多,但足以帮助我节省时间)。现在我想使用变量。我尝试阅读有关变量的文章,并且知道如何使用 %object% 并在一些简单情况下替换它。但我不知道如何将它们与“IF”语句一起使用。我想做的是当元素 %lngf% 为“en.srt”时,将元素 %lng% 替换为“eng”。

IF lngf==en.srt SET lng==eng
IF lngf==es.srt SET lng==spa
FOR /R %%A IN (*.avi *.mp4 *.webm *.ogm *.ogv *.flv) do mkvmerge -o "%%~nA.mkv" "%%~A" --language 0:%lng% "%%~nA.%lngf%" --language 0:%lng% "%%~nA.%lngf%"

**语言出现了 3 次,因为我通常用 3 种语言制作字幕。

我的输出是:

mkvmerge -o "vsshort.mkv" "C:\Users\Administrator\Desktop\pessoal\tests\video.avi" --language 0:eng "vsshort." --language 0:eng "video."
mkvmerge v30.1.0 ('Forever And More') 64-bit
Erro: The file 'video.' file can't be opened for reading: open file error.

注意:它显示--语言 0:eng两次。它应该显示 --language 0:eng 和然后--语言 0:spa。

答案1

正如其他人在评论中指出的那样,您解决问题的方式存在一些问题 - 然而,最大的问题是您试图在同一行上使用具有不同值的变量;如果%lng%= eng,它也不能是spa。根据您提供的代码,以下两种解决方案之一可能是您的最佳选择:

不需要变量
如果文件的语言选项是统一的,并且%lngf%值不是预先确定的(来自文件、属性等),而是你自己设置的,那么你可以完全避免使用非循环变量:

mkvmerge -o "%%~nA.mkv" "%%A" --language 0:eng "%%~nA.en.srt" language 0:spa "%%~nA.es.srt"

通过无缘无故地更改诸如eng之类的内容,您实际上并没有节省任何空间,也没有使其更容易消化或查看;我还从您的 中删除了,因为它是不必要的。%lng%~%%~A

或者

您的语言变量取决于给定文件中可用的内容
如果的值%lngf%是预先确定的,则可以使用嵌套行将if exist else命令的每种语言参数设置为变量中的字符串,然后在命令中使用每个参数。我没有看到您正在使用的数据,也不熟悉mkvmerge,但假设您的文件中每种语言都有可用的标志:

FOR YOUR LOOP WITH PARAMETER %%A DO (
    if exist englishflag (set "ENGLISH=--language 0:eng "%%%%~nA.en.srt" ") ELSE (set "ENGLISH=")
    if exist spanishflag (set "SPANISH=--language 0:spa "%%%%~nA.es.srt" ") ELSE (set "SPANISH=")
    etc. for each language
    mkvmerge -o "%%~nA.mkv" "%%A" %ENGLISH%%SPANISH%%ETC%
)

这将使用您的语言设置来包裹您的%%~nA参数,用于每次迭代 - 请注意,由于我们实际上在变量中使用百分号,因此我们必须将它们加倍。对于可用的语言(具有标志或任何已预先确定的语言),它将该语言的参数和空格设置为变量 - 对于不可用的语言,它们的变量为空。在循环结束时,它将使用mkvmerge您有语句的所有语言变量if exist else。显然这不是您的 for 循环,但以这种方式构造循环的内容应该会给您所需的输出。如果您对如何进一步操作有任何疑问,请告诉我们。

相关内容