`

perl脚本调用练习和调用系统命令并展示输出信息

阅读更多
准备好一个简单的perl脚本文件
把在windows下使用命令行方式查看系统进程信息输出到一个日志文件中

这里简单编写一个perl脚本文件test.pl,内容如下
#!/usr/bin/perl
#作用:在指定目录下生成日志文件,同时每隔1秒输出一次信息,执行到40次后退出

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
$year+=1900; 
$mday = ($mday < 10)? "0$mday":$mday;
$mon  = ($mon < 9)? "0".($mon+1):($mon+1);
$hour = ($hour < 10)? "0$hour":$hour;
$min = ($min < 10)? "0$min":$min;
$sec = ($sec < 10)? "0$sec":$sec;
open(STDOUT, "> C:\\perltest\\testperl${year}${mon}${mday}_${hour}${min}${sec}.LOG");

if( $#ARGV < 0 ){
	print "没有输入参数,请重新输入参数,程序退出\n";
}else{
	$i=0;
	
	while (1) {
		if($i==40){
			last;
		}
		print "i = $i \n";
		sleep(1);
		$i++
	}
}
exit;


编写java程序调用,同时也输出命令行任务下的进程信息
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PerlMutilProcessTest {
	
	private static Logger logger = LoggerFactory.getLogger(PerlMutilProcessTest.class);
	
	public static void  asyncExecutePerl(String perlFullFileName,String [] perlParameters)throws IOException{
		Runtime   objRunTime   =   Runtime.getRuntime();
		String[]  perlParam = null;
		if(perlParameters!=null && perlParameters.length > 0){
			perlParam =new String[perlParameters.length+2];
			perlParam[0]="perl";
			perlParam[1]=perlFullFileName;
			for(int i=0;i<perlParameters.length;i++){
				perlParam[i+2]=perlParameters[i];
			}
		}else{
			perlParam =new String[2];
			perlParam[0]="perl";
			perlParam[1]=perlFullFileName;
		}
		StringBuffer perlCmdStr = new StringBuffer();
		for(int j=0;j<perlParam.length;j++){
			logger.debug("NO. {} perl argument {}",j, perlParam[j]);
			perlCmdStr.append(perlParam[j]).append(" ");
		}
		logger.debug("start exec");
		logger.debug(perlCmdStr.toString());
		objRunTime.exec(perlCmdStr.toString());
		logger.debug("end exec");
	}
	
	public static void  syncExecutePerl(String perlFullFileName,String [] perlParameters,String outputInfoFileName,String outputErrorFileName)throws IOException,InterruptedException{
		Runtime   objRunTime   =   Runtime.getRuntime();
		String[]  perlParam = null;
		if(perlParameters!=null && perlParameters.length > 0){
			perlParam =new String[perlParameters.length+2];
			perlParam[0]="perl";
			perlParam[1]=perlFullFileName;
			for(int i=0;i<perlParameters.length;i++){
				perlParam[i+2]=perlParameters[i];
			}
		}else{
			perlParam =new String[2];
			perlParam[0]="perl";
			perlParam[1]=perlFullFileName;
		}
		StringBuffer perlCmdStr = new StringBuffer();
		for(int j=0;j<perlParam.length;j++){
			logger.debug("NO. {} perl argument {}",j, perlParam[j]);
			perlCmdStr.append(perlParam[j]).append(" ");
		}
		logger.debug("start exec");
		logger.debug(perlCmdStr.toString());
		Process perlProcess = objRunTime.exec(perlCmdStr.toString());
		FileOutputStream redirectOutputFile = null;
		FileOutputStream errorOutputFile = null;
		InputStream errorInputStream = null;
		InputStream infoInputStream = null;
        try{
        	errorOutputFile = new FileOutputStream(outputErrorFileName);
        	redirectOutputFile = new FileOutputStream(outputInfoFileName);
        	errorInputStream = perlProcess.getErrorStream();
        	infoInputStream = perlProcess.getInputStream();
        	ProcessInfo errorPerlProcessInfo = new ProcessInfo(errorInputStream,ProcessInfo.TYPE_ERROR,errorOutputFile);
        	ProcessInfo outputPerlProcessInfo = new ProcessInfo(infoInputStream,ProcessInfo.TYPE_OUTPUT, redirectOutputFile);
	        errorPerlProcessInfo.redirect();
	        outputPerlProcessInfo.redirect();
	        int exitVal = perlProcess.waitFor();
	        logger.debug("ExitValue: " + exitVal);
	        errorOutputFile.flush();
	        redirectOutputFile.flush();
		}catch(IOException ioe){
			if(redirectOutputFile!=null){
				redirectOutputFile.close();
			}
			if(errorOutputFile!=null){
				errorOutputFile.close();
			}
			if(errorInputStream!=null){
				errorInputStream.close();
			}
			if(infoInputStream!=null){
				infoInputStream.close();
			}
	        throw ioe;
		}catch(InterruptedException ie){
			if(redirectOutputFile!=null){
				redirectOutputFile.close();
			}
			if(errorOutputFile!=null){
				errorOutputFile.close();
			}
			if(errorInputStream!=null){
				errorInputStream.close();
			}
			if(infoInputStream!=null){
				infoInputStream.close();
			}
	        throw ie;
		}finally{
			if(redirectOutputFile!=null){
				redirectOutputFile.close();
			}
			if(errorOutputFile!=null){
				errorOutputFile.close();
			}
			if(errorInputStream!=null){
				errorInputStream.close();
			}
			if(infoInputStream!=null){
				infoInputStream.close();
			}
		}
		logger.debug("end exec");
	}
	
	public static void syncExecuteSyscmd(String[] syscmdParameters,String outputInfoFileName)throws IOException,InterruptedException{
		if(syscmdParameters==null||syscmdParameters.length==0){
			return;
		}
		StringBuffer syscmdStr = new StringBuffer();
		for(int j=0;j<syscmdParameters.length;j++){
			logger.debug("NO. {} syscmd argument {}",j, syscmdParameters[j]);
			syscmdStr.append(syscmdParameters[j]).append(" ");
		}
		logger.debug("start exec");
		logger.debug(syscmdStr.toString());
		Process syscmdProcess = Runtime.getRuntime().exec(syscmdStr.toString());
		FileOutputStream redirectOutputFile = null;
		InputStream infoInputStream = null;
	        try{
	        	infoInputStream = syscmdProcess.getInputStream();
	        	redirectOutputFile = new FileOutputStream(outputInfoFileName);
	        	int bufferLen = 10*1024;
	        	byte[] byteBuffer = new byte[bufferLen];
	        	int readLen = infoInputStream.read(byteBuffer);
				while (readLen != -1) {
					if(readLen==bufferLen){
						redirectOutputFile.write(byteBuffer);
					}else{
						redirectOutputFile.write(byteBuffer,0,readLen);
					}
					readLen = infoInputStream.read(byteBuffer);
				}
			}catch(IOException ioe){
				if(redirectOutputFile!=null){
					redirectOutputFile.close();
				}
				if(infoInputStream!=null){
					infoInputStream.close();
				}
		        throw ioe;
			}finally{
				if(redirectOutputFile!=null){
					redirectOutputFile.close();
				}
				if(infoInputStream!=null){
					infoInputStream.close();
				}
			}
			logger.debug("end exec");
	}
	
	public static void main(String[] args){
		try{
			DateFormat yyyyMMDDhhmmss = new SimpleDateFormat("yyyyMMdd_HHmmSSS");
			//PerlMutilProcessTest.asyncExecutePerl("C:\\perltest\\test.pl", null);
			//PerlMutilProcessTest.syncExecutePerl("C:\\perltest\\test.pl",null,"C:\\perltest\\perlresult"+yyyyMMDDhhmmss.format(new Date())+".txt","C:\\perltest\\perlerror"+yyyyMMDDhhmmss.format(new Date())+".txt");
			//PerlMutilProcessTest.asyncExecutePerl("C:\\perltest\\test.pl", new String[]{"123"});
			//PerlMutilProcessTest.syncExecutePerl("C:\\perltest\\test.pl",new String[]{"123"},"C:\\perltest\\perlresult"+yyyyMMDDhhmmss.format(new Date())+".txt","C:\\perltest\\perlerror"+yyyyMMDDhhmmss.format(new Date())+".txt");
			PerlMutilProcessTest.syncExecuteSyscmd(new String[]{"cmd","/c","tasklist","/v"}, "C:\\perltest\\syscmdresult"+yyyyMMDDhhmmss.format(new Date())+".txt");
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

class ProcessInfo{
	
	private static Logger logger = LoggerFactory.getLogger(ProcessInfo.class);
	public static String TYPE_ERROR = "ERROR";
	public static String TYPE_OUTPUT = "OUTPUT";
	
	private InputStream is;
	private String type;
	private OutputStream os;
	
	public ProcessInfo(InputStream is, String type, OutputStream redirect){
	    this.is = is;
	    this.type = type;
	    this.os = redirect;
    }
	
    public void redirect(){
    	PrintWriter pWriter = null;
    	InputStreamReader isReader = null;
    		BufferedReader bReader = null;
    	try{
		    
		    if (os != null && ProcessInfo.TYPE_OUTPUT.equals(this.type)){
		    	pWriter = new PrintWriter(os);
		    }
		    isReader = new InputStreamReader(is);
		    bReader = new BufferedReader(isReader);
		    String line = null;
		    while ( (line = bReader.readLine()) != null){
		    	if (pWriter != null){
		    		pWriter.println(line);
		    	}
		    }
		    if (pWriter != null)
		    	pWriter.flush();
	    } catch (IOException ioe){
	    	try{
		    	if(isReader!=null){
		    		isReader.close();
				}
		    	if(bReader!=null){
		    		bReader.close();
				}
		    	if(pWriter!=null){
		    		pWriter.close();
				}
	    	}catch (IOException tryioe){
	    		logger.error("输出流出现错误,关闭流时出现异常...", tryioe);
			}
	    	logger.error("输出流出现错误...", ioe);
	    }
    }
}

分享到:
评论

相关推荐

    C调用perl脚本程序

    接下来,我们将展示一个示例C程序,该程序可以用来调用一个Perl脚本并传递参数给它。 ```c #include #include &lt;perl.h&gt; int main() { // 定义Perl解释器指针 static PerlInterpreter *my_perl; // 为解释器...

    VB运行perl脚本工具

    总之,VB运行Perl脚本工具是通过VB调用Perl解释器实现的,这种技术让VB开发者可以利用Perl的强大力量,特别是在处理文本、网络和系统任务时。"smalltool"可能是一个简单的实现示例,帮助初学者理解和实践这一技术。...

    Perl程序如何调用C代码

    它的主要作用是定义 C 函数如何被 Perl 脚本调用,以及在两者之间如何传递参数和返回结果。XS 语言的核心组件是 XS 接口描述文件,这些文件通常以 .xs 为后缀。 XS 语言的主要特性包括: 1. **参数处理**:XS 负责...

    perl函数调用:怎样从Perl中调用C库里的函

    Perl作为一种高级脚本语言,拥有强大的文本处理能力以及灵活的语法特性,但在某些特定场景下,如高性能计算或系统级操作时,C语言由于其直接的硬件访问能力和更高的运行效率,可能成为更优的选择。因此,了解如何在...

    在Java中运行Perl脚本 JERL

    由于Perl脚本可能会抛出异常,因此在Java中调用Perl代码时,需要捕获并处理`jerl.JerlException`。此外,需要注意Perl脚本中的错误输出,可以通过`perl.getErrorStream()`获取。 **性能与资源管理** 虽然JERL提供了...

    perl脚本了解及学习

    ### Perl脚本了解及学习 #### 一、Perl基础概览 **Perl**是一种功能强大的通用编程语言,因其灵活性和适应性而在多个行业中得到广泛应用。无论是处理文本、网络编程还是系统管理,Perl都能轻松胜任。它特别适用于...

    java调用perl脚本并压缩zip

    这个教程就是关于如何使用Java调用Perl脚本来生成Excel文件,然后将生成的文件压缩为ZIP格式,同时解决可能出现的乱码问题。这里我们将深入探讨这两个关键步骤。 首先,让我们来看看Java调用Perl脚本的部分。在Java...

    MTK主要Perl脚本的介绍

    在源码版本控制方面,Perl脚本如`update_version.pl` 可能用于管理版本号和修订信息,确保每次提交时版本信息的正确性。此外,它们还能与Git或SVN等版本控制系统交互,自动化代码拉取和合并过程。 七、脚本框架 ...

    在Genesis中使用Perl的配置.doc

    - **步骤**: 使用Csh脚本调用Perl脚本。 - **说明**: 如果在Windows环境下使用Cygwin或类似的Unix-like环境,可以通过Csh脚本来调用Perl脚本。 - **示例**: - 创建一个名为`call_example.csh`的文件。 - 内容如下...

    Perl2Py:我写了一对简短的脚本,这些脚本使用'subprocess'从Python内部调用perl脚本。 接受可选的输入参数,然后通过管道传输STDIN和STDOUT来运行perl脚本。 数据从perl转换为JSON,然后从JSON转换为python

    本文将探讨一种技术,即如何使用Python通过'subprocess'模块调用Perl脚本,并进行数据交换。这个过程涉及到Perl与Python之间的通信,以及JSON作为数据交换格式的角色。 标题中的"Perl2Py"是一个示例项目,它展示了...

    ERL脚本打包教程(PERL源代码封装EXE过程).rar

    3. **perlapp命令使用**:通过命令行使用perlapp来编译Perl脚本。基本命令格式可能是`perlapp -o output.exe input.pl`,其中`input.pl`是你的Perl脚本,`output.exe`是你想要生成的可执行文件名。 4. **参数和选项*...

    使 .NET 支持Perl脚本语言3932815.zip

    标题 "使 .NET 支持Perl脚本语言3932815.zip" 暗示了这个压缩包可能包含一个解决方案或组件,使得 .NET Framework 能够理解和执行 Perl 脚本语言。在 .NET 开发环境中,通常我们使用 C# 或其他.NET 兼容的语言编写...

    perl替换脚本(用于替换文本文件中的单词)

    接下来,我们来看`replace.bat`批处理文件,它可能是用来调用Perl解释器执行Perl脚本的。批处理文件通常包含命令行指令,例如: ```cmd perl replace_script.pl config_file.txt target_directory ``` 这里,`...

    在VB中如何调用perl代码.rar

    1. **使用系统命令执行Perl脚本**: - VB中可以使用`Shell`函数来执行系统命令。例如,你可以创建一个按钮,在点击按钮的事件处理程序中写入如下代码: ```vb Private Sub Command1_Click() Shell "perl C:\path...

    在VB中如何调用perl代码.pdf

    ### 在VB中调用Perl代码的方法与技巧 随着软件开发技术的发展,不同编程语言之间的交互变得...通过以上步骤,您可以在VB应用程序中灵活地使用Perl脚本来处理特定任务,从而提高开发效率并简化复杂的业务逻辑处理过程。

    perl脚本大全

    Perl还支持模块系统,允许开发者导入和使用外部功能库,如CPAN(Comprehensive Perl Archive Network)提供了成千上万的预编译模块,涵盖了从网络编程到数据库连接的各种功能。例如,要使用LWP::UserAgent模块进行...

    中文奥宝gensis脚本培训-Perl

    - 提供了调试Perl脚本的基本方法和远程调试的技术。 12. 练习题: - 文档中穿插了练习题,用于加深理解,并在附录中提供部分答案供参考。 13. 版权和免责声明: - 强调了此书的版权属于奥宝公司,译本仅供个人...

    Perl脚本提取掉话问题的掉话原因

    Perl脚本在IT行业中常被用来处理和解析各种日志数据,特别是在通信和网络领域,其强大的文本处理能力使得它成为解决复杂问题的利器。在本案例中,我们关注的是"Perl脚本提取掉话问题的掉话原因",这涉及到的是对通信...

    perl脚本.docx

    Perl是一种高级的、通用的编程语言,它具有强大的文本处理能力,通常用于系统管理、网络编程、Web开发和更多领域。Perl脚本以`.pl`作为文件扩展名,以下是Perl脚本的一个基本示例: ```perl #!/usr/bin/perl # 这是...

Global site tag (gtag.js) - Google Analytics