2008-10-31 7 views
8

Cela semble stupide, mais je ne peux pas le faire fonctionner. Je pense que je juste ne » comprendre la différence entre %%v, %v% and %vComment effectuer des opérations de chaîne sur des variables dans une boucle for?

Voici ce que je suis en train de faire:

for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%v.jpg" 

Cela génère avec succès une miniature pour chacun des films, mais le problème est:

movie.flv -> movie.flv.jpg 

Donc ce que je voudrais faire est de retirer les 4 derniers caractères outre %%v et l'utiliser pour la deuxième variable.

J'ai essayé des choses comme ceci:

%%v:~0,-3% 

Mais cela ne fonctionne pas, ni aucune des itérations de ce que je pouvais penser.

Des idées?

+0

si "set" et "echo" dans une ligne FOR loop: nslookup -vc -type = TXT twitter.com 8.8.8.8 | trouver "" "" | pour/F "tokens = *"% f dans ('findstr $') do @ (echo | set/P str =% f) – diyism

Répondre

8

Utilisez %% ~ nV pour obtenir le nom du fichier uniquement.

+0

Que signifie le "n"? – UltimateBrent

+0

Cela fonctionne! Je ne comprends pas vraiment pourquoi ... – UltimateBrent

+1

Voir aussi "help for": De plus, la substitution de références de variables FOR a été améliorée. Vous pouvez maintenant utiliser la syntaxe suivante en option: % ~ I ​​- étend% I en supprimant les guillemets (") ... % ~ nI - étend% I un nom de fichier que ... – WPWoodJr

8
for %%v in (*.flv) do ffmpeg.exe -i "%%v" -y -f mjpeg -ss 0.001 -vframes 1 -an "%%~nv.jpg" 

De « l'aide »:

%~I   - expands %I removing any surrounding quotes (") 
%~fI  - expands %I to a fully qualified path name 
%~dI  - expands %I to a drive letter only 
%~pI  - expands %I to a path only 
%~nI  - expands %I to a file name only 
%~xI  - expands %I to a file extension only 
%~sI  - expanded path contains short names only 
%~aI  - expands %I to file attributes of file 
%~tI  - expands %I to date/time of file 
%~zI  - expands %I to size of file 
%~$PATH:I - searches the directories listed in the PATH 
       environment variable and expands %I to the 
       fully qualified name of the first one found. 
       If the environment variable name is not 
       defined or the file is not found by the 
       search, then this modifier expands to the 
       empty string 
+0

Merci pour l'explication! – UltimateBrent

2

Je ne suis pas aussi bon au lot comme ci-dessus (j'utilise WSH ou d'autres langages de script au lieu) mais je peux essayer d'expliquer %% v% v et% v%.

Les deux premières formes sont utilisées dans une boucle for. help for explique la différence, la première forme est utilisée dans un fichier séquentiel tandis que la seconde est utilisée lorsque vous tapez (coller) la commande directement à l'invite de commande.

La dernière forme remplace simplement le nom variable (variable d'environnement) avec sa valeur:

set FOO=C:\bar\foo 
cd %FOO%\gah 
25

Pour les personnes qui ont trouvé ce fil à la recherche de la façon d'effectuer réellement les opérations de chaîne sur les variables pour la boucle (utilise delayed expansion) :

setlocal enabledelayedexpansion 

... 

::Replace "12345" with "abcde" 
for %%i in (*.txt) do (
    set temp=%%i 
    echo !temp:12345=abcde! 
) 
+0

Fonctionne, merci! –

+7

Si vous voulez comparer à la place d'echo, vous ne pouvez pas le faire sur la même ligne que le remplacement, vous devez utiliser SET à nouveau, exemple (vérifier si le fichier contient le script "thirdparty"): set file = %% i \ n SET fichier =! fichier: thirdparty =! \ n IF %% f ==! fichier! –

0

Encore une autre manière que je préfère est de créer une sous-routine : la parole que pour chaque élément de la boucle for, auquel je passe le %% variable v (processMpeg).

for %%v in (*.flv) do call :processMpeg "%%v" 
goto :eof 

:processMpeg 
    set fileName=%~n1 
    echo P1=%1 fileName=%fileName% fullpath=%~dpnx1 
    ffmpeg.exe -i "%~1" -y -f mjpeg -ss 0.001 -vframes 1 -an "%filename%.jpg" 
    goto :eof 
Questions connexes