Estou aprendendo scripts em lote e fiz alguns bons progressos (pouco, mas o suficiente para me ajudar a economizar tempo). Agora eu gostaria de trabalhar com variáveis. Eu tentei ler sobre variáveis e sei como usar% object% e substituí-lo em alguns casos simples. Mas não tenho nenhuma idéia de como usá-los com instruções "SE". O que estou tentando fazer é substituir o elemento% lng% por "eng" quando o elemento% lngf% for "en.srt".
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%"
** o idioma aparece três vezes porque geralmente tenho três idiomas para legendas.
Minha saída é:
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.
Nota: mostra --language 0: eng duas vezes. Ele deve mostrar --language 0: eng e depois --language 0: spa.
%
caracteres. Portanto, a última parte dessa primeira linha deve ser... set lng=eng
.IF %lngf%==en.srt SET lng=eng
. . . Você precisa ter certeza de definir o valor da variável antes que aIF
instrução o avalie.%lngf%
e você não a definiu.IF %lngf%==en.srt SET lng=eng
.. você também deseja citar em torno da variável, caso ela esteja vazia .. você também deseja citar em torno de sua linha definida, portanto, se houver espaços à direita que você não possa ver, eles não serão incluídos na variável. por exemploIF "%lngf%"=="en.srt" SET "lng=eng"
Respostas:
Existem alguns problemas com a maneira como você está abordando o problema, como outros apontaram nos comentários - o maior deles, no entanto, é que você está tentando usar variáveis com valores diferentes na mesma linha; se
%lng%
=eng
, também não pode serspa
. Com base no código que você forneceu, uma das duas soluções é provavelmente a sua melhor aposta:Não há necessidade de variáveis
Se as opções de idioma são uniformes para arquivos e o
%lngf%
valor não é predeterminado (vem de um arquivo, uma propriedade etc.), mas é algo que você está definindo - você pode evitar suas variáveis que não são de loop inteiramente:Você não está realmente salvar qualquer espaço ou torná-lo mais fácil de digerir ou olhar alterando coisas como
eng
para%lng%
sem motivo; Também removi o~
seu,%%~A
pois era desnecessário.Sua variável de idioma é determinada pelo que está disponível em um determinado arquivo.
Se o valor de
%lngf%
é predeterminado, você pode usarif exist else
linhas aninhadas para definir cada argumento de idioma inteiro do seu comando como uma sequência de caracteres em uma variável e, em seguida, usar cada um no seu comando. Não vi os dados com os quais você está trabalhando e não estou familiarizadomkvmerge
, mas digamos que existem sinalizadores para cada idioma disponível no seu arquivo:Isso usará suas configurações de idioma agrupadas em torno do seu
%%~nA
parâmetro para cada iteração - observe que, como na verdade estamos usando sinais de porcentagem na variável, precisamos dobrá-los. Para os idiomas disponíveis (aqueles que possuem um sinalizador ou o que os predeterminou), ele define o argumento e o espaço desse idioma como uma variável - e para os idiomas que não estão disponíveis, sua variável está vazia. No final do loop, ele usarámkvmerge
todas as variáveis de linguagem para as quais você temif exist else
instruções. Obviamente, esse não é o seu loop for, mas a estruturação do conteúdo do loop dessa maneira deve fornecer a saída desejada. Se você tiver alguma dúvida sobre como levar isso adiante, informe-nos.fonte