如何解决为什么从 PowerShell 运行的 Perl 脚本可以在新控制台中运行,而 Python 脚本却不能?
对于 .py
和 .pl
这两个文件关联,我有一对 ftype
和 assoc
,这样我就可以在不明确指定路径的情况下运行 Perl 和 Python 脚本到他们各自的解释器可执行文件,如下所示:
C:\users\rene> .\abc.pl
C:\users\rene> .\xyz.py
当我在 PowerShell 控制台中执行“相同”操作时,执行 Perl 脚本会打开另一个执行它的控制台,但 Python 脚本在同一个控制台中执行。
因为 Perl 脚本在另一个控制台中运行,我面临两个问题:1) 我无法重定向脚本的 STDOUT 和 2) 脚本完成后控制台关闭,因此我看不到它的输出。
我不知道为什么 Python 脚本的行为与 Perl 脚本不同,我想知道我需要更改什么才能使 Perl 脚本在 PowerShell 中执行时在同一控制台中运行。
解决方法
假设 .pl
文件扩展名与使用 控制台 应用程序对该文件类型执行 Open
动词的文件类型相关联(运行 {{1} } 了解文件类型名称,然后 ($fileTypeName = cmd /c assoc .pl)
查看其定义):
为了让 PowerShell 在当前控制台窗口中同步运行具有给定文件扩展名的文件(假设它们与控制台应用程序相关联),该扩展必须列在系统定义的 cmd /c ftype $fileTypeName
环境变量中,这令人惊讶。[1]
您可以将 $env:PATHEXT
添加到 .pl
,如下所示:
-
对于仅当前会话:
$env:PATHEXT
-
坚持:
-
必须从一个提升会话运行(以管理员身份运行),并且需要启动一个新会话才能生效:
$env:PATHEXT += ';.pl'
-
注意:有可能 - 尽管很少见且不可取 - 将此环境变量的持久用户级定义影子机器-level(所有用户)定义。如果您的用户帐户确实如此,请将上面的
[Environment]::SetEnvironmentVariable('PATHEXT',([Environment]::GetEnvironmentVariable('PATHEXT','Machine') + ';.pl'),'Machine' )
替换为'Machine'
。
-
[1] 正如您所说,'User'
环境变量的目的是列出隐式可执行的文件扩展名,这样,$env:PATHEXT
存在于变量中,执行 .pl
可以缩短为 .\abc.pl
。这方面与文件类型关联在概念上是分开的,文件类型关联允许定义什么可执行文件将具有给定文件扩展名的非可执行文件传递给直接调用,并且可以说 PowerShell 将这两个方面结合在一起是一个bug; PowerShell 始终在当前窗口中同步运行基于控制台的可执行文件会更有意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。