为什么来自 PowerShell 运行 的 运行 Perl 脚本会出现在新控制台中,而 Python 脚本却不会?

Why does a Perl script that is run from PowerShell run in a new console, but a Python script does not?

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

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

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

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

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

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

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

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

  • 仅限当前会话:

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

    • 必须 运行 来自 提升的 会话(运行 作为管理员),并且需要启动 新会话生效:

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


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