web-dev-qa-db-fra.com

Impossible d'extraire des informations de durée à l'aide de FFProbe, les virgules dans les noms de fichiers sont en train de gâcher ma boucle

Ceci ici script de lots crée une liste de fichiers de %folder% utilisant %wildcards%, crée ensuite un répertoire en miroir sur le lecteur c: contenant une version txt de chaque fichier comme every file.mkv.txt, qui contiennent des données des fichiers d'origine comme path-to-file/duration/size.

setLocal enableDelayedExpansion
:: adder fails with filenames with ampersand "&". investigate
for /f "delims=" %%v in ('dir "%folder%\%wildcards%" /b /s /a-d 2^>nul') do (
    if not exist "c:%%~pv" mkdir "c:%%~pv"
    if not exist "c:%%~pnxv.txt" for /f "usebackq tokens=2 delims=," %%i in ('"%ffprobe%" -v quiet -show_entries "format=duration" -of csv "%%v"') do (
        rem record path-to-file/duration/size into mirror files
        echo %%v/%%i/%%~zv>"c:%%~pnxv.txt"
    )
)

Succède à certains fichiers et échoue avec d'autres, je pense que cela a quelque chose à voir avec les virgules , Dans la partie où ffprobe est exécuté au fichier %%v. On dirait que je dois utiliser des virgules comme délimiteur car la durée est formatée comme format,94.436000. Cela a cessé de fonctionner depuis que j'ai commencé à avoir besoin de citations pour le %ffprobe% variable (où le chemin de FFProbe.exe est).

2
Bricktop

Je pense que cela a quelque chose à voir avec les virgules (,) Dans la partie où FFProbe est exécuté au fichier %% v .:

:: adder fails with filenames with ampersand "&". investigate`

Essayez juste ajouter 2>&1 Dans ffprob commande.
également remplacer echo string,with &, and commas À:
[.____] echo+ & <nul set /p .="Str,ing,s with & and com,mas" >>file

for /f tokens^=* %%v in ('dir "%folder%\%wildcards%" /b /s /a-d 2^>nul')do 2>nul mkdir "c:%%~pv" & if not exist "c:%%~pnxv.txt" (
    for /f usebackq^tokens^=1*delims^=^, %%i in (`2^>^&1 "%ffprobe%" -v quiet -show_entries "format=duration" -of csv "%%v"`)do (
        echo+ & <nul set /p .="%%v/%%j/%%~zv">>"c:%%~pnxv.txt"))

OBS. :=== À propos de la même chose: 2>nul mkdir folder Vs if not exist folder (create)do not do(ignore)...

En utilisant mkdir folder, Vous pouvez créer un dossier si cela n'existe pas dans une action, dans un déjà existant/ne le crée pas, il renvoie simplement un avertissement/message informant l'existence, ce n'est pas un effondrement/désastre .

Il s'agit d'une action sans impact efficace pour la fonction de boucle/batte ne nécessitant qu'une commande avec un traitement prédictif dû à une non-exécution éventuelle où il n'est pas nécessaire [ run (if folder exists warning) omit ] and continue..., qui est parfaitement amende résultant de omettre l'erreur/avertissement avec 2>nul mkdir Folder_If_Or_Not_Exist & continue

2
iTwasnTme