我在Windows计算机上运行了xampp测试系统设置。
我有一个小命令行应用程序,我想用a触发 Perl CGI脚本。
我有一个使用Perl创建的表单。有许多复选框和输入框,用户可以在其中键入消息。
这是我到目前为止的代码。我不是任何方式的perl专家,所以那里 可能是这里没有意义的一些事情,或者是出于测试目的
#!"C:\xampp\perl\bin\perl.exe"
#print a standard 200 -level HTTP header
print "Content-Type:text/html\n\n";
print "<html><head><title>Broadcast Message</title></head>\n";
print "<body>\n";
#display form data
#&displayInfo();
print "</body></html>\n";
if ($ENV{REQUEST_METHOD} eq "GET")
{
&formDisplay();
exit;
}
#Else process and display back to screen
else
{
#&switches();
&parseform();
&displayInfo();
exit;
}
#This subroutine will display information without using the HTML document
sub formDisplay
{
print qq~
<FORM METHOD="POST" ACTION="/cgi-bin/broadcast.cgi">
<h3>Broadcast Message to Domain</h3>
***PLEASE NOTE*** This will broadcast a message to ALL machines in the Domain</br></br>
<TABLE cellpadding=0 cellspacing=1 border=0>
<TR>
<TD>Select your target by switch:             </br></TD>
<TD></TD>
<TD>Select your target by department: </br></TD>
</TR>
<TR>
<TD><input type=CHECKBOX name=517 value="517"> - 517 </br></TD>
<TD></TD>
<TD><input type=CHECKBOX name=ACC value="ACC"> - ACC </br></TD>
</TR>
<TR>
<TD><input type=CHECKBOX name=testfiletxt value="testfiletxt"> - testefiletxt </br></TD>
</TR>
</TABLE>
</br></br>
Please type the message you wish to broadcast to the Domain: </br>
<input name="message"></br>
<input type=SUBMIT name=Send value="Send">
<input type=RESET name=Reset value="Reset">
</form>
~;
}
#This subroutine will display information received from a form
sub displayInfo {
print "<b>Your Message:</b> </br> ", $form{"message"}, "</br>";
$system_message=$form{"message"};
#system "sent.exe /u:testmachine \"$system_message\"" ;
print qq~
<form>
<input type="button" value="Back" onclick="history.go(-1);return true;">
</form>
~;
# Working loop for form hash
delete $form{'Send'};
foreach(keys %form) {
print "$form{$_} </br>";
}
##############################
$textme=$form{"testfiletxt"};
open( FILE, "< $textme" ) or die "Can't open $filename : $!";
while( <FILE> ) {
chomp;
print "sent.exe $_ ", $form{"message"} , "</BR>";
}
close FILE;
}
sub parseform
{
#get data from environment variable
read STDIN,$qstring,$ENV{"CONTENT_LENGTH"};
#$qstring = $ENV{'QUERY_STRING'};
#break data up on ampersands, and store in array
@pairs = split(/&/, $qstring);
#start a loop to process form data
foreach (@pairs) {
#split field name and value on "=", store in two scalar variables
($key, $value) = split(/=/);
#translate '+' signs back to spaces
$value =~ tr/+/ /;
#translate special characters
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
#store data in hash
$form{$key} = $value;
}
}
我遇到的问题是处理已检查过的文本框。
我需要脚本做的是使用用户指定的参数(即复选框和输入框)运行命令行实用程序。
我认为这将如何运作如下:
我们预先构建了一些文本文件,其中包含我们网络中的Netbios names台计算机,每行一台计算机名称。这些文件将代表交换机,每个交换机文件将包含附加到它的计算机的Netbios名称。我们最终也会将其扩展为成组。
用户将转到此广播页面并选择他们希望广播的开关。因此,连接到特定交换机的任何计算机都将接收此广播消息。用户还将提供要广播的消息。
当用户点击“提交”时,有一些事情需要发生。
用户提供的netbiosName消息
然后,一旦完成。需要使用我们刚刚按以下格式编辑的文件运行命令行实用程序:
sent.exe /t:15 /f:$filename
因此,如果用户选择3个开关,则该命令应运行3次
sent.exe /t:15 /f:swtich1
sent.exe /t:15 /f:switch2
sent.exe /t:15 /f:switch3
我应该指出/f
“选项告诉sent.exe
命令使用需要以特定方式格式化的文件。
我一次处理一个选项取得了一些成功。
但是,当用户选择多个复选框时,我会遇到什么。
如何使用循环轻松处理选中的复选框?
我可以从&parseform
子程序中提取这个吗?或者有更简单的方法吗?
答案 0 :(得分:4)
使用CGI.pm:
my @checked = $cgi->param('department');
将为您提供名称为“department”的所有选中复选框。为此,您需要清理HTML:
<input type="checkbox" name="department" value="517"
id="department_517"><label for="department_517">517</label>
<input type="checkbox" name="department" value="ACC"
id="department_ACC"><label for="department_ACC">ACC</label>
<input type="checkbox" name="department" value="testfiletxt"
id="department_testfiletxt"><label
for="department_testfiletxt">testfile.txt</label>