相当于Windows中的Unix eval

时间:2009-07-28 17:17:50

标签: windows shell scripting

想知道如何在Windows中执行以下操作:

从c shell脚本(扩展名csh),我在'eval'方法中运行Python脚本,以便脚本的输出影响shell环境。看起来像这样:

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

想知道如何使用Windows内置的CMD shell在Windows中执行类似eval语句的操作。我想在Windows脚本中运行Python脚本,并让脚本运行Python脚本打印出来的内容。

** update:指定从CMD shell运行的兴趣。

2 个答案:

答案 0 :(得分:5)

如果它在cmd.exe中,使用临时文件是我所知道的唯一选项:

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

答案 1 :(得分:3)

(做出一些猜测,你的问题中缺少细节)

在CMD中,当批处理脚本修改环境时,默认行为是它修改正在执行它的CMD进程的环境。

现在,如果您有一个调用另一个批处理脚本的批处理脚本,则有3种方法可以执行此操作。

  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. 非常有用
  4. 在新的CMD流程中执行:

    REM call q.bat
    CMD /C q.bat
    REM environment changes in q.bat don't affect me
    
    由于q.bat运行新的CMD进程,它会影响该进程的环境,而不会影响调用程序运行的CMD。

    注意:如果q.bat使用EXIT,则不会终止来电者的处理。


  5. 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"