Windows 中与 Unix eval 类似的命令是什么?

17

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

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

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

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

** 更新:指定了在CMD shell中运行的兴趣。


请明确指出您正在使用哪个shell。CMD是我最好的猜测,但也许您指的是PowerShell或CSH的Windows端口。 - Jay Bazuzi
2个回答

13

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

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

3
(从您的问题中推测一些细节)
在CMD中,当批处理脚本修改环境变量时,默认行为是修改执行它的CMD进程的环境变量。
现在,如果你有一个批处理脚本调用另一个批处理脚本,有3种方法来做到这一点。
1. 直接执行批处理文件:
REM call q.bat q.bat REM 这一行永远不会运行
通常情况下,你不想使用这个方式,因为它不会返回到调用批处理脚本。这更像goto而不是gosub。CMD进程只是从一个脚本切换到另一个脚本。
2. 用call执行:
REM call q.bat CALL q.bat REM q.bat影响的更改将出现在此处。
这是一个批处理文件调用另一个批处理文件的最常见方式。当q.bat退出时,控制权将返回给调用者。由于这是相同的CMD进程,所以对环境的更改仍然存在。
注意:如果q.bat使用EXIT语句,它可以导致CMD进程终止,而不返回控制到调用脚本。
注意2:如果q.bat使用EXIT /B,则CMD进程不会退出。这对于设置ERRORLEVEL很有用。
3. 在新的CMD进程中执行:
REM call q.bat CMD /C 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 set X=Y q.exe call "%TEMP%\runme.cmd"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接