Сценарий PERL VB переносится на новый сервер печати, сопоставляет и удаляет принтер локально. ПОМОЩЬ с принтерами с длинными общими именами.

Этот сценарий эффективно перенесет на новый сервер печати и удалит, например, эти принтеры (короткое имя общего ресурса):

имя принтера=\\p1\(share)Laserjet 1000 -- имя общего ресурса/путь UNC=\\p1\share

имя принтера=\\p1\(share1)Laser 1000 -- имя общего ресурса/путь UNC=\\p1\share1

Если у меня есть принтер с длинным общим именем/путем UNC, он не удалит этот принтер:

имя принтера=\\p1\(общий ресурс)Laserjet 1000 -- имя общего ресурса/путь UNC=\\p1\(общий ресурс)Laserjet1000

имя принтера=\\p1\(share1)Laser 1000 -- имя общего ресурса/путь UNC=\\p1\(share1)UniversalHP

Правила:

  1. Я не могу использовать WMI, так как не у всех работает WMI.
  2. Мне нужно придерживаться языков, которые не требуют установки каких-либо фреймворков. Вот почему я выбрал PERL и VBScript.
  3. Круглые скобки всегда существуют и всегда содержат правильное имя общего ресурса.

Идея: я предполагаю, что мне нужно использовать net view, чтобы сопоставить имя принтера с фактическим именем общего ресурса. Я хочу реализовать что-то вроде этого, чтобы удалить принтеры с длинными именами общих ресурсов:

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
#===============================================================================

person Will Fix    schedule 21.07.2011    source источник