Question Construction de commande à lancer à partir de variable construites elles-même

Plus d'informations
il y a 2 ans 5 mois #31472 par MilesTEG
Bonjour,
Je cherche à lancer une commande qui est construite à partir de différentes variables que j'ai elles aussi construites au fil de mon script.

Déjà, petites explications sur ce que fait mon script (un peu long, je ne mettrais que les parties utiles ici). Il utilise MKVmerge.exe pour fusionner deux mkv en ne gardant que la piste audio et éventuellement la piste sous-titre du mkv_1 et en ne gardant que la piste vidéo du mkv_2.
Comme il peut arriver que j'ai besoin de conserver un autre piste audio ou une autre pise de sous-titre, je cherche à construire au fur-et-à-mesure les paramètres de la commande mkvmerge au lieu de modifier la commande manuellement.
J'ai déjà fait cette commande là qui fonctionne très bien :
        & $MKVMerge --title "$VideoTrackName" --track-order "$track_order" --subtitle-tracks "$subtitle_tracks" -o "$Output" --no-video --language "$AudioLang_1" --track-name "$AudioTrackName_1" --default-track "$AudioTrack_1_default" --sub-charset "$sub_charset_1" --language "$SubTrackLang_1" --track-name "$SubTrackName_1" --default-track "$SubTrack_1_default" "$MKV_1" --no-audio --no-track-tags --no-global-tags --language "0:en" --track-name "0:$VideoTrackName" --default-track "0:yes" --no-subtitles --no-audio "$MKV_2"
Vous constatrez qu'il y a déjà des variables qui correspondent aux différents paramètres des pistes, je les définis au début de mon script. Voilà par exemple pour 1 une piste audio, et un sous-titre :
#### FILE 1 - Keeping all but the video
# ================== AUDIO ==================
# Track 1 = Audio n°1
# Name and language of Audio Track n°1
$AudioTrackName_1 = "1:English - DDP 5.1"
$AudioLang_1 = "1:en"
$AudioTrack_1_default = "1:yes"
#$file_1_options = "--no-video"
# Define track order
$track_order = "1:0,0:1"
Et un peu plus loin : 
    # ================== INTERNAL SUBTITLES ==================
    # Track 2 = Sub n°1 to keep
    # Name and language of Subtitle Track n°1 + Sync Value
    $SubTrackName_1 = "2:English - SRT"
    $SubTrackLang_1 = "2:en"
    $SubTrack_1_default = "2:yes"
    $sub_charset_1 = "2:UTF-8"
    # Define track order
    $track_order += ",0:2"
    $subtitle_tracks = "2"

Les autres variables sont obtenues de diverses manières, mais je ne pense pas que ce soit important de détailler ici ces points...
Toujours est-il que la plupart des variables peuvent contenir des espaces , notamment les chemins d'accès ou les variables xxxx_name.
Les 3 variables de chemins d'accès sont celles-ci :
  • $MKV_1 : chemin d'accès du mkv n°1 avec extension de fichier
  • $MKV_2 : chemin d'accès du mkv n°2 avec extension de fichier
  • $MKVMerge  : chemin d'accès de l’exécutable MKVmerge.exe

J'ai tenté ceci :
# variables placée là où je déifni la piste audio
$MKVMerge_audio_param += $AudioLang_1, '--track-name', $AudioTrackName_1, '--default-track', $AudioTrack_1_default

# variables placée là où je déifni la piste de sous-titre
$MKVMerge_sub_param = '--sub-charset', "$sub_charset_1", '--language', "$SubTrackLang_1", '--track-name', "$SubTrackName_1", '--default-track', "$SubTrack_1_default"
 
# ce qui suit est à l'emplacement où je vais lancer la commande (dans le script hein ;) )
$MKVMerge_param_start = '--title', "$VideoTrackName", '--track-order', "$track_order", '--subtitle-tracks', "$subtitle_tracks", '-o', $Output, '--no-video', '--language'
$MKVMerge_param_mkv2 = '--no-audio', '--no-track-tags', '--no-global-tags', '--language', '0:en', '--track-name', "0:$VideoTrackName", '--default-track', '0:yes', '--no-subtitles', '--no-audio', "$MKV_2"
$MKVMerge_param_all = "$MKVMerge_param_start", "$MKVMerge_audio_param", "$MKVMerge_sub_param", "$MKV_1", "$MKVMerge_param_mkv2"

# Vérification de la commande qui va se lancer 
Write-Host "$MKVMerge_param_all" -ForegroundColor "black" -BackgroundColor "DarkGray"

# Commande lancée
& "$MKVMerge" "$MKVMerge_param_all"

La commande write-host me renvoie bien la commande attendue avec tous les contenus des variables.
Mais comme il y a des espaces dans les chemins d'accès, et aussi dans certaines autres variables, la commande finale ne fonctionne pas.
Avec mes essais actuels, ça me renvoi cette erreur suivie des options de mkvmerge :

mkvmerge v61.0.0 ('So') 64-bit
Erreur : pas de nom de fichier destination fourni.

mkvmerge -o out [global options] [options1] <file1> [@option-file.json] …

 Options globales :
  -v, --verbose            Augmenter la verbosité.
  -q, --quiet              Supprimer les messages d'état.
  -o, --output cible       Écrit vers le fichier « cible ».

La variable output contient le chemin d'accès au fichier de destination, et bien entendu il contient des espaces 

Bref, comment faire pour que cette commande finale fonctionne correctement ?

Merci de votre aide.
Bonne journée.

Ps : j'ai posté dans la section débutants, car je ne maitrise pas encore bien le langage Powershell :) mais j'ai quelques bases de programmation ;)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 5 mois #31473 par ericlm128
Bonjour,

Je ne comprend pas tout mais les chemins qui contiennent des espaces doivent être encadrées de guillemets :
ex : "C:\Program Files"

PS : Avant d'arrivé à construire ta ligne d'exécution il faut que tu trouve la ligne d'exécution à construire, ce n'est pas de la programmation.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 5 mois #31477 par Laurent Dardenne
Salut,
en complément de la réponse d'Eric tu devrais, si possible, tester un appel simple ( 2 paramètres dont un nom de fichier).
Tu utilises implicitement des tableaux de chaînes, ton code dépend donc de la variable automatique $OFS.
L'usage d'un stringbuilder serait préférable sans être obligatoire.

Pour la syntaxe ce serait plutôt ceci :
$MKV_2='c:\temp'
"'$MKV_2'" #ou "'${MKV_2}'"

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 5 mois #31479 par MilesTEG

ericlm128 post=31473 userid=48110
Bonjour,

Je ne comprend pas tout mais les chemins qui contiennent des espaces doivent être encadrées de guillemets :
ex : "C:\Program Files"

PS : Avant d'arrivé à construire ta ligne d'exécution il faut que tu trouve la ligne d'exécution à construire, ce n'est pas de la programmation.
________
Laurent Dardenne post=31477 userid=127Salut,
en complément de la réponse d'Eric tu devrais, si possible, tester un appel simple ( 2 paramètres dont un nom de fichier).
Tu utilises implicitement des tableaux de chaînes, ton code dépend donc de la variable automatique $OFS.
L'usage d'un stringbuilder serait préférable sans être obligatoire.

Pour la syntaxe ce serait plutôt ceci :

$MKV_2='c:\temp'
"'$MKV_2'" #ou "'${MKV_2}'"
 

Bonsoir,
merci pour vos réponses.
La commande qui me sert de base fonctionne si je passe par mon ancienne méthode, moins pratique...

Le soucis avec la nouvelle méthode était bien pour les chaînes de caractères pouvant contenir des espaces... résolu en mettant des `" `" autour en plus des " ".
Mais il a fallu aussi passer par Invoke-Expression pour pouvoir avoir une commande fonctionnelle.
Il a aussi fallu que je 

Donc en résumé voilà les variables, et la commande :
   
$AudioTrackName_1 = "`"1:English - DDP 5.1`""
$AudioLang_1 = "1:en"
$AudioTrack_1_default = "1:yes"
#$file_1_options = "--no-video"
# Define track order
$track_order = "1:0,0:1"
$MKVMerge_audio_param = '--language', "$AudioLang_1", '--track-name', "$AudioTrackName_1", '--default-track', "$AudioTrack_1_default"

    $SubTrackName_1 = "`"2:English - SRT`""
    $SubTrackLang_1 = "2:en"
    $SubTrack_1_default = "2:yes"
    $sub_charset_1 = "2:UTF-8"
    # Define track order
    $track_order += ",0:2"
    $subtitle_tracks = "2"
    $MKVMerge_sub_param = '--sub-charset', "$sub_charset_1", '--language', "$SubTrackLang_1", '--track-name', "$SubTrackName_1", '--default-track', "$SubTrack_1_default"

$MKV_1_List = Get-ChildItem $sourceDirectory_1 -Filter "*.mkv" | ForEach-Object { $_.FullName } | Sort-Object

    $FormatName_1 = (Get-Item $MKV_1).Basename
    $MKV_1_name = $FormatName_1.ToString()
    $MKV_2_file = get-ChildItem $sourceDirectory_2 -recurse | where {$_.name -like "*$MKV_1_name*"} | select name

    $FormatName_2 = $MKV_2_file.Name.ToString()
    $MKV_2_name = $FormatName_2.Substring(0,$FormatName_2.Length-($MkvExtension.Length+1))
    $MKV_2 = $sourceDirectory_2 + "\" + $MKV_2_name + ".$MkvExtension"

    $VideoTrackName = $MKV_1_name -replace $chain_to_search, $chain__to_replace
    $VideoTrackName = "$VideoTrackName"       
 
        $Output = "$destinationDirectory" + "\" + "$VideoTrackName" + ".mkv"
        $Output = "`"$Output`""

        $MKVMerge_param_start = "-o $Output --title `"$VideoTrackName`" --track-order `"$track_order`" --subtitle-tracks $subtitle_tracks  --no-video"
        $MKVMerge_param_mkv1 = "$MKVMerge_audio_param $MKVMerge_sub_param `"$MKV_1`""
        $MKVMerge_param_mkv2 = "--no-audio --no-track-tags --no-global-tags --language 0:en --track-name `"0:$VideoTrackName`" --default-track 0:yes --no-subtitles --no-audio `"$MKV_2`""

        $MKVMerge_param_all = "$MKVMerge_param_start  $MKVMerge_param_mkv1 $MKVMerge_param_mkv2"

        $command = "& $MKVMerge $MKVMerge_param_all"
        Invoke-Expression $command

J'ai aussi tester avec ces variables et ça fonctionne tout autant, donc je vais garder celles-là :
$MKVMerge_audio_param = "--language $AudioLang_1 --track-name $AudioTrackName_1 --default-track $AudioTrack_1_default"
    $MKVMerge_sub_param = "--sub-charset $sub_charset_1 --language $SubTrackLang_1 --track-name $SubTrackName_1 --default-track $SubTrack_1_default"

Merci pour votre aide.
Bonne soirée :) 


 

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.075 secondes
Propulsé par Kunena