我需要在運行改變它的程序之前備份主機文件。如何使用Perl來備份主機文件?
因此,我首先刪除備份文件,如果它已經存在,然後用新名稱將主機文件複製到同一目錄中。
我只需要一個完整的腳本來完成這一項任務。我使用Perl2EXE將所有Perl腳本轉換爲EXE。
這是我到目前爲止的代碼:
#use Win32::OLE;
#use Win32::OLE qw(in);
use strict;
use warnings;
use File::Spec;
use File::Copy 'copy';
$APPNAME = "TEST_TOP_Install";
###############################################################################################################################
###### This section Creates a log file on machines being pushed
###### The location of the log file is c:\winnt\Install_logs or c:\windows\Install_logs
###############################################################################################################################
###### System Root Path
$rootpath = $ENV{"systemroot"};
$alluserspath = $ENV{"ALLUSERSPROFILE"};
$programfilespath = $ENV{"PROGRAMFILES"};
$SystemDrive = $ENV{"SystemDrive"}; # c:
$WIN32DIR = "$SystemDrive\\program files\(x86\)";
$LOGDIR = "$rootpath\\install_logs" ;
if (!-e $LOGDIR) {
$DIR = `mkdir $LOGDIR`;
}
open ($APPNAME, ">$rootpath\\install_logs\\$APPNAME.log");
###############################################################################################################################
###### This section writes date and time stamp and heading in the log
###############################################################################################################################
print $APPNAME ("************************************************************\n");
print $APPNAME ("This pack will uninstall and install TEST_TOP\n\n") ;
$TDATE = `date \/T`;
$TTIME = `time \/T`;
print $APPNAME ("__________________________________________\n");
print $APPNAME ("Date Started\: $TDATE\n");
print $APPNAME ("Time Started\: $TTIME\n");
print $APPNAME ("__________________________________________\n\n");
###############################################################################################################################
## SECTION 1: Asset name
###############################################################################################################################
$ASSET = `$rootpath\\system32\\hostname\.exe`;
chomp $ASSET;
###############################################################################################################################
## SECTION x: Variables
###############################################################################################################################
$OSVERSION = `$rootpath\\system32\\reg\.exe QUERY "\\\\$ASSET\\HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" \/v CurrentBuildNumber`;
$PRODUCTNAME = `$rootpath\\system32\\reg\.exe QUERY "\\\\$ASSET\\HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" \/v ProductName`;
###############################################################################################################################
## SECTION 2: OS Version
###############################################################################################################################
if ($OSVERSION =~ /1381/)
{
print $APPNAME ("WINDOWS NT MACHINE - $ASSET ... exiting\n\n");
print $APPNAME ("Exit Code: 1\n");
exit 1;
}
elsif ($OSVERSION =~ /2195/)
{
print $APPNAME ("WINDOWS 2000 MACHINE - $ASSET ... exiting\n\n");
print $APPNAME ("Exit Code: 2\n");
exit 2;
}
elsif ($OSVERSION =~ /2600/)
{
print $APPNAME ("WINDOWS XP MACHINE - $ASSET .. \n\n");
$DisplayVersion = `reg query "\\\\$ASSET\\HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\\{B41ED86C\-800F\-48B8\-B3D7\-4AB19DBB62E5\}" \/v DisplayVersion`;
goto WINXPINSTALL;
}
elsif (($OSVERSION =~ /76/) || ($PRODUCTNAME =~ /Windows 7/))
{
print $APPNAME ("WINDOWS 7 MACHINE - $ASSET\n\n");
$DisplayVersion = `reg query "\\\\$ASSET\\HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\\{B41ED86C\-800F\-48B8\-B3D7\-4AB19DBB62E5\}" \/v DisplayVersion`;
}
else
{
print $APPNAME ("Unable to determine OS - $ASSET\n\n");
print $APPNAME ("Exit Code: 3\n");
exit 3;
}
###############################################################################################################################
## Windows 7 ############# Windows 7 ################################### Windows 7 ############################### Windows 7 ##
###############################################################################################################################
if ($DisplayVersion =~ /1.1.10/)
{
print $APPNAME ("TEST exist ... uninstalling\n\n");
goto WIN7UNINSTALLX;
}
else
{
print $APPNAME ("TEST does not exist ... Installing\n\n");
goto WIN7INSTALLAPP;
}
WIN7INSTALLAPP:
###############################################################################################################################
## SECTION 3: Windows 7 Install
###############################################################################################################################
sleep (2);
print $APPNAME ("TEST Installation\n");
print $APPNAME ("____________________________________________________\n\n");
autoflush STDOUT;
autoflush STDERR;
my $etc = File::Spec->catdir($ENV{SYSTEMROOT}, 'system32\drivers\etc');
my $hosts = File::Spec->catfile($etc, 'hosts');
my $backup = File::Spec->catfile($etc, 'hosts_backup.bak');
copy $hosts, $backup or die "Backup failed: $!";
print $APPNAME ("host file backup completed\n\n");
`start \/WAIT msiexec \/i "$rootpath\\MSI\\TEST_TOP\\TEST_TOP\.msi" TRANSFORMS="$rootpath\\MSI\\TEST_TOP\\TEST_TOP_WIN7\.mst" \/l*v "$rootpath\\install\_logs\\TEST\_TOP\_MSIinstall\.log" \/qn`;
$errcode=$?;
if ($errcode == 0)
{
print $APPNAME ("TEST install completed successfully\n\n");
}
else
{
print $APPNAME ("TEST install failed ... $errcode\n\n");
print $APPNAME ("Exit Code: 4\n");
exit 4;
}
print $APPNAME ("\n\n");
exit 0;
WIN7UNINSTALLX:
###############################################################################################################################
## SECTION 4: Windows 7 Uninstall
###############################################################################################################################
`start \/WAIT msiexec\.exe \/x \{B30ED86C\-800F\-48B8\-B3D7\-4AB19DBB62E5\} \/l*v \"$rootpath\\install\_logs\\TEST\_TOP\_MSIuninstall\.log\" \/qn`;
$errcode=$?;
if ($errcode == 0)
{
print $APPNAME ("TEST uninstall completed successfully\n\n");
sleep (5);
}
else
{
print $APPNAME ("TEST uninstall failed ... $errcode\n\n");
print $APPNAME ("Exit Code: 5\n");
exit 5;
}
print $APPNAME ("\n\n");
goto WIN7INSTALLAPP;
###############################################################################################################################
### WINDOWS XP ###################### WINDOWS XP ######################### WINDOWS XP ########################## WINDOWS XP ###
###############################################################################################################################
WINXPINSTALL:
if ($DisplayVersion =~ /1.1.10/)
{
print $APPNAME ("TEST exist ... uninstalling\n\n");
goto WINXPUNINSTALLX;
}
else
{
print $APPNAME ("TEST does not exist ... Installing\n\n");
goto WINXPINSTALLAPP;
}
WINXPINSTALLAPP:
###############################################################################################################################
## SECTION 3: Windows XP Install
###############################################################################################################################
sleep (2);
print $APPNAME ("TEST Installation\n");
print $APPNAME ("____________________________________________________\n\n");
autoflush STDOUT;
autoflush STDERR;
my $etc = File::Spec->catdir($ENV{SYSTEMROOT}, 'system32\drivers\etc');
my $hosts = File::Spec->catfile($etc, 'hosts');
my $backup = File::Spec->catfile($etc, 'hosts_backup.bak');
copy $hosts, $backup or die "Backup failed: $!";
print $APPNAME ("host file backup completed\n\n");
`start \/WAIT msiexec \/i "$rootpath\\MSI\\TEST\_TOP\\TEST\_TOP\.msi" TRANSFORMS="$rootpath\\MSI\\TEST_TOP\\TEST_TOP_XP\.mst" \/l*v "$rootpath\\install\_logs\\TEST\_TOP\_MSIinstall\.log" \/qn`;
$errcode=$?;
if ($errcode == 0)
{
print $APPNAME ("TEST install completed successfully\n\n");
}
else
{
print $APPNAME ("TEST install failed ... $errcode\n\n");
print $APPNAME ("Exit Code: 4\n");
exit 4;
}
exit 0;
WINXPUNINSTALLX:
###############################################################################################################################
## SECTION 4: Windows XP Uninstall
###############################################################################################################################
`start \/WAIT msiexec\.exe \/x \{B30ED86C\-800F\-48B8\-B3D7\-4AB19DBB62E5\} \/l*v \"$rootpath\\install\_logs\\TEST\_TOP\_MSIuninstall\.log\" \/qn`;
$errcode=$?;
if ($errcode == 0)
{
print $APPNAME ("TEST uninstall completed successfully\n\n");
sleep (5);
}
else
{
print $APPNAME ("TEST uninstall failed ... $errcode\n\n");
print $APPNAME ("Exit Code: 5\n");
exit 5;
}
print $APPNAME ("\n\n");
goto WINXPINSTALLAPP;
那麼,什麼是你的問題? – David
在void上下文中使用反引號操作符並沒有錯,但是一個糟糕的選擇。反引號用於捕獲命令的輸出。改用['system'](http://p3rl.org/system)。 – memowe