【问题标题】:Why does a Perl script that is run from PowerShell run in a new console, but a Python script does not?为什么从 PowerShell 运行的 Perl 脚本可以在新控制台中运行,而 Python 脚本却不能?
【发布时间】:2021-10-06 21:50:33
【问题描述】:

对于.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 中执行时在同一控制台中运行。

【问题讨论】:

    标签: windows powershell cmd console io-redirection


    【解决方案1】:

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

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

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

    • 仅限当前会话

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

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

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


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

    【讨论】:

    • 我一直认为PATHEXT唯一 目的是在cmd.exe 中启动一个没有文件扩展名的脚本(例如C:\Users\Rene> abc 用于名为@987654341 的脚本@ 当.bat 列在PATHEXT 中时)。 PowerShell 中 PATHEXT 的这个附加目的是否记录在某处?
    • @RenéNyffenegger,我怀疑这是一个错误,或者至少不是故意的——而且我不知道它被记录在某个地方;请参阅我刚刚添加的脚注。我鼓励你file a bug report
    • @RenéNyffenegger,已经有相关的_错误报告,特别是#9430,但没有一个完整描述问题的报告。
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2017-12-29
    • 2012-09-05
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多