使用系统的 Perl 调用突然开始失败

Geo*_*rge 4 windows perl spawn

本周,我的一个标准 perl [Strawberry perl 5,版本 32,为 MSWin32-x64-多线程构建的 subversion 1 (v5.32.1)] 脚本开始失败。我追踪到失败的反引号操作。

调查显示,所有系统类型调用(反引号、qx、pipe open)均失败。我尝试构建 perl 的调试版本,但即使这样也失败了,因为构建过程使用 miniperl,它也有同样的问题。

..\miniperl.exe -I..\lib ..\make_ext.pl "MAKE=nmake -nologo" --dir=..\cpan --dir=..\dist --dir=..\ext - -nonxs
无法生成“cmd.exe”:在 ..\make_ext.pl 第 580 行没有这样的文件或目录。
无法生成“cmd.exe”:在 ..\make_ext.pl 行没有这样的文件或目录582.
make(dist/if) 失败:code=65280,位于 ..\make_ext.pl 第 584 行。

我尝试定义 PERL5SHELL(cmd 的完整路径,用 pwsh 代替 cmd),关闭恶意软件防护,以及我能想到的所有恢复。

所以,真正的问题是:有人对我如何追踪这个问题有建议吗?它在周四工作,此后没有系统更新[操作系统版本 10.0.22000]。

小智 5

几周前我开始遇到同样的问题。我使用 ActiveState perl,所以我尝试安装 Strawberry perl,但遇到了与 Strawberry 相同的问题。我还看到零长度文件被创建。这种情况发生在多台机器上。一个是Winver 1909,另一个是21H2。解决方法是使用要运行的程序的完整路径。
您还可以在程序前面插入 cmd.exe 的完整路径。尝试这个:

$temp = `$ENV{COMSPEC} /c date /T`;
print "\$temp = $temp";
Run Code Online (Sandbox Code Playgroud)

我一直认为这是由于 W10 安全更新造成的,但我真的不知道原因。我将编写一个名为的子程序Backticks(),我可以这样使用:

print Backticks('date /T');
Run Code Online (Sandbox Code Playgroud)

Backticks会返回$ENV{COMSPEC} /c @_。这是一个 hack,但此时我不知道还能做什么。