2009-07-28 13 views
7

chiedevo come si farebbe quanto segue in Windows:Equivalente a eval Unix in Windows

Da script di shell ac (estensione csh), sto correndo uno script Python all'interno di un metodo 'eval' in modo che il l'output dallo script influenza l'ambiente shell. Appare come questa

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

chiedevo come avrei fatto qualcosa di simile alla dichiarazione eval in Windows utilizzando Windows' costruito in guscio CMD. Voglio eseguire uno script Python all'interno di uno script di Windows e fare in modo che lo script esegua ciò che lo script Python stampa.

** aggiornamento: interesse specificato nell'esecuzione dalla shell CMD.

+0

Si prega di essere precisi su quale shell si sta utilizzando. CMD è la mia ipotesi migliore, ma forse intendi PowerShell o una porta Windows di CSH. –

risposta

4

Se è in cmd.exe, utilizzando un file temporaneo è l'unica opzione [che conosco]:

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

(Fare alcune ipotesi in cui i dettagli sono mancanti dalla tua domanda)

In CMD, quando uno script batch modifica l'ambiente, il comportamento predefinito è che modifica l'ambiente del processo CMD che lo sta eseguendo.

Ora, se si dispone di uno script batch che chiama un altro script batch, ci sono 3 modi per farlo.

  1. eseguire il file batch direttamente:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Di solito non si vuole questo, perché non tornerà allo script chiamante batch. Questo è più simile a goto rispetto a gosub. Il processo CMD passa semplicemente da uno script all'altro.

  2. eseguire con call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    Questo è il modo più comune per un file batch per chiamare un altro. Quando si chiude q.bat, il controllo tornerà al chiamante. Poiché questo è lo stesso processo CMD, le modifiche all'ambiente saranno ancora presenti.

    Nota: se q.bat utilizza l'istruzione EXIT, può causare la chiusura del processo CMD, senza restituire il controllo allo script chiamante.


    Nota 2: Se q.bat utilizza EXIT /B, il processo CMD non verrà chiuso. Questo è utile per impostare ERRORLEVEL.

  3. Esegui in un nuovo processo CMD:.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Dal corsa Q.bat ins un nuovo processo CMD, colpisce l'ambiente di quel processo, e non il CMD che il chiamante è in esecuzione in

    Nota : Se q.bat utilizza EXIT, non interromperà il processo del chiamante.


Il comando CMD SETLOCAL creerà un nuovo ambiente per lo script corrente. Le modifiche in quell'ambiente non influiranno sul chiamante. In generale, SETLOCAL è una buona pratica, per evitare perdite di ambiente in caso di incidente.

Per utilizzare SETLOCAL ed ancora spingere cambiamenti dell'ambiente allo script chiamante, terminare lo script con:

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

Questo spingerà i valori di X e Y per l'ambiente genitore.


Se d'altra parte si desidera eseguire un altro processo (non uno script CMD) e lo hanno influenzare l'ambiente dello script corrente, piuttosto che avere lo strumento genera un file batch che rende le modifiche desiderate, quindi eseguire quel file batch.

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

Problemi correlati