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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    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
    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 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Quel est réellement la "commande" ?

  3. #3
    Membre à l'essai
    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
    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 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    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
    Membre à l'essai
    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
    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 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    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)

+ 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