// CreateBuildDirectory.js -- Build Directory Mirror // Usage: cscript CreateBuildDirectory.js [source directory] [target directory] // // This script takes a source directory (containing all of the files you want // to include in the installer) and recursively creates an identical target // directory structure except with all zero-byte dummy files. This makes the // test-build-verify cycle a hell of a lot faster by making the the compression // cycle negligible. // // Once you've finished building/testing the NSIS build script on the dummy files, // you copy it back to the original directory and run it against the full-size files. // // This script was created in a fit of irritation at the amount of time I // spent waiting for the Nullsoft installer compiler to compress files over // and over again. To use it, you've got to have Windows Scripting Host // (2.0 or 5.6?). // // Variables // --------- // FSO // Standard FileSystemObject. // SourceFolder // DestFolder var Out = WScript.StdOut; function Usage(errno) { Out.WriteLine("Usage: cscript CreateBuildDirectory.js [source directory] [target directory]"); Out.WriteLine(); Out.WriteLine("Example:"); Out.WriteLine(" cscript CreateBuildDirectory.js c:\\Source c:\\Target"); Out.WriteLine("or: cscript CreateBuildDirectory.js c:\\Source\\ \\Target"); Out.WriteLine(); Out.WriteLine("Trailing backslashes '\\' are ok, relative paths are ok."); Out.WriteLine("The target directory will be non-recursively created if it does not exist."); Out.WriteLine(" e.g. if c:\\Foo\\Target is used, Foo must exist before Target can be created."); WScript.Quit(errno); } if (WScript.Arguments.length != 2) { Usage(0); } var FSO = WScript.CreateObject("Scripting.FileSystemObject"); if (FSO.FolderExists(WScript.Arguments(0))) { WScript.Echo(WScript.Arguments(0) + " exists."); } else { WScript.Echo(WScript.Arguments(0) + " doesn't exist."); Usage(1); } if (FSO.FolderExists(WScript.Arguments(1))) { WScript.Echo(WScript.Arguments(1) + " exists."); } else { WScript.Echo(WScript.Arguments(1) + " doesn't exist... creating"); FSO.CreateFolder(WScript.Arguments(1)); } var SourceFolder = FSO.GetFolder(WScript.Arguments(0)); var sfLength = SourceFolder.Path.length + 1; var DestFolder = FSO.GetFolder(WScript.Arguments(1)); function DisplayCollection(Collection) { for ( ; !Collection.atEnd(); Collection.moveNext()) { Out.WriteLine(Collection.item()); } } function GetFiles(Folder) { FileList = new Enumerator(Folder.Files); return FileList; } function GetSubFolders(Folder) { FolderContents = new Enumerator(Folder.subFolders); return FolderContents; } function RecurseFolder(Folder) // feed it the starting folder { var FolderList = new Enumerator(Folder.subFolders); for ( ; !FolderList.atEnd(); FolderList.moveNext()) { Out.WriteLine(FolderList.item()); RecurseFolder(FSO.GetFolder(FolderList.item())); } } function MirrorFolder(Folder) // feed it the starting folder { var FolderList = new Enumerator(Folder.subFolders); for ( ; !FolderList.atEnd(); FolderList.moveNext()) { currentFolder = FolderList.item(); foldername = currentFolder.Path; foldername = foldername.slice(sfLength); destfoldername = DestFolder.Path + "\\" + foldername; Out.WriteLine("Folder: " + foldername + "--->" + destfoldername); if (!FSO.FolderExists(destfoldername)) { FSO.CreateFolder(destfoldername); } MirrorFolder(FSO.GetFolder(currentFolder)); FileList = GetFiles(currentFolder); for ( ; !FileList.atEnd(); FileList.moveNext()) { file = FileList.item(); // file.Path is the full path + filename filename = file.Path; // file.Name is just the filename filename = filename.slice(sfLength); destfilename = DestFolder.Path + "\\" + filename; Out.WriteLine("File: " + filename + "--->" + destfilename); FSO.CreateTextFile(destfilename, true); } } FileList = GetFiles(Folder); for ( ; !FileList.atEnd(); FileList.moveNext()) { file = FileList.item(); // file.Path is the full path + filename filename = file.Path; // file.Name is just the filename filename = filename.slice(sfLength); destfilename = DestFolder.Path + "\\" + filename; Out.WriteLine("File: " + filename + "--->" + destfilename); FSO.CreateTextFile(destfilename, true); } } Out.WriteLine("---SourceFolder Subdirectories---"); DisplayCollection(GetSubFolders(SourceFolder)); Out.WriteLine("---SourceFolder Recursive Subdirectories---"); Out.WriteLine(SourceFolder.Path); RecurseFolder(SourceFolder); Out.WriteLine("---Recurse and Mirror Source Directory---"); MirrorFolder(SourceFolder);