288 lines
7.5 KiB
Batchfile
288 lines
7.5 KiB
Batchfile
|
@REM -----------------------------------------------------------------
|
||
|
@REM
|
||
|
@REM DMDGenericCabber.cmd - Imranp,NSBLD
|
||
|
@REM Generic cab script.
|
||
|
@REM
|
||
|
@REM Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
@REM
|
||
|
@REM -----------------------------------------------------------------
|
||
|
@if NOT defined HOST_PROCESSOR_ARCHITECTURE set HOST_PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITECTURE%
|
||
|
@perl -x "%~f0" %*
|
||
|
@goto :EOF
|
||
|
|
||
|
#!perl
|
||
|
use lib $ENV{RAZZLETOOLPATH};
|
||
|
use Logmsg;
|
||
|
###############################################################################
|
||
|
{ # Begin Main Package
|
||
|
###############################################################################
|
||
|
# ParseArgs is designed to remap some args to global variables.
|
||
|
sub ParseArgs
|
||
|
{
|
||
|
|
||
|
## First, handle the usage case
|
||
|
if (
|
||
|
( grep(/-\?/,$ARGV[0]) ) ||
|
||
|
( grep(/^$/,$ARGV[0]) ) ||
|
||
|
( $#ARGV != 2 )
|
||
|
)
|
||
|
{
|
||
|
print "
|
||
|
Usage:
|
||
|
DMDGenericCabber.cmd CabDirectory OutputCab DeltaOutputName
|
||
|
Example:
|
||
|
DMDGenericCabber.cmd %_NTTREE%\WMS %_NTTREE%\WMS.cab %_NTTREE%\WMSOCM.*
|
||
|
\n";
|
||
|
logmsg( "END Execution" );
|
||
|
exit 0;
|
||
|
}
|
||
|
|
||
|
## Return Args.
|
||
|
|
||
|
return ( $ARGV[0],$ARGV[1],$ARGV[2] );
|
||
|
|
||
|
} ## End Sub
|
||
|
###############################################################################
|
||
|
# ErrorHandler logs error messages for us.
|
||
|
sub ErrorHandler
|
||
|
{
|
||
|
logmsg( " ERROR: $_[0] " );
|
||
|
exit ( 1 );
|
||
|
}
|
||
|
###############################################################################
|
||
|
# GetHeader is a function that returns a string[] with a Header approved
|
||
|
# by BarbKess for MediaServer -- modified by imranp for Being generic
|
||
|
sub GetHeader
|
||
|
{
|
||
|
|
||
|
## Declare a header A bit messy.
|
||
|
|
||
|
local @lstHeader = ".Option Explicit
|
||
|
.Set DiskDirectoryTemplate=DDDD
|
||
|
.Set CabinetNameTemplate=ZZZZ
|
||
|
.Set CompressionType=LZX
|
||
|
.Set MaxDiskSize=CDROM
|
||
|
.Set Compress=on
|
||
|
.Set Cabinet=on
|
||
|
.Set CompressionMemory=21
|
||
|
.Set InfFileName=nul
|
||
|
.Set RptFileName=nul
|
||
|
";
|
||
|
|
||
|
## Now, substitute the cab name for ZZZZ
|
||
|
|
||
|
my $strRemadeString;
|
||
|
$strRemadeString = $_[1] ;
|
||
|
|
||
|
## Break it into tokens
|
||
|
my @lstTokensOfFinalCab;
|
||
|
@lstTokensOfFinalCab = split ( /\\/,$strRemadeString );
|
||
|
$strRemadeString =~ s/$lstTokensOfFinalCab[$#lstTokensOfFinalCab]//;
|
||
|
$strRemadeString =~ s/\\$//;
|
||
|
|
||
|
foreach $strPieceOfHeader ( @lstHeader )
|
||
|
{
|
||
|
$strPieceOfHeader =~ s/DDDD/$strRemadeString/i;
|
||
|
$strPieceOfHeader =~ s/ZZZZ/$lstTokensOfFinalCab[$#lstTokensOfFinalCab]/i;
|
||
|
}
|
||
|
|
||
|
return ( @lstHeader );
|
||
|
}
|
||
|
###########################################################################################################
|
||
|
# RemakeMetaStringAsLiteral takes a metastring ( $.*?\ ) and makes it into an escaped string.
|
||
|
sub RemakeMetaStringAsLiteral
|
||
|
{
|
||
|
local $strInputString; ## remember, pass by value, not reference in this call.
|
||
|
$strInputString = $_[0];
|
||
|
local @lstOfMetaChars;
|
||
|
|
||
|
## The list of MetaCharacters I currently know about.
|
||
|
push(@lstOfMetaChars,"\\\\");
|
||
|
push(@lstOfMetaChars,"\\\$");
|
||
|
push(@lstOfMetaChars,"\\\.");
|
||
|
push(@lstOfMetaChars,"\\\*");
|
||
|
push(@lstOfMetaChars,"\\\?");
|
||
|
push(@lstOfMetaChars,"\\\'");
|
||
|
push(@lstOfMetaChars,"\\\{");
|
||
|
push(@lstOfMetaChars,"\\\}");
|
||
|
|
||
|
|
||
|
foreach my $strMetachar (@lstOfMetaChars)
|
||
|
{
|
||
|
if ( grep (/$strMetachar/,$strInputString) )
|
||
|
{
|
||
|
$strInputString =~ s/$strMetachar/$strMetachar/g;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ( $strInputString );
|
||
|
|
||
|
}
|
||
|
###############################################################################
|
||
|
# Cleanup Cleans up the directories before doing anything.
|
||
|
sub CleanUp
|
||
|
{
|
||
|
## Put the parameter into a useful named var
|
||
|
|
||
|
my $strDirectoryToClean;
|
||
|
$strDirectoryToClean = $_[0];
|
||
|
|
||
|
## Hard-code a list of bad extensions.
|
||
|
|
||
|
my @lstBadExtensions;
|
||
|
push( @lstBadExtensions,".cat" );
|
||
|
push( @lstBadExtensions,".cdf" );
|
||
|
push( @lstBadExtensions,".ddf" );
|
||
|
|
||
|
## Remove any files in the dir with the extensions
|
||
|
|
||
|
chomp $strDirectoryToClean;
|
||
|
if ( grep(/[a..z]/,$strDirectoryToClean) )
|
||
|
{
|
||
|
foreach $strDeleteThisExtension ( @lstBadExtensions )
|
||
|
{
|
||
|
my $strDeleteMe = $strDirectoryToClean . '\\*' . $strDeleteThisExtension;
|
||
|
print `del /s /q $strDeleteMe`;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
###############################################################################
|
||
|
# RenameDeltaFiles moves the delta.*, and renames it.
|
||
|
sub RenameDeltaFiles
|
||
|
{
|
||
|
my $strDeltaHere,$strDeltaProcess;
|
||
|
($strDeltaHere,$strDeltaProcess) = ($_[0],$_[1]);
|
||
|
|
||
|
## Take the filename, and make it into a token list, remove the final token from the string.
|
||
|
|
||
|
my @lstTokensOfFinalDelta;
|
||
|
@lstTokensOfFinalDelta = split ( /\\/,$strDeltaProcess );
|
||
|
$strDeltaProcess =~ s/$lstTokensOfFinalDelta[$#lstTokensOfFinalDelta]//;
|
||
|
$strDeltaProcess =~ s/\\$//;
|
||
|
|
||
|
## Actually rename the file here.
|
||
|
|
||
|
chomp $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta];
|
||
|
print `pushd $strDeltaHere & rename delta.* $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta] & popd`;
|
||
|
|
||
|
## Now, move the files to the location specified as part of the arguments.
|
||
|
|
||
|
print `pushd $strDeltaHere & move $lstTokensOfFinalDelta[$#lstTokensOfFinalDelta] $strDeltaProcess & popd`;
|
||
|
|
||
|
}
|
||
|
###############################################################################
|
||
|
# CreateFile is a generic file procedure.
|
||
|
# Parameters:
|
||
|
# Code1, Code2, FileName, Data.
|
||
|
# Code1 = AppendCode (0 = overwrite, 1 = append)
|
||
|
# Code2 = AttribCode (0 = R/W, 1 = R/O, 2+ = undef)
|
||
|
sub CreateFile
|
||
|
{
|
||
|
local $nAppendCode,$nAttribCode,$strFile,@lstData;
|
||
|
$nAppendCode=shift @_;
|
||
|
$nAttribCode=shift @_;
|
||
|
$strFile=shift@_;
|
||
|
@lstData=@_;
|
||
|
if ( $nAppendCode==0 )
|
||
|
{
|
||
|
open(HANDLE,">$strFile") || ErrorHandler "Could not open file $strFile for write";
|
||
|
foreach $strDatum (@lstData)
|
||
|
{
|
||
|
print HANDLE $strDatum;
|
||
|
}
|
||
|
close HANDLE;
|
||
|
}
|
||
|
elsif ( $nAppendCode==1 )
|
||
|
{
|
||
|
open(HANDLE,">>$strFile") || ErrorHandler "Could not open file $strFile for append.";
|
||
|
foreach $strDatum (@lstData)
|
||
|
{
|
||
|
print HANDLE $strDatum;
|
||
|
}
|
||
|
close HANDLE;
|
||
|
}
|
||
|
if ( $nAttribCode == 0 )
|
||
|
{
|
||
|
}
|
||
|
elsif ( $nAttribCode == 1 )
|
||
|
{
|
||
|
`attrib +r $strFile`;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
###############################################################################
|
||
|
## void main()
|
||
|
{
|
||
|
logmsg( "BEGIN Execution" );
|
||
|
|
||
|
local $g_strOutPutDirectory,$g_strOutPutCab,$g_strRenameDelta;
|
||
|
( $g_strOutPutDirectory,$g_strOutPutCab,$g_strRenameDelta ) = ParseArgs();
|
||
|
|
||
|
## Get the header made.
|
||
|
|
||
|
my @lstGeneratedHeader;
|
||
|
@lstGeneratedHeader = GetHeader( $g_strOutPutDirectory,$g_strOutPutCab );
|
||
|
|
||
|
## Since we might do incrementals, let's be paranoid
|
||
|
|
||
|
CleanUp( $g_strOutPutDirectory );
|
||
|
|
||
|
## Get the list of files in the directory
|
||
|
|
||
|
my @lstFilesInDirectory;
|
||
|
@lstFilesInDirectory = `dir /s /a-d /b $g_strOutPutDirectory 2>&1`;
|
||
|
|
||
|
## Add Begin and end quotes to each line.
|
||
|
|
||
|
foreach $strAddQuotesToMe ( @lstFilesInDirectory )
|
||
|
{
|
||
|
chomp $strAddQuotesToMe;
|
||
|
$strAddQuotesToMe = '"' . $strAddQuotesToMe . '"' ."\n";
|
||
|
}
|
||
|
|
||
|
## merge this together
|
||
|
|
||
|
local @lstDDFFile;
|
||
|
@lstDDFFile = @lstGeneratedHeader;
|
||
|
push( @lstDDFFile,@lstFilesInDirectory );
|
||
|
|
||
|
## Now, let's sign the sucker.
|
||
|
|
||
|
logmsg( "Calling deltacat" );
|
||
|
|
||
|
print `$ENV{'RAZZLETOOLPATH'}\\deltacat.cmd $g_strOutPutDirectory`;
|
||
|
RenameDeltaFiles( $g_strOutPutDirectory,$g_strRenameDelta );
|
||
|
|
||
|
## Now, let's go out and flush the DDF.
|
||
|
|
||
|
my @lstTemp,$strDDFName;
|
||
|
@lstTemp = split( /\\/,$g_strOutPutCab );
|
||
|
$strDDFName = $lstTemp[$#lstTemp];
|
||
|
$strDDFName =~ s/\.cab/.ddf/;
|
||
|
|
||
|
if ( grep(/\\$/,$g_strOutPutDirectory) )
|
||
|
{
|
||
|
$strDDFName = $g_strOutPutDirectory . $strDDFName;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$strDDFName = $g_strOutPutDirectory . '\\' . $strDDFName;
|
||
|
}
|
||
|
|
||
|
CreateFile( 0,0,$strDDFName,@lstDDFFile );
|
||
|
|
||
|
## Begin Cabbing
|
||
|
|
||
|
logmsg ( "Begin Cabbing $strDDFName" );
|
||
|
`$ENV{'RAZZLETOOLPATH'}\\$ENV{'HOST_PROCESSOR_ARCHITECTURE'}\\makecab.exe /f $strDDFName`;
|
||
|
if ( -f $g_strOutPutCab )
|
||
|
{
|
||
|
logmsg( "Complete Execution" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ErrorHandler( "Failed to create $g_strOutPutCab" );
|
||
|
}
|
||
|
}
|
||
|
################################################################################
|
||
|
} ## end main package
|