Como usar variáveis ​​neste arquivo em lotes do Windows


2

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.


1
Ao comparar, o dobro é igual (==) está correto. Mas ao definir uma variável, apenas uma (=) é necessária. E ao definir a variável, você não precisa dos %caracteres. Portanto, a última parte dessa primeira linha deve ser ... set lng=eng.
Doug Deden 16/01

1
Deveria ser IF %lngf%==en.srt SET lng=eng. . . Você precisa ter certeza de definir o valor da variável antes que a IFinstrução o avalie.
Pimp Juice IT

Isso não deu certo.
GL

1
Seu For In Do está solicitando variável %lngf%e você não a definiu.
somebadhat 03/04

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"
Señor CMasMas

Respostas:


1

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 ser spa. 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:

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

Você não está realmente salvar qualquer espaço ou torná-lo mais fácil de digerir ou olhar alterando coisas como engpara %lng%sem motivo; Também removi o ~seu, %%~Apois era desnecessário.

OU

Sua variável de idioma é determinada pelo que está disponível em um determinado arquivo.
Se o valor de %lngf%é predeterminado, você pode usar if exist elselinhas 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 familiarizado mkvmerge, mas digamos que existem sinalizadores para cada idioma disponível no seu arquivo:

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%
)

Isso usará suas configurações de idioma agrupadas em torno do seu %%~nAparâ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á mkvmergetodas as variáveis ​​de linguagem para as quais você tem if exist elseinstruçõ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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.