2011-05-09 4 views
0

필자의 Perl 스크립트는 긴 프린터 공유 이름을 허용하기 위해 변경해야합니다. 이 스크립트는 짧은 프린터 공유 이름에 잘 작동합니다.하나의 인쇄 서버에서 다른 프린터로 프린터를 다시 매핑하는 Perl 스크립트

#this script will not migrate novaPDF pritter 
my @printers; 
my %PQ2; 
my %PQ; 
my @NewPQ; 
my $NewServer = "MTAPQ10"; 
my $OldServer = "MTAPQ5"; 

#Retrive print queues info from the new network print server 
print "Generating a printer list on $NewServer..\n"; 
@NewPQ = `net view $NewServer`; 


#Create a required TEMP folder on C: 
system("md C:\\TEMP") if(not (-e "C:\\TEMP")); 

#Create a VBScripts to enumerate network printer connections 
open(OUTFILE,">C:\\TEMP\\EnumPQ.vbs") or die "Unable to create TEMP file"; 

print OUTFILE "Option Explicit\n"; 
print OUTFILE "Dim objNetwork, objPrinter, intDrive, intNetLetter\n"; 
print OUTFILE "Set objNetwork = CreateObject(\"WScript\.Network\")\n"; 
print OUTFILE "Set objPrinter = objNetwork.EnumPrinterConnections\n"; 
print OUTFILE "For intDrive = 0 To (objPrinter.Count -1) Step 2\n"; 
print OUTFILE " intNetLetter = IntNetLetter +1\n"; 
print OUTFILE " Wscript.Echo objPrinter.Item(intDrive +1)\n"; 
print OUTFILE "Next\n"; 
print OUTFILE "Wscript\.Quit(1)\n"; 

close OUTFILE; 

#Run VBScript EnumPQ.vbs to generate a list of connected network printers 
print "Enumerating local printers...\n"; 
my @results = `cscript c:\\TEMP\\EnumPQ.vbs`; 
print "Local printer enumeration complete\n"; 

my $FOUND = 0; 
#Search for printer(s) on MTAPQ5 
foreach my $rec (@results) 
{ 
    chomp $rec; 

    next if($rec =~ /nova/i); #bypass nova PDF printer 
    #Searching for old server in the form of \\ServerName 
    if($rec =~ /\\\\$OldServer/i) 
    { 
     #Exp rec=\\MTAPQ2\(05-103) HP Color LaserJet 4650 PS 6= 
     push @printers, $rec; 
     $FOUND = 1; 
    } 
} 

if($FOUND) 
{ 
    &RemovePrinter(); 
    &AddPrinter(); 
} 
else 
{ 
    print "No network printer on $OldServer found..\n" 
} 

exit 0; #exit main 
#=============================================================================== 
#Creat a VB script to remove network printer(s) 
#=============================================================================== 
sub RemovePrinter 
{ 

open(OUTFILE,">C:\\TEMP\\rmprint.vbs") or die "Error open outfile.."; 
print OUTFILE 'Set WshNetwork = WScript.CreateObject("WScript.Network")'."\n\n"; 

foreach my $printer (@printers) 
{ 
    $printer =~ m/^\\\\$OldServer\\\((.+)\)/i; 
    $PQ2{$1} = "old printer"; 
} 

foreach my $shrname (@NewPQ) 
{ 
    chomp $shrname; 
    $shrname =~ m/^.+\((.+)\).+/i; 
    $PQ{$1} = "New printer"; 
} 

my @PQ2Printers = keys %PQ2; 

foreach my $prt (@PQ2Printers) 
{ 
    if(exists $PQ{$prt}) 
    { 
     #Create VB Script to remove the found printers 
     print OUTFILE "PrinterPath = \"\\\\$OldServer\\$prt\"\n"; 
     print OUTFILE "WshNetwork.RemovePrinterConnection PrinterPath, true, true\n\n"; 
    } 
} 


print OUTFILE "Wscript\.Quit(1)\n"; 
close OUTFILE; 

print "Deleting $OldServer printer(s)..\n"; 
sleep 2; 
my $rm_results = `cscript c:\\TEMP\\rmprint.vbs`; 
#print "remove result:\n"; 
#print $rm_results."\n"; 


}#end sub RemovePrinter 
#=============================================================================== 
#Create a VB script to add network printers 
#=============================================================================== 
sub AddPrinter 
{ 
open(OUTFILE,">C:\\TEMP\\addprint.vbs") or die "Error open outfile.."; 
print OUTFILE 'Set WshNetwork = WScript.CreateObject("WScript.Network")'."\n\n"; 


my @PQ2Printers = keys %PQ2; 

#if old printer exists on new server, map it. 
foreach my $prt (@PQ2Printers) 
{ 
     if(exists $PQ{$prt}) 
     { 
     #Create VB Script to map the found printers to new server 
     print OUTFILE "PrinterPath = \"\\\\$NewServer\\$prt\"\n"; 
     print OUTFILE "WshNetwork.AddWindowsPrinterConnection PrinterPath, true, true\n\n"; 
     print "Remapping $OldServer printer to: \\\\$NewServer\\$prt\n"; 
    } 
} 

print OUTFILE "Wscript\.Quit(1)\n"; 
close OUTFILE; 

sleep 2; 
my $add_results = `cscript c:\\TEMP\\addprint.vbs`; 
#print "Add result:\n"; 
#print $add_results."\n"; 

}#end sub AddPrinter 
#=============================================================================== 
+1

필자는 이것이 펄 질문 인 지 잘 모르겠다. 문제는 'net view'의 출력을 넓히거나 윈도우 스크립팅으로 프린터 목록을 쿼리하는 방법 인 것 같다. 문제를 표시하는 데 필요한 최소한의 코드를 제거하면 더 나은 응답을 얻을 수 있습니다. – Andy

답변

2

당신이 CPAN에서 다양한에서 Win32 모듈로 봤어 : 당신은 NET 몫을 할 경우, 당신은 내가 어쨌든 .. 무슨 뜻인지 볼 것이다, 여기에 펄 스크립트입니다?

이들은 Windows 명령 줄에서 벗어나는 것보다 훨씬 좋은 인터페이스를 제공합니다. 대신 디렉토리를 만들기 위해 시스템 명령에 떨어져가는 펄의 mkdir 명령을 사용할 수 있어야합니다,

@NewPQ = `net view $NewServer`; 

을 그리고 :

예를 들어 Win32::Printer::Enum을 발견하고 사용하는 대신 사용할 수있는 모든 프린터를 나열합니다.

ActivePerl을 다운로드 한 경우 해당 Win32 모듈을 살펴보십시오. 그것은 아마도 당신이 필요로하는 모든 것을 가지고있을 것입니다.

관련 문제