2009-07-28 1 views
7

frage mich, wie Sie die folgenden in Windows tun würde:Entspricht Unix eval in Windows

Von ac Shell-Skript (Erweiterung csh), ich bin so ein Python-Skript in einem ‚eval‘ Methode ausgeführt wird, dass die Die Ausgabe des Skripts wirkt sich auf die Shell-Umgebung aus. Sieht wie folgt aus:

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

mich gefragt, wie ich so etwas wie die eval-Anweisung in Windows mit dem Windows' in CMD-Shell gebaut tun würde. Ich möchte ein Python-Skript in einem Windows-Skript ausführen und das Skript ausführen lassen, was das Python-Skript ausgibt.

** Update: angegebene Interesse an der CMD-Shell ausgeführt.

+0

Bitte geben Sie genau an, welche Shell Sie verwenden. CMD ist meine beste Vermutung, aber vielleicht meinst du PowerShell oder einen Windows-Port von CSH. –

Antwort

4

Wenn es in cmd.exe ist, eine temporäre Datei verwendet, ist die einzige Option, [die ich kenne]:

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

(machen einige Vermutungen, wo Details aus Ihrer Frage fehlen)

In CMD, Wenn ein Stapelskript die Umgebung ändert, besteht das Standardverhalten darin, dass es die Umgebung des CMD-Prozesses ändert, der es ausführt.

Wenn Sie jetzt über ein Stapelscript verfügen, das ein anderes Stapelscript aufruft, gibt es drei Möglichkeiten.

  1. die Batch-Datei direkt ausführen:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    Sie dies in der Regel nicht wollen, weil es an die aufrufende Batch-Skript nicht zurückkehren wird. Dies ist mehr wie goto als gosub. Der CMD-Prozess wechselt einfach von einem Skript zu einem anderen.

  2. ausführen mit call:

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    Dies ist die häufigste Art und Weise für eine Batch-Datei eines anderen zu nennen. Wenn q.bat beendet wird, kehrt die Steuerung zum Aufrufer zurück. Da dies derselbe CMD-Prozess ist, sind Änderungen an der Umgebung weiterhin vorhanden.

    Hinweis: Wenn q.bat die Anweisung EXIT verwendet, kann der CMD-Prozess abgebrochen werden, ohne dass die Steuerung an das aufrufende Skript zurückgegeben wird.


    Hinweis 2: Wenn q.batEXIT /B verwendet, wird der CMD-Prozess nicht beendet. Dies ist nützlich für die Einstellung ERRORLEVEL.

  3. Führen Sie in einem neuen CMD-Prozess:.

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    Seit q.bat Lauf einen neuen CMD-Prozess ins, wirkt sich die Umgebung dieses Prozesses und nicht das CMD, dass der Anrufer in läuft

    Hinweis : Wenn q.batEXIT verwendet, wird der Prozess des Aufrufers nicht beendet.


Der SETLOCAL CMD Befehl wird eine neue Umgebung für das aktuelle Skript erstellen. Änderungen in dieser Umgebung haben keine Auswirkungen auf den Aufrufer. Im Allgemeinen ist SETLOCAL eine gute Übung, um unkontrollierte Umgebungsänderungen zu vermeiden.

SETLOCAL nutzen zu können, und schieben noch Umwelt Änderungen an den anrufenden Skript, mit dem Skript beenden:

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

Dadurch werden die Werte von X und Y an die Mutter Umgebung schieben.


Wenn auf der anderen Seite Sie einen anderen Prozess ausgeführt werden soll (kein CMD-Skript) und haben es das aktuelle Skript Umwelt beeinflussen, als das Werkzeug eine Batch-Datei erzeugen, die die Änderungen macht Sie wollen, dann ausführen diese Batch-Datei.

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