- forum
- PowerShell
- Entraide pour les débutants
- Construction de commande à lancer à partir de variable construites elles-même
Question
Construction de commande à lancer à partir de variable construites elles-même
- MilesTEG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
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"
#### 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"
# ================== 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 :
La variable output contient le chemin d'accès au fichier de destination, et bien entendu il contient des espacesmkvmerge 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 ».
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.
- ericlm128
- Hors Ligne
- Membre elite
- Messages : 187
- Remerciements reçus 37
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6302
- Remerciements reçus 68
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.
- MilesTEG
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 3
- Remerciements reçus 0
Bonsoir,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}'"
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.
- forum
- PowerShell
- Entraide pour les débutants
- Construction de commande à lancer à partir de variable construites elles-même
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Construction de commande à lancer à partir de variable construites elles-même