-5

在运行更改它的程序之前,我需要备份主机文件。

所以我首先删除备份文件以防它已经存在,然后用新名称将主机文件复制到同一目录中。

我只需要一个完整的脚本来完成这项任务。我使用 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;
4

1 回答 1

2

如果可能,最好使用本机 Perl 运算符或模块,而不是使用命令行实用程序。在这种情况下,File::SpecFile::Copy模块很有用。自从 Perl v5 的第一个版本以来,这两个都是核心 Perl 发行版的一部分,因此不需要在您的系统上安装。

此外,对于大多数形式的复制或输出,无需删除现有文件:将创建一个同名的新文件,并静默删除旧文件。

该程序可以满足您的需要。请注意,您需要以管理员身份运行它才能写入所在的系统文件夹hosts,否则复制将失败 - 可能出现No such file or directory错误。

use strict;
use warnings;

use feature 'say';

use File::Spec;
use File::Copy 'copy';

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');

say "From $hosts";
say "To $backup";

copy $hosts, $backup or die "Backup failed: $!";
say 'Success';

输出

From C:\Windows\system32\drivers\etc\hosts
To C:\Windows\system32\drivers\etc\hosts_backup.bak
Success
于 2012-11-16T22:16:11.413 回答