【问题标题】:Equivalent to Unix eval in Windows相当于 Windows 中的 Unix eval
【发布时间】:2010-11-14 19:03:47
【问题描述】:

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

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

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

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

** 更新:有兴趣从 CMD shell 运行。

【问题讨论】:

  • 请具体说明您使用的是哪个外壳。 CMD 是我最好的猜测,但也许你的意思是 PowerShell 或 CSH 的 Windows 端口。

标签: windows shell scripting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    (对您的问题中缺少的细节进行一些猜测)

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

    现在,如果您有一个批处理脚本调用另一个批处理脚本,有 3 种方法可以做到。

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

      REM 调用 q.bat q.bat REM 这条线永远不会运行 通常你不想要这个,因为它不会返回到调用批处理脚本。这更像是goto 而不是gosub。 CMD 进程只是从一个脚本切换到另一个脚本。
    2. 使用call 执行:

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

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


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

      REM 调用 q.bat CMD /C q.bat q.bat 中的 REM 环境变化不会影响我 由于 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”

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2011-05-09
      • 2010-12-24
      • 2010-10-12
      • 2021-05-26
      相关资源
      最近更新 更多