2017-10-03 1 views
1

Est-il possible d'utiliser FINDSTR avec une variable au lieu d'un fichier?Comment utiliser FINDSTR pour trouver une chaîne dans la valeur d'une variable?

J'ai essayé de faire des recherches sur ce sujet, mais mes connaissances sur les lots ne sont pas encore suffisantes.

J'ai fait en sorte que la plupart de mes fichiers batch fonctionnent parfaitement pour ce dont j'ai besoin, mais j'ai du mal à extraire une partie d'une variable chaîne en une nouvelle variable.

La variable d'origine par exemple serait S02E12 - Charge!. Je voudrais extraire 02 à ep_seas, 12 à ep_num, et Charge! à ep_name. Je l'ai fonctionné maintenant si c'est le modèle exact de noms, mais j'ai rencontré quelques fichiers qui sont dans ce modèle: S02E124 - Charge #2!

Y at-il un moyen que je peux obtenir dynamiquement les valeurs dont j'ai besoin indépendamment de leur longueur?

Mon idée était d'utiliser FINDSTR pour rechercher entre le S et le E, puis entre E et de l'espace   (ou -), puis entre - et la fin. Je ne suis pas sûr de savoir comment je vais procéder avec ça.

Quelqu'un at-il une solution que je peux examiner ou quelqu'un peut-il donner un exemple?

setlocal DisableDelayedExpansion 
set mkvmerge="C:/Program Files/MKVToolNix/mkvmerge.exe" 
set "output_folder=%cd%\Muxing" 
for /r %%a in (*.mkv) do (
    set fi=%%a 
    set ep=%%~na 
    call :merge 
) 
goto :eof 

:merge 
set ep_name=%ep:~9% 
set ep_num=%ep:~4,2% 
set ep_seas=%ep:~2,1% 
call %mkvmerge% -o "%output_folder%\%ep%.mkv" --track-name "0:%ep_name%" --language 0:und --default-track 0:yes --track-name "1:[JAP]" --language 1:jpn --default-track 1:yes --track-name "2:[ENG]" --language 2:eng --default-track 2:yes --forced-track 2:yes "%fi%" --track-order 0:0,0:1,0:2 --title "Fate Zero - Episode %ep_num%" 
goto :eof 
+0

Lit la commande 'FOR/F' et l'option' DELIMS'. – Squashman

Répondre

2

Vous pouvez utiliser ce code pour votre tâche:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
set "mkvmerge=%ProgramFiles%\MKVToolNix\mkvmerge.exe" 
set "output_folder=%CD%\Muxing" 
for /R %%I in (*.mkv) do (
    set "fi=%%I" 
    set "ep=%%~nI" 
    call :merge 
) 
goto :EOF 

:merge 
for /F "tokens=1,2* delims=ES- " %%A in ("%ep%") do (
    set "ep_seas=%%A" 
    set "ep_num=%%B" 
    set "ep_name=%%C" 
) 
"%mkvmerge%" -o "%output_folder%\%ep%.mkv" --track-name "0:%ep_name%" --language 0:und --default-track 0:yes --track-name "1:[JAP]" --language 1:jpn --default-track 1:yes --track-name "2:[ENG]" --language 2:eng --default-track 2:yes --forced-track 2:yes "%fi%" --track-order 0:0,0:1,0:2 --title "Fate Zero - Episode %ep_num%" 
goto :EOF 

La commande FOR/F utilisé ici parse la chaîne entre guillemets qui est le nom du fichier.

L'option "tokens=1,2* delims=ES- " entraîne la division des chaînes de noms de fichiers S02E12 - Charge! et S02E124 - Charge #2! en 3 sous-chaînes en utilisant les 4 caractères spécifiés comme délimiteurs.

  1. jeton 1 est 02 pour les noms de fichier affecté à la variable de boucle spécifiée A.
  2. Le jeton 2 est 12 et 124 pour les deux noms de fichiers affectés à la variable de boucle suivante après A selon le tableau ASCII qui est B. Le jeton 3 est tout ce qui suit les délimiteurs après le jeton 2, à savoir Charge! et Charge #2! pour les deux fichiers affectés à la variable de boucle suivante, mais une C.

Vous savez maintenant pourquoi les variables de boucle sont sensibles à la casse alors que les variables d'environnement ne sont pas sensibles à la casse. La variable de boucle spécifiée définit les caractères des variables de boucle suivantes en utilisant for /F avec plusieurs jetons/sous-chaînes.

* annexé à un numéro de jeton X signifie reste de la chaîne/ligne après les délimiteurs après la sous-chaîne X doit être affectée à la variable suivante de la boucle sans séparation supplémentaire sur délimiteurs.Ainsi, la chaîne après S02E12 -  et S02E124 -  peut contenir également des caractères de délimitation et est néanmoins entièrement affectée à la variable de boucle C.

Veuillez noter qu'une chaîne commençant par E ou S après trait d'union et espace est interprétée également comme délimiteur et donc manquante dans la chaîne affectée à la variable de boucle C. La boucle FOR dans le sous-programme merge peut être remplacée par le code suivant pour obtenir une solution de travail pour un nom de fichier tel que S03E48 - Extended Version.mkv.

for /F "tokens=1* delims=- " %%A in ("%ep%") do (
    set "ep_name=%%B" 
    for /F "tokens=1,2 delims=ES" %%C in ("%%A") do (
     set "ep_seas=%%C" 
     set "ep_num=%%D" 
    ) 
) 

La boucle externe assigne S03E48 à la variable de boucle A et Extended Version à la variable de boucle B. La boucle interne se sépare de nouveau S03E48 en 03 affecté à la variable de boucle C et 48 affectée à la variable de boucle D.

A propos: Le séparateur de répertoire sous Windows est \ et non / que sur Unix/Linux/Mac, bien que les fonctions de Windows du noyau support des fichiers aussi/chemins de répertoire avec / avec correction automatique \. Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?

Une dernière note:

Il est possible d'utiliser FINDSTR sur une variable d'environnement par exemple avec:

echo %ep% | findstr /R "^S[][]" 

Mais FINDSTR sorties jamais seulement la chaîne correspondante. Il sort toujours la ligne entière contenant la chaîne trouvée. Donc, FINDSTR n'est d'aucune aide ici pour diviser le nom de fichier en parties séparées.