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

Ren*_*ger 3 windows console powershell cmd io-redirection

对于文件关联.py.pl,我有一对ftype和 ,assoc这样我就可以运行 Perl 和 Python 脚本,而无需显式指定其各自解释器可执行文件的路径,如下所示:

 C:\users\rene> .\abc.pl
 C:\users\rene> .\xyz.py
Run Code Online (Sandbox Code Playgroud)

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

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

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

mkl*_*nt0 5

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

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

您可以.pl$env:PATHEXT如下方式添加:

  • 适用于当前会话:

    $env:PATHEXT += ';.pl'
    
    Run Code Online (Sandbox Code Playgroud)
  • 坚持不懈

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

      [Environment]::SetEnvironmentVariable('PATHEXT',
        ([Environment]::GetEnvironmentVariable('PATHEXT', 'Machine') + ';.pl'), 
        'Machine'
      )
      
      Run Code Online (Sandbox Code Playgroud)
    • 注意:此环境变量的持久用户级定义可能会影响机器(所有用户)定义,尽管这种情况很少见且不可取。如果您的用户帐户也是如此,请替换'Machine''User'上述内容。


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