想知道你会怎么做下列Windows中:
从AC shell脚本(扩展名CSH),我是一个“EVAL”法内运行一个Python脚本,以便从脚本输出影响shell环境。 是这样的:
eval `python -c "import sys; run_my_code_here(); "`
想知道我怎么会做一些喜欢使用Windows自带的CMD外壳在Windows eval语句。 我想运行一个Windows脚本中的Python脚本,并有脚本运行Python脚本打印出的东西。
**更新:从CMD shell中运行指定的兴趣。
如果是在cmd.exe
,使用临时文件是唯一的选择[我知道]:
python -c "print(\"Hi\")" > temp.cmd
call temp.cmd
del temp.cmd
(从你的问题使一些猜测其中的细节缺失)
在CMD,当一个批处理脚本修改的环境中,默认的行为是修改正在执行它CMD进程的环境。
现在,如果你有一个批处理脚本调用另一个批处理脚本,有3种方式来做到这一点。
直接执行批处理文件:
REM通话q.bat q.bat REM该行从未运行
通常你不想要这个,因为它不会返回到调用批处理脚本。 这更像是goto
比gosub
。 在CMD过程只是从一个脚本切换到另一个。 与执行call
:
REM通话q.bat CALL q.bat REM改变了q.bat影响将在这里出现。
这是一个批处理文件调用另一个最常见的方式。 当q.bat
出口,控制将返回给调用者。 由于这是相同的CMD过程中,对环境的更改仍然会在那里。
注意:如果q.bat
使用EXIT
语句,它可以导致CMD进程终止,而无需返回控制给调用脚本。
注2:如果q.bat
使用EXIT /B
,那么CMD过程将不会退出。 这是用于设置有用ERRORLEVEL
。 在执行新的CMD过程:
REM通话q.bat CMD / C q.bat 在q.bat REM环境的变化不会影响我
由于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会写%TEMP%\ runme.cmd,它看起来像: REM集X = Y q.exe 所谓的 “%temp%\ runme.cmd”