【问题标题】:How to check if perl is Windows command?如何检查perl是否是Windows命令?
【发布时间】:2016-10-20 19:24:50
【问题描述】:

我想编写一个批处理文件来静默安装 Perl MSI。但是,服务器/PC 可能安装了 Perl,批处理文件的流程是:

  1. 检查是否安装了 Perl。
  2. 如果未安装,请静默安装。

我知道如果安装了 Perl,perl-v 命令会报告 Perl 版本,但不知道如何通过 windows 批处理文件检查perl 命令是否可以在服务器/PC 上执行。

【问题讨论】:

  • “如果未安装,请静默安装” 我不太确定这样做,尤其是在没有Do you want to install Perl? 提示的情况下。在某些情况下,安装可能不合适,甚至可能已经安装了一个副本,或者在 PATH 上存在一个不同的文件名,例如 perl.5.24.0.exe。您应该让用户控制自己的 PC。
  • 未经用户同意安装程序不是好公民。病毒就是这样做的。不要成为病毒。

标签: perl batch-file cmd


【解决方案1】:

也许How do I get the application exit code from a Windows command line?Redirect Windows cmd stdout and stderr to a single file 可能会对您有所帮助。

运行

perl -e1 2>NUL
if errorlevel 1 (
    echo Perl is not installed
)

perl -e1 只是将 Perl 表达式 1 作为单行执行,如果安装了 Perl,这总是成功的。它根本不产生任何输出,除了在找不到 Perl 时它会抱怨。这就是我将 STDERR 重定向到 NUL 的原因,因此您将看不到任何输出,甚至看不到错误消息。

if errorlevel 1 检查最后一个命令(本例中为perl -e1)的返回码是否为>=1。如果 Perl 已安装且可执行,则其返回码将为 0(表示成功),if 不会触发。

你也可以使用perl -v,但是在STDOUT上产生输出。在这种情况下,您必须将 STDOUT 和 STDERR 都重定向到 NUL,如下所示:perl -v >NUL 2>&1

【讨论】:

  • 之所以有效,是因为“如果输入了不存在的命令执行,则设置ERRORLEVEL = 9009”。更多详情here
【解决方案2】:
>nul 2>nul where perl || echo not installed

这会在不尝试运行 perl 的情况下检查 perl。

如果在 %PATH% 中列出的文件夹中找到文件/命令,则打印到 STDOUT,如果没有,则打印到 STDERR。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2012-09-21
    • 2011-09-07
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多