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 :

Exécuter Excel en background (start-job) [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut Exécuter Excel en background (start-job)
    Bonjour à tous,

    Si quelqu'un pouvait me débloquer sur le sujet ça serait super.

    J'ai une fonction qui me permet de récupérer des infos d'un fichier excel et de me stocker le tout dans une variable, jusque là pas de souci.
    Par contre vu le nombre de fichiers excel à ouvrir, je me suis dit qu'il serait peut être bon de paralléliser le tout.

    Donc je me penche sur la commande Start-Job.

    Le problème vient du fait que ma commande Start-Job n'a pas l'air de vouloir exécuter mon code, le statut du job reste en Running, alors que c'est plutôt du rapide.

    Petit exemple qui ouvre un fichier excel et l'enregistre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ObjExcel = New-Object -ComObject Excel.Application -Property @{"visible"=$false};
    $ClasExcel = $ObjExcel.Workbooks.Add();
    $ClasExcel.SaveAs("D:\Temp\test.xls");
    $ObjExcel.Quit()
    Je me suis donc dit tout naturellement que passé directement dans un Start-Job cela devait fonctionner direct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Start-Job -ScriptBlock {$ObjExcel = New-Object -ComObject Excel.Application -Property @{"visible"=$false};$ClasExcel = $ObjExcel.Workbooks.Add();$ClasExcel.SaveAs("D:\Temp\test.xls");$ObjExcel.Quit()}
    Et bien non, du coup avec mes autres fonctions qui interrogent l'AD par exemple j'étais obligé de déclarer les "ressources" nécessaires pour faire appel à certains cmdlets, est-ce qu'ici c'est la même chose ? et si oui qui dois-je appeler

    J'espère vraiment que quelqu'un a déjà eu le problème et donc la solution
    Bien sûr je continue mes investigations et si je trouve, je partage.

    Bien à vous,
    Max

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par dj_max_69 Voir le message
    Et bien non, du coup avec mes autres fonctions qui interrogent l'AD par exemple j'étais obligé de déclarer les "ressources" nécessaires pour faire appel à certains cmdlets,
    C'est le comportement de base d'un job.
    Citation Envoyé par dj_max_69 Voir le message
    est-ce qu'ici c'est la même chose ?
    Non.
    De plus ton application est un objet COM, pas sûr qu'il soit dans le même model de thread, mais à priori pour l'instant cela ne pose pas de pb.
    Je viens tester sur Seven 64 et PS 64 sans pb, enfin 'juste' un, ton code ne libère pas correctement les ressources ce qui fait que le process XL reste actif. Si je lance + fois le job, j'ai autant de process que de job.

    Et enfin, il y a peut être un risque à ce que, bien que le job soit dans l'état 'completed', tous les ressource ne soient pas libérés. Mais c'est une hypothése que je n'ai pas étudié plus que ça .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    Salut Laurent,

    Pour le process actif je suis d'accord avec toi, mais mon code gère les ouvertures de process, je ne voulais pas surcharger le post ; je rajouterai que là où il faut faire "plus" attention, c'est au nombre de job lancés en parallèle pour ne pas surcharger la machine.

    En tout cas merci d'avoir soumis ta configuration, cela m'a interpelé sur plusieurs points :
    _ le fait que j'exécute mon code en remote sur une machine,
    _ la configuration de la machine (test en cours sur Win XP 32/64bits, Win 2003...)

    (Attention je vais réfléchir à voix haute)
    Rapidement j'ai l'impression que powershell ne communique pas de la même façon avec les objets COM avec les "nouveaux" systèmes Win 7 et Win 2008, quand on regarde la console des Services de composants, elle n'est pas hiérarchisée de la même façon que sous XP et 2003.
    Et bizarrement, ou heureusement c'est selon, le code tourne correctement sur les "nouveaux systèmes".

    Bref je continue de tester mes hypothèses et de ramer par la même

    PS : Je viens de voir que tu avais évoqué cette "limitation" dans un précédent post ([PowerShell] lancer un .ps1 en tâche de fond (équivalent de & linux) )

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    Salut tous,

    J'ai failli abandonner depuis le temps, mais après avoir lu tous les articles du web concernant powershell j'ai trouvé une solution qui n'est pas réellement pratique mais fonctionnelle.

    Elle consiste à appeler dans le start-job un powershell suivi de l'appel du script ou de la fonction.
    En gros ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Start-Job -ScriptBlock {powershell.exe -NoProfile -command { $ObjExcel = New-Object -ComObject Excel.Application -Property @{"visible"=$false};$ClasExcel = $ObjExcel.Workbooks.Add();$ClasExcel.SaveAs("D:\Temp\test.xls");$ObjExcel.Quit()} }
    ou avec les commandes enregistrées dans un .ps1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Start-Job -ScriptBlock {powershell.exe -NoProfile -command { c:\temp\excel.ps1 } }
    Merci à Google et à James (son lien avec sa réflexion et recherches) :
    http://powershellcommunity.org/Forum...3/Default.aspx

    Mais si quelqu'un à une solution plus simple encore, ça serai sympa de la partager, doit bien y avoir plus simple.

    Bonne continuation et au plaisir d'un prochain problème à partager.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas eu le temps d'approfondir le sujet, mais je me souviens aujourd'hui de ce post sur MsConnect :
    https://connect.microsoft.com/PowerShell/feedback/details/653706/job-on-xp-timed-out-waiting-for-a-program-to-execute



    Si tu peux essaie avec la v3 sous XP...

    Citation Envoyé par dj_max_69 Voir le message
    doit bien y avoir plus simple.
    Faut avoir le temps de débugger

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 17
    Par défaut
    [TROLL ON]

    Citation Envoyé par Laurent Dardenne Voir le message
    Faut avoir le temps de débugger
    Citation Envoyé par Laurent Dardenne Voir le message
    Je n'ai pas eu le temps d'approfondir
    [TROLL OFF]

    Il n'empêche que le temps que l'on gagne à coder avec PS est énorme comparé au vbs... qui a dit batch ? ^^
    Mais si j'ai un peu de temps je regarderai et mettrai le post à jour.

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

Discussions similaires

  1. [2008] Erreur d'exécution de lot dans un job
    Par zibou7 dans le forum SSIS
    Réponses: 2
    Dernier message: 21/02/2012, 14h13
  2. [XL-2010] Excel continue de s'exécuter en background après la fin de la macro qui le contrôle.
    Par sunlover dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/04/2011, 15h05
  3. Ouvrir un userform en exécutant Excel
    Par shanod dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/09/2009, 17h10
  4. Exécuter Script SQL dans les jobs Talend
    Par NTeeN dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 10/06/2009, 17h47
  5. Réponses: 0
    Dernier message: 28/11/2008, 13h46

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