此脚本将有效迁移到新的打印服务器并删除,例如,这些打印机共享名):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
规则:
- 我不能使用WMI,因为不是每个人都有WMI运行..
- 我要坚持到做语言不需要任何框架来安装......这就是为什么我选择PERL和VBScript。
- 圆括号始终存在,并且始终具有正确的共享名称。
理念:我想我必须使用“网景”中的打印机名称与实际份额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
#===============================================================================
有什么问题吗? – daxim