2009-07-28 7 views
7

je me demandais comment vous effectuer les opérations suivantes dans Windows:équivalent à eval Unix dans Windows

partir d'un script shell ac (extension HCS), je suis en cours d'exécution d'un script Python dans une méthode « eval » de sorte que la La sortie du script affecte l'environnement shell. On dirait ceci:

eval `python -c "import sys; run_my_code_here(); "` 

Je me demandais comment je ferais quelque chose comme la déclaration eval dans Windows en utilisant Windows' construit en shell CMD. Je veux exécuter un script Python dans un script Windows et faire exécuter par le script ce que le script Python imprime.

** mise à jour: intérêt spécifié pour l'exécution à partir du shell CMD.

+0

Veuillez préciser la coque que vous utilisez. CMD est ma meilleure estimation, mais peut-être que vous voulez dire PowerShell ou un port Windows de CSH. –

Répondre

4

Si elle est en cmd.exe, en utilisant un fichier temporaire est la seule option [que je ne connais]:

python -c "print(\"Hi\")" > temp.cmd 
call temp.cmd 
del temp.cmd 
3

(Faire quelques suppositions où les détails sont absents de votre question)

Dans CMD, Lorsqu'un script batch modifie l'environnement, le comportement par défaut est qu'il modifie l'environnement du processus CMD qui l'exécute. Maintenant, si vous avez un script de traitement par lots qui appelle un autre script de traitement par lots, il y a 3 façons de le faire.

  1. exécuter le fichier batch directement:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Habituellement vous ne voulez pas, car il ne reviendra pas au script batch d'appel. C'est plus comme goto que gosub. Le processus CMD passe juste d'un script à l'autre.

  2. avec execute call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    C'est la façon la plus courante pour un fichier batch pour appeler un autre. Lorsque q.bat se termine, le contrôle revient à l'appelant. Comme il s'agit du même processus CMD, les modifications apportées à l'environnement seront toujours présentes.

    Remarque: Si q.bat utilise l'instruction EXIT, le processus CMD peut s'arrêter, sans que le contrôle du script appelant ne soit renvoyé.


    Remarque 2: Si q.bat utilise EXIT /B, le processus CMD ne se terminera pas. Ceci est utile pour définir ERRORLEVEL.

  3. Exécuter dans un nouveau processus CMD.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Depuis run q.bat ins un nouveau processus CMD, il affecte l'environnement de ce processus, et non le CMD que l'appelant est en cours d'exécution dans

    Remarque : Si q.bat utilise EXIT, il ne mettra pas fin au processus de l'appelant.


La SETLOCAL commande CMD va créer un nouvel environnement pour le script en cours. Les modifications dans cet environnement n'affecteront pas l'appelant. En général, SETLOCAL est une bonne pratique, pour éviter les fuites d'environnement par accident.

Pour utiliser SETLOCAL et encore pousser des changements d'environnement au script appelant, mettre fin au script avec:

 
    ENDLOCAL && SET X=%X% && SET Y=%Y% 

Cela va pousser les valeurs de X et Y à l'environnement parent.


Si d'autre part vous voulez exécuter un autre processus (pas un script CMD) et avoir une incidence sur l'environnement du script actuel, que d'avoir l'outil génère un fichier de commandes qui rend les changements que vous voulez, puis exécutez ce fichier batch.

 
    REM q.exe will write %TEMP%\runme.cmd, which looks like: 
    REM  set X=Y 
    q.exe 
    call "%TEMP%\runme.cmd"