2009-07-28 43 views
7
EVAL

想知道你會怎麼做在Windows中執行以下操作:相當於在Windows的Unix

從AC shell腳本(擴展名CSH),我跑了「的eval」方法中的Python腳本,以便腳本的輸出會影響shell環境。看起來像這樣:

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

想知道我該怎麼做像Windows中的eval語句使用Windows內置CMD外殼。我想在Windows腳本中運行Python腳本,並讓腳本運行Python腳本輸出的內容。

** update:指定從CMD shell運行的興趣。

+0

請具體說明您正在使用哪個外殼。 CMD是我最好的猜測,但也許你的意思是PowerShell或CSH的Windows端口。 – 2009-07-28 17:43:46

回答

4

[據我所知,如果它在cmd.exe,使用臨時文件是唯一的選擇:

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

(製作一些猜測其中的細節都從你的問題遺漏)

在CMD,當批處理腳本修改環境時,默認行爲是它修改正在執行它的CMD進程的環境。

現在,如果您有一個調用另一批處理腳本的批處理腳本,有三種方法可以實現。

  1. 直接執行的批處理文件:

     
    REM call q.bat 
    q.bat 
    REM this line never runs 
    
    通常你不希望這樣,因爲它不會返回到調用批處理腳本。這更像goto而不是gosub。 CMD過程只是從一個腳本切換到另一個腳本。

  2. 執行與call

     
    REM call q.bat 
    CALL q.bat 
    REM changes that q.bat affects will appear here. 
    
    這是一個批處理文件最常用的方法調用另一個。當q.bat退出時,控件將返回給調用者。由於這是相同的CMD過程,所以對環境的改變仍然存在。

    注意:如果q.bat使用EXIT語句,則可能會導致CMD進程終止,而不會將控制權返回給調用腳本。


    注2:如果q.bat使用EXIT /B,則CMD過程不會退出。這對於設置ERRORLEVEL很有用。

  3. 執行一個新的CMD過程:

     
    REM call q.bat 
    CMD /C q.bat 
    REM environment changes in q.bat don't affect me 
    
    由於q.bat運行INS新的CMD的過程,它會影響這一進程的環境,而不是CMD呼叫者在運行

    注:如果q.bat使用EXIT,則它不會終止呼叫者的進程。


SETLOCAL CMD命令將爲當前腳本的新環境。該環境中的更改不會影響調用者。一般來說,SETLOCAL是一個很好的做法,可以避免意外泄漏環境的變化。

要使用SETLOCAL仍然推動環境的變化,以調用腳本,結束腳本:

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

這將X和Y的值推到父環境。


如果在另一方面,你想運行其他程序(而不是CMD腳本),並讓它影響當前的腳本環境,不是讓工具生成一個批處理文件,讓你想更改,然後執行該批處理文件。

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