等同于Windows中的Unix eval

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

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

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

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

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

Solutions Collecting From Web of "等同于Windows中的Unix eval"

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

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

(做一些猜测你的问题的细节丢失)

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

现在,如果您有一个调用另一个批处理脚本的批处理脚本,有三种方法可以完成。

  1. 直接执行批处理文件:

     REM呼叫q.bat
     q.bat
     REM这条线永远不会运行
    

    通常你不需要这个,因为它不会返回到调用批处理脚本。 这更像gotogosub 。 CMD过程只是从一个脚本切换到另一个脚本。

  2. 执行call

     REM呼叫q.bat
    打电话q.bat
     REM改变q.bat影响将出现在这里。
    

    这是一个批处理文件调用另一个批处理文件最常用的方法。 当q.bat退出时,控制权将返回给调用者。 由于这是相同的CMD过程,对环境的改变仍然存在。

    注意:如果q.bat使用EXIT语句,则可能导致CMD进程终止,而不会将控制权返回给调用脚本。

    注2:如果q.bat使用EXIT /B ,则CMD进程不会退出。 这对于设置ERRORLEVEL很有用。

  3. 在新的CMD过程中执行:

     REM呼叫q.bat
     CMD / C q.bat
     REM环境在q.bat中的变化不会影响我
    

    由于q.bat运行一个新的CMD进程,它会影响该进程的环境,而不是调用者正在运行的CMD。

    注意:如果q.bat使用EXIT ,它不会终止调用者的进程。


SETLOCAL CMD命令将为当前脚本创建一个新的环境。 该环境中的更改不会影响调用者。 一般来说, SETLOCAL是一个很好的做法,可以避免意外泄漏的环境变化。

要使用SETLOCAL并仍将环境更改推送到调用脚本,请使用以下命令结束脚本:

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

这将把X和Y的值推到父环境。


另一方面,如果您希望运行另一个进程(而不是CMD脚本)并影响当前脚本的环境,则需要使该工具生成一个批处理文件,然后执行该批处理文件。

     REM q.exe将写入%TEMP%\ runme.cmd,如下所示:
     REM设定X = Y
     q.exe
    调用“%TEMP%\ runme.cmd”