VC目录复制 perl

有时候从编译好的vc目录中复制源代码结构出来收工比较麻烦,学习了下perl,做了一个右键菜单~~

使用要求:


1. 安装perl
2. 修改 复制vc工程目录.reg 中的 bat所在的目录


CopyDir.pl:

#!/usr/bin/perl

require File::Copy;

package CopyDir;

use strict;

if ( @ARGV<2 ){
	print @ARGV;
	die "Usage: perl srcDir dstDir <filter>\r\n" . "Directory name must use '/' to replace '\\'";
} else {
	my $srcDir = @ARGV[0];
	my $dstDir = @ARGV[1];
	my $regExpFilter = @ARGV[2];
	
	%CopyDir::ignoredExtPattern = ();		# 忽略的后缀名
	
	$srcDir =~ s/\\/\//g;
	$dstDir =~ s/\\/\//g;
	
	print " srcDir=$srcDir\r\n dstDir=$dstDir\r\n regExpFilter=$regExpFilter\r\n";
	
	if ( $dstDir =~ /^$srcDir/i ) {
		# 有可能dstDir的相同的最后一个srcDir字符不是/
		if ( $srcDir =~ /\/$/ or $dstDir =~ /"^$srcDir\/"/i ) {
			die "ERROR: $srcDir equal or parent of $dstDir\r\n";
		}
	}
	
	if ( -e $dstDir ){
		my $dstDirTmp = $dstDir . "_Backup_" . int(rand(65535));
		rename($dstDir, $dstDirTmp) or die "ERROR: rename $dstDir->$dstDirTmp fail!\r\n$!";
		print "rename $dstDir -> $dstDirTmp\r\n";
	}
	
	mkdir($dstDir) or die "ERROR: make $dstDir fail!\r\n$!";
	print "mkdir $dstDir\r\n";
	
	my $copyCount = copyDir($srcDir, $dstDir, 1, $regExpFilter);
	
	my @keysForIgnoredExt = keys %CopyDir::ignoredExtPattern;
	my $keysForIgnoredExtCount = @keysForIgnoredExt;
	if ( @keysForIgnoredExt ) {
		print "Igored extension(s): $keysForIgnoredExtCount\r\n";
		for (keys %CopyDir::ignoredExtPattern){
			print "    $_ ==> $CopyDir::ignoredExtPattern{$_}\r\n";
		}
	}
	
	print "copied $copyCount file(s).\r\n";
}

sub copyDir{
	my $srcDir = shift(@_);
	my $dstDir = shift(@_);
	my $needCopyDir = shift(@_);
	my $regExpFilter = shift(@_);
	
	if ( !(-e $dstDir) ){
		if ( !mkdir($dstDir) ){
			print "ERROR: mkdir $dstDir fail! $!\r\n";
			return 0;
		} else {
			print "mkdir $dstDir\r\n";
		}
	} elsif ( !(-d $dstDir) ) {
		print "ERROR: $dstDir is not directory!\r\n";
		return 0;
	}
	
	my $copyCount = 0;
	
	if ( opendir (my $SRCDIRHANDLE, $srcDir) ){
		print "enter $srcDir\r\n";
		
		while ( readdir($SRCDIRHANDLE) ){
			my $curFile = $_;
			if ( $curFile eq "." || $curFile eq ".."){
				next;
			}
			
			my $srcFileName = "$srcDir/$curFile";
			my $dstFileName = "$dstDir/$curFile";
			if ( -d $srcFileName ){
				if ( $needCopyDir ){
					my $curCount = copyDir($srcFileName, $dstFileName, $needCopyDir, $regExpFilter);
					if ( $curCount==0 ){
						print "==> $dstFileName ... IGNORE\r\n";
						rmdir($dstFileName);
					}
					$copyCount += $curCount;
				}
				next;
			}
			elsif ( -f $srcFileName ){
				#`copy $srcFileName $dstFileName`;
				my $cmdString = "copy $srcFileName --> $dstFileName";
				
				if ( defined($regExpFilter) ){
					if ( $curFile !~ /$regExpFilter/i ){
						print "--> $dstFileName ... IGNORE\r\n";
						$curFile =~ /^(.+)\.(.+)$/;
						if ( $2 ){
							$CopyDir::ignoredExtPattern{$2} += 1;
						}
						next;
					}
				}
				
				if ( !File::Copy::copy($srcFileName, $dstFileName) ) {
					print "--> $dstFileName ... FAIL\r\n";
				} else {
					print "--> $dstFileName ... OK\r\n";
					++$copyCount;
				}
			}
		}
		
		closedir($SRCDIRHANDLE);
		
		print "exit $srcDir\r\n";
	}
	else{
		print "ERROR: opendir $srcDir fail! $!\r\n";
		return 0;
	}
	
	return $copyCount;
}

copyVCDirShell.bat:

@echo off

if '%1'=='' goto PARAMERR

%~d0
cd "%~dp0"

perl CopyDir.pl %1 %1_copyVCDir "\.h$|\.cpp$|\.c$|\.rc$|\.rc2$|\.vcproj$|\.sln$|\.ico$|\.dsp$|\.dsw$|\.bmp$|\.png$"
goto EXIT

:PARAMERR
echo Usage: copyVCDir sourceDir destinationDir

:EXIT
pause

复制vc工程目录.reg:

Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\CopyVCDir] 
@="Copy VC Project Directory"
 
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\CopyVCDir\command] 
@="cmd.exe /c \"TITLE Copy VC Project Directory %1 && COLOR 9A && d:\perl\copyVCDirShell.bat \"%1\" \" "


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值