IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

récupérer le résultat d'une commande pour le mettre en variable


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut récupérer le résultat d'une commande pour le mettre en variable
    Bonjour j'ai un grosse colle et je n'arrive pas à avancer du coup je me permet de vous solliciter.

    Je dois réaliser un batch qui récupère un paramètre du résultat d'une commande afin de faire du déplacement de fichier. simple quoi
    Je me suis dirigé vers l'utilisation de boucle mais je dois admettre qu'il me manque des notions pour avancer . Bref le script est le suivant

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for /f "skip=1 tokens=2,9 delims= " %%i IN ('"commande"') do (
    call :loop %%i
    set i=%%i 
    set j=%%j
    :loop
    move "C:\temp\%j%" "C:\temp\%i%\"
    )

    Voilà l'idée est de récupérer les tokens 2 (origine du fichier) et 9 (nom du fichier), de les mettre en variables afin de traiter leur déplacement en fonction de leur site d'origine.

    Pour l'instant, je prend l'erreur Tentative non valide d'appel d'un nom de fichier de commandes en dehors du script de commandes.

    Voilà a terme je souhaiterais rajouter des conditions dans ma boucle du type If i=toto go to :toto (afin de lancer le move dans :toto).


    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Quel est réellement la "commande" ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour merci pour le retour.

    la commande est un truc applicatif propriétaire qui me sort des infos sur un transfert de fichier sous la forme suivante
    Number  Site     Type D Day  Proto_Id Appli    State File           R  KBytes  Sc U
    1          blabla   Toto R 0454  45566   toto     E       nom fichier 00 0000015 N  N
    1          blibli     Toto R 0444  45567   tata     E       nom fichier 00 0000015 N  N
    ...
    Bon depuis j'ai avancé, mon script n'avait pas de sens. Je suis désolé la batch c'est pas mon fort.
    Donc ça marche mieux maintenant mais si la version avec le call marchait aussi. En fait le problème venait d'un espace qui s'était glissé derrière set i=%%i

    donc le même script sans ce qui sert à rien et qui fonctionne parfaitement

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for /f "skip=1 tokens=2,9 delims= " %%i IN ('"commande"') do (
    set i=%%i
    set j=%%j
    move "C:\temp\%j%" "C:\temp\%i%\"
    )

    Bon j'en ai pas fini c'était juste pour tester.
    Dans la réalité je vais devoir rajouter des if %%i=blabla move %%j au bon endroit et si if %%i=blibli move %%j au bon endroit
    ou alors passer par des call genre
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    call:%%i
    :blabla
    move %%j au bonne endroit
    :blibli
    move %%j au bonne endroit


    Bref j'ai encore du travail

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Ok.
    Oui il n'y a pas de problème pour ajouter des if et des call
    Mais pour le call l'étiquette devra être en dehors de la boucle for

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour comme je suis venu solliciter de l'aide voici finalement le script final

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    REM ****definition des variables****
    Set rep_destination=C:\temp\testpel\RECTRA
    Set rep_reception=C:\temp\testpel\OLD
    Set rep_script=C:\temp\testpel
    Set nature_appli=TLCTRA
     
    cd %rep_script%
     
    REM **** Création du Log avec horadatage ****
    For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
    For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
    set mytime=%mytime: =0%
    set Logname="reception_%nature_appli%_%mydate%_%mytime%.log"
     
    REM **** lancement du profil admin ****
    cd "C:\XFB.Monitor InterPel\run_time\etc\"
    call "C:\XFB.Monitor InterPel\run_time\etc\profile.bat"
     
    REM **** redirection fichier en fonction de l'id protocolaire source ****
    echo TRAITEMENT AUTOMATIQUE DU %date% %time%																	>>%rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log
    for /f "skip=1 tokens=1,2,9 delims= " %%i IN ('"peldsp status_trans -ap %nature_appli%"') do (
    	if %%j==DBPSEF move "%rep_reception%\%%k" "%rep_destination%"
    	echo %%i %%j %%k													>>%rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log
    )
    REM **** archivage et compression du fichier log ****
    if not exist %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log goto Mail
    "C:\Program Files\7-Zip\7z.exe" a -t7z %rep_script%\archive_log_reception_%nature_appli%.7z %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log
    del %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log 
    If not exist %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log goto Fin
    :Mail
    REM **** Envoi mail si problème ****
    powershell "%rep_script%\MAIL\trt_mail.ps1"
    :Fin

    Voilà bon j'ai bien conscience que c'est pas propre du tout d'ailleurs le script me renvoi une erreur sur ma première ligne:
    C:\temp\testpel>´╗┐REM ****definition des variables****
    '´╗┐REM' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
    ça passe en mettant une remarque en première ligne mais si c'est une variable
    Bref...Si vous avez des remarques, je les prendrais bien évidement.

    Merci

    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Quelques remarques si je peux me permettre

    ´╗┐REM ****definition des variables****
    '´╗┐REM' n'est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.
    Un problème d'encodage de ton fichier surement, converti le en ANSI


    cd %rep_script%
    Si cette variable représente toujours le dossier de ton script tu peux utiliser %~dp0, elle sera alors dynamique.
    Il te donnera le chemin complet du dossier du script sans guillemet et avec un slash à la fin
    En l’occurrence : C:\temp\testpel\


    date /t
    %date% existe aussi comme pour %time%. Cela pourrais t’éviter de traiter le séparateur espace de la boucle for


    For /f "tokens=1-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
    For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)
    Tu peux aussi obtenir le résultat de cette façon (plus simple à mon sens) : set mydate=%date:~6%-%date:~,2%-%date:~3,2%
    Pareille pour TIME


    cd "C:\XFB.Monitor InterPel\run_time\etc\"
    Losque je souhaite me positionner dans un dossier (très rare), je préfère utiliser cd /D, ce paramètre te positionnera aussi sur le lecteur cible (au cas ou tu était sur D:\ par exemple ) et t'évitera des erreurs sur la suite de ton script


    for /f "skip=1 tokens=1,2,9 delims= " %%i IN ('"peldsp status_trans -ap %nature_appli%"') do (
    if %%j==DBPSEF move "%rep_reception%\%%k" "%rep_destination%"
    echo %%i %%j %%k >>%rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log
    )
    Indente ton code pour une meilleur lisibilité et compréhension


    if %%j==DBPSEF
    Lorsque tu fait cela il est toujours conseillé de "décorer" tes valeurs pour éviter des plantages du a des variables vides, exemple if "%%j"=="DBPSEF" ... ou if [%%j]==[DBPSEF] ...


    echo %%i %%j %%k
    De façon général utilise la substitution de références ~, pour éviter d'obtenir une valeur avec des guillemets


    if not exist %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log ...
    Quand tu nomme des nom de fichier ou dossier encadre les de guillements pour éviter des erreur lors de chemin comportant des espaces


    :Fin
    Tu peux t’affranchir de cette étiquette superflue
    goto /?

    ...
    La commande GOTO accepte maintenant l’étiquette cible :EOF, qui transfère le
    contrôle à la fin du fichier de commande en cours. C’est un moyen pratique de
    sortir d’un fichier de commande sans y définir de nom de sortie



    %rep_script%\reception_%nature_appli%_%mydate%_%mytime%.log
    Il serait préférable de créer une variable de travail (exemple : filelog) pour éviter la répétition de code (bonne pratique de programmation)

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ben franchement merci pour ce retour complet. Je regarderais tes propositions une par une.

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour j'ai suivi tes recommandations merci, ça donne ça
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    REM ****Version 15/05/2020****
    REM ****definition des variables****
    Set rep_destination=C:\temp\testpel\RECTRA2
    Set rep_reception=C:\temp\testpel\OLD
    Set rep_script=%~dp0
    Set nature_appli=TLCTRA2
     
    REM ****dossier du script via variable dynamique****
    cd %rep_script%
     
    REM **** Creation du Log avec horadatage ****
    For /f "tokens=1-4 delims=/ " %%d in ("%date%") do (
    	set date=%date:~6%-%date:~3,2%-%date:~,2%
    )
    For /f "tokens=1-2 delims=/:" %%t in ("%time%") do (
            set heure=%time:~0,2%_%time:~3,2%_%time:~6,2%
    )
    set heure=%heure: =0%
    set nomlog="reception_%nature_appli%_%date%_%heure%.log"
    set cheminlog="%rep_script%\%nomlog%"
    set archivelog="%rep_script%\archive_log_reception_%nature_appli%.7z"
     
    REM **** lancement du profil admin interpel ****
    cd /d "C:\XFB.Monitor InterPel\run_time\etc\"
    call "C:\XFB.Monitor InterPel\run_time\etc\profile.bat"
     
    REM **** redirection fichier en fonction de l'id protocolaire source ****
    echo TRAITEMENT AUTOMATIQUE %nature_appli% DU %date% %time%                                   >>"%cheminlog%"
    for /f "skip=1 tokens=1,2,9 delims= " %%i IN ('"peldsp status_trans -ap %nature_appli%"') do (
    	if "%%j"=="DBPSEF" move "%rep_reception%\%%k" "%rep_destination%"
    	echo %%i %%j %%k)                                                                                                     >>"%cheminlog%"
    )
    REM **** archivage et compression du fichier log ****
    if not exist "%cheminlog%" goto mail
    "C:\Program Files\7-Zip\7z.exe" a -t7z "%archivelog%" "%cheminlog%"
    del "%cheminlog%" 
    If not exist "%cheminlog%" goto:eof
    :mail
    REM **** Envoi mail si problème ****
    powershell "%rep_script%\MAIL\trt_mail.ps1"
    Exit

    Voilà en revanche je n'ai pas compris cette partie là tu aurais un exemple s'il te plaît?
    echo %%i %%j %%k
    De façon général utilise la substitution de références ~, pour éviter d'obtenir une valeur avec des guillemets
    J'essaye de faire propre mais pas facile la mise en forme sur un forum.

    Merci

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    -------------------------------------------------------------
    For /f "tokens=1-4 delims=/ " %%d in ("%date%") do (
    set date=%date:~6%-%date:~3,2%-%date:~,2%
    )
    Non, juste : set date=%date:~6%-%date:~3,2%-%date:~,2%

    -------------------------------------------------------------

    Voilà en revanche je n'ai pas compris cette partie là tu aurais un exemple s'il te plaît?
    Comme ceci pour les variables issues de la boucle for

    if "%%~j"=="DBPSEF" move
    ...
    echo %%~i %%~j %%~k


    -------------------------------------------------------------

    set nomlog="reception_%nature_appli%_%date%_%heure%.log"
    set cheminlog="%rep_script%\%nomlog%"
    set archivelog="%rep_script%\archive_log_reception_%nature_appli%.7z"
    Attention ! Ce n'est pas simple
    La variable nomlog aura déjà des guillemets qui seront inséré dans cheminlog
    Exemple :
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    set var1="c:\toto"
    set var2="%var1%\tata.txt"
    echo %var2%
     
    ""c:\toto"\tata.txt"
    Ce qu'il faut c'est qu'au moment ou tu souhaites utiliser ce chemin il y est "c:\toto\tata.txt"

    -------------------------------------------------------------

    goto:eof
    Utilise une syntaxe classique, je ne sais pas si c'est permis "collé" : https://windows.developpez.com/cours...page_25#LXXV-B
    goto :eof

    -------------------------------------------------------------

    echo TRAITEMENT AUTOMATIQUE %nature_appli% DU %date% %time% >>"%cheminlog%"
    Je pense que comme ceci tu aura les espaces de fin dans ton fichier de log :-/

    PS : Le fait de citer ta ligne supprime les espaces que je souhaites te montrer, retrouve la ligne dans ton script pour comprendre.

    -------------------------------------------------------------

    Set rep_destination=C:\temp\testpel\RECTRA2
    Set rep_reception=C:\temp\testpel\OLD
    Set rep_script=%~dp0
    Set nature_appli=TLCTRA2
    Il y a une façon de déclarer des variables qui peut t'éviter des problèmes avec des caractères spéciaux, ça m'est encore arrivé il n'y a pas longtemps.
    Exemple du problème avec le caractère spécial & :
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set var=tata & titi
    'titi' n’est pas reconnu en tant que commande interne
    ou externe, un programme exécutable ou un fichier de commandes.

    Il faut faire comme ceci :
    set "var=tata & titi"
    Il va stocker tata & titi dans var sans guillemet

    -------------------------------------------------------------

    Je pense qu'avec tout cela tu sera un vrai pro du batch si c'est points de détails t’intéresse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] Récupérer le résultat d'une requête pour la mettre dans une variable php
    Par Scrat1974 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 18/11/2019, 16h53
  2. Récupérer le résultat d'une commande scp
    Par vbcasimir dans le forum Linux
    Réponses: 19
    Dernier message: 20/05/2009, 16h14
  3. Réponses: 3
    Dernier message: 19/06/2007, 11h27
  4. Récupérer le résultat d'une commande shell
    Par espadon1 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 10h01
  5. Réponses: 2
    Dernier message: 02/01/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo