gpt4 book ai didi

perl @ARGV 在命令行上工作,但在从另一个应用程序传递时不工作

转载 作者:行者123 更新时间:2023-12-05 07:58:20 27 4
gpt4 key购买 nike

我有一个 perl 脚本,现在可以从 Windows 命令行运行(安装了 ActivePerl)。它发送命令以打开/关闭电源 Controller (智能电源板)上的端口。我有它的设置,所以我接受了几个命令行参数。设备的 IP 地址,以及我想对该设备进行的电源操作。即 10.0.40.1 打开应该打开 IP 10.0.40.1 的设备,或者打开电源 Controller 中的相应端口。

我有一个 if elseif 语句,它将评估传递给脚本的 IP 地址并确定哪个电源 Controller 和哪个端口是合适的。唯一的其他操作是端口和操作连接,因此如果设备在 Controller 的端口 3 上并且传递的操作是“打开”,则新变量变为 3on。这是脚本的其余部分所理解的,作为新手,保持不变更容易。

问题:当我通过

从 Windows 运行此命令时

perl Lpower.pl 10.0.30.15 on

Lpower.pl 10.0.30.15 on

问题的关键在于允许另一个应用程序调用我的客户端上的脚本。另一个应用程序是一款网络管理软件。通过支持的自定义 GUI 扩展,我能够为每个被管理的设备向菜单添加项目。我有一个用于“开机”,另一个用于“关机”。我将它指向具有我客户端计算机本地路径的 Lpower 脚本,它被调用并运行,它也按预期传递参数,但我的 if 语句不起作用。它不会匹配任何 IP,也不会匹配操作“on”“off”。我不需要评估后者,我只是在他们的声明中进行测试。

我的脚本打印了变量,它们确实出现了,但是 if 语句不起作用。它似乎没有添加前导空格或任何东西。

这是相关部分的代码片段:

# $language = "PerlScript"
# $interface = "1.0"

#!c:\perl64\bin\perl -w -CA
...
print STDERR "UserUtil $version\n\n";
my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";

if ($onoff eq "off") {print "it matched off"}
if ($ipaddr eq "10.0.40.1") {
$epc='10.0.30.92';
$port='1';
}
elsif ($ipaddr eq "10.0.40.105") {
$epc='10.0.30.92';
$port='2';
}
elsif (($ipaddr eq "10.0.40.100") || ($ipaddr eq "10.0.40.101")) {
$epc='10.0.30.92';
$port='3';
}
...
else {print "no matches found"}
$oper="$port$onoff";
$base='http://'.$auth.'@'.$epc.'/';
print "$epc $oper $ipaddr";
cmd($oper) && die "Unknown Command $_\n";

里面有一些用于调试的打印语句。 CLI 的输出如下所示(它可以正常工作,端口按预期打开/关闭电源):

10.0.30.15 off
it matched off10.0.30.93 1off 10.0.30.15

从网络应用程序调用(在我的客户端上启动脚本)

10.0.30.15 on
Unknown Command
no matches found 10.0.30.15 off

为什么会有不同?我能做些什么来强制正确处理传递的参数?如果我没看错,它们应该是 UTF-8 编码的字符串,该应用程序是否会发送不同的内容,从而导致 if 语句中断?

还有一点。该应用程序直接调用脚本并传递参数,它不调用 perl 可执行文件,我的环境知道如何处理 pl 脚本。不确定这是否有所作为。

非常感谢任何帮助。我在遥远的背景中确实有一些编码,但从来没有用于职业,而且对 perl 来说是全新的。

最佳答案

脚本的相关部分

my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";
if ($ipaddr eq "10.0.40.1") { print "matched\n"; }
else {print "no matches found\n"}

运行它

perl power.pl 10.0.40.1 off

打印:

10.0.40.1 off
matched

运行它

perl power.pl "10.0.40.1 off"    #two words as one arg

打印

10.0.40.1 off 
no matches found

添加时

use strict;
use warnings;

my ($ipaddr, $onoff) = @ARGV;
print "$ipaddr $onoff\n";
if ($ipaddr eq "10.0.40.1") { print "matched\n"; }
else {print "no matches found\n"}

将打印:

Use of uninitialized value $onoff in concatenation (.) or string at power.pl line 5.
10.0.40.1 off
no matches found

关于perl @ARGV 在命令行上工作,但在从另一个应用程序传递时不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25029859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com