2011-07-21 43 views
1

此脚本将有效迁移到新的打印服务器并删除,例如,这些打印机共享名):PERL-VB脚本迁移到新的打印机服务器,在本地匹配和删除打印机 - 帮助使用长分享名称的打印机

打印机名称= \\ P1 \(股)LASERJET 1000 - 共享名称/ UNC路径= \\ P1 \共享

打印机名称= \\ P1 \(为share1)激光1000 - - 共享名称/ UNC路径= \\ p1 \ share1

如果我的打印机具有长分享名称/ UNC路径,它不会删除该打印机:

打印机名称= \\ P1 \(股)LASERJET 1000 - 共享名称/ UNC路径= \\ P1 \(股)Laserjet1000

打印机名称= \\ P1 \(为share1)激光1000 - 共享名/ UNC路径= \\ P1 \(为share1)UniversalHP

规则:

  1. 我不能使用WMI,因为不是每个人都有WMI运行..
  2. 我要坚持到做语言不需要任何框架来安装......这就是为什么我选择PERL和VBScript。
  3. 圆括号始终存在,并且始终具有正确的共享名称。

理念:我想我必须使用“网景”中的打印机名称与实际份额name..I要实现这样的事情,并有长期的共享名删除打印机匹配:

sub RemovePrinterLong 
{ 
print "Long printer names:"; 
my @list = `net view $OldServer`; 
foreach my $line (@list) 
{ 
if($line =~ /sharename/i) 
{ 
my($shr,$rest) = split(/Print/,$line); 
$shr =~ s/\s+$//; 
if($shr =~ /sharename\)/i) 
{ 
print "\\\\$OldServer\\$shr\n"; 
} 
#$line =~ /^\s*(.)\s+Print\s+/; $newLine = $1; 
#print "=$newLine="; 
} 
} 
} 

基本上,我希望它捉住,如果它是一个漫长的共享名称通过捕获括号,然后将旧服务器上运行一个网络视图中创建一个VBS脚本删除这些打印机具有长共享名称...

这里是Perl脚本:

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

#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 PQ1 
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=\\P1\(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 
#=============================================================================== 
+0

有什么问题吗? – daxim

回答

0
#=============================================================================== 
#Creat a VB script to remove long share name network printer(s) 
#=============================================================================== 
sub RemovePrinterLong 
{ 

    open(OUTFILE,">C:\\TEMP\\rmprintlong.vbs") or die "Error open outfile.."; 
    print OUTFILE 'Set WshNetwork = WScript.CreateObject("WScript.Network")'."\n\n"; 
     print OUTFILE 'On Error Resume Next'."\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 
my @list = `net view $OldServer`; 
foreach my $line (@list) 
{ 
if($line =~ /$prt/i) 
{ 
my($shr,$rest) = split(/Print/,$line); 
$shr =~ s/\s+$//; 
if($shr =~ /$prt\)/i) 
{ 
    #print "prt $prt\n"; 
    #print "shr $shr"; 
#print "\\\\$OldServer\\$shr\n"; 
print OUTFILE "PrinterPath = \"\\\\$OldServer\\$shr\"\n"; 
print OUTFILE "WshNetwork.RemovePrinterConnection PrinterPath, true, true\n\n"; 
} 
#$line =~ /^\s*(.)\s+Print\s+/; $newLine = $1; 
#print "=$newLine="; 
} 
} 
     } 
    } 


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

    print "Deleting $OldServer long share name printer(s)..\n"; 
    sleep 2; 
     my $rm_results = `cscript c:\\TEMP\\rmprintlong.vbs`; 
     print "Script complete."; 
    } 
+0

我想通了! :) –

相关问题