想知道如何在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运行的兴趣。
答案 0 :(得分:5)
如果它在cmd.exe
中,使用临时文件是我所知道的唯一选项:
python -c "print(\"Hi\")" > temp.cmd
call temp.cmd
del temp.cmd
答案 1 :(得分:3)
(做出一些猜测,你的问题中缺少细节)
在CMD中,当批处理脚本修改环境时,默认行为是它修改正在执行它的CMD进程的环境。
现在,如果您有一个调用另一个批处理脚本的批处理脚本,则有3种方法可以执行此操作。
直接执行批处理文件:
REM call q.bat q.bat REM this line never runs通常您不希望这样,因为它不会返回到调用批处理脚本。这更像
goto
而不是gosub
。 CMD流程只是从一个脚本切换到另一个脚本。
使用call
执行:
REM call q.bat CALL q.bat REM changes that q.bat affects will appear here.这是一个批处理文件调用另一个批处理文件的最常用方法。当
q.bat
退出时,控件将返回给调用者。由于这是相同的CMD过程,因此环境的变化仍然存在。
q.bat
使用EXIT
语句,则可能导致CMD进程终止,而不会将控制权返回给调用脚本。q.bat
使用EXIT /B
,则CMD流程不会退出。这对于设置ERRORLEVEL
。
在新的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
,则不会终止来电者的处理。
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"