gpt4 book ai didi

windows - 为什么从 PowerShell 运行的 Perl 脚本可以在新控制台中运行,而 Python 脚本却不能?

转载 作者:行者123 更新时间:2023-12-04 13:07:48 26 4
gpt4 key购买 nike

对于两个文件关联,.py.pl,我有一对 ftypeassoc这样我就可以运行 Perl 和 Python 脚本而无需明确指定它们各自的解释器可执行文件的路径,如下所示:

 C:\users\rene> .\abc.pl
C:\users\rene> .\xyz.py

当我在 PowerShell 控制台中执行“相同”操作时,执行 Perl 脚本会打开另一个执行它的控制台,但 Python 脚本会在同一控制台中执行。

因为 Perl 脚本在另一个控制台中运行,我面临两个问题:1) 我无法重定向脚本的 STDOUT 和 2) 脚本完成后控制台关闭,因此我看不到它的输出。

我不知道为什么 Python 脚本的行为与 Perl 脚本不同,我想知道我需要更改什么才能使 Perl 脚本在 PowerShell 中执行时在同一控制台中运行。

最佳答案

假设 .pl 文件扩展名与使用 console 应用程序对该文件执行 Open 动词的文件类型相关联输入(运行 ($fileTypeName = cmd/c assoc .pl) 以了解文件类型名称,然后 cmd/c ftype $fileTypeName 以查看其定义):

为了让 PowerShell 在当前控制台窗口中同步运行具有给定文件扩展名的文件(假设它们与控制台应用程序),该扩展名必须列在系统定义的 $env:PATHEXT 环境变量中,这令人惊讶 [1]

您可以将 .pl 添加到 $env:PATHEXT 中,如下所示:

  • 仅针对当前 session :

    $env:PATHEXT += ';.pl'
  • 坚持:

    • 必须从提升的 session (以管理员身份运行)运行,并且需要启动新 session 才能生效:

      [Environment]::SetEnvironmentVariable('PATHEXT',
      ([Environment]::GetEnvironmentVariable('PATHEXT', 'Machine') + ';.pl'),
      'Machine'
      )
    • 注意:有可能 - 尽管很少见且不可取 - 为该环境变量的持久用户级定义隐藏机器-level(所有用户)定义。如果您的用户帐户是这样,请将上面的 'Machine' 替换为 'User'


[1] 如您所说,$env:PATHEXT 环境变量的目的是列出隐式可执行的文件扩展名,这样,变量中存在.pl,执行.\abc.pl可以缩短为.\abc。这个方面在概念上与文件类型关联是分开的,文件类型关联允许定义哪些可执行文件将具有给定文件扩展名的非可执行文件传递给直接调用,并且可以说是 PowerShell 耦合这两个方面的错误;让 PowerShell 始终当前窗口中同步运行基于控制台的可执行文件会更有意义。

关于windows - 为什么从 PowerShell 运行的 Perl 脚本可以在新控制台中运行,而 Python 脚本却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68606397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com