从google搜到的,以前用过一次,后来找不到了,今天好不容易又找到,写在这儿算作备忘。
好像这段脚本是一个老外写的,VSS信息去除的比较彻底。
使用方法:把这段代码保存为RemoveVssInfo.js,放到和xxx.sln文件相同的文件夹下,然后双击执行即可。
代码如下:
好像这段脚本是一个老外写的,VSS信息去除的比较彻底。
使用方法:把这段代码保存为RemoveVssInfo.js,放到和xxx.sln文件相同的文件夹下,然后双击执行即可。
代码如下:
/// Global ------------------------------------------------------
var deleteByForce = true;
var consoleOnly = true;
var defaultTimeOut = 1;
var showDetails = false;
var WSShell;
var fso;
var currentFolder;
var deletedFiles = 0;
var modifiedFiles = 0;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var CharSetDefault = -2, CharSetUnicode = -1, CharSetAscii = 0;
var AttrNormal = 0, AttrReadOnly = 1, AttrHidden = 2, AttrSystem = 4,
AttrVolume = 8, AttrDirectory = 16, AttrArchive = 32, AttrAlias = 1024,
AttrCompressed = 2048;
Init();
Main();
//Test();
/// Main ------------------------------------------------------
function Main() {
var text;
// say hello
text = "Remove from SourceSafe has started.";
Out(text,true);
COut("Working folder: \r\n"+ currentFolder);
// delete files
// *.suo, *.eto, *.vssscc, *.vspscc, vssver.scc, mssccprj.scc
DeleteFiles("[.]*([.]suo$|[.]eto$|[.]vssscc$|[.]vspscc$|vssver[.]scc$|mssccprj[.]scc$)");
// modify files
// *.etp, *.sln, *.csproj
ModifyFiles("[.]*([.]etp$|[.]sln$|[.]csproj$)");
// say goodbye
text = "Remove from SourceSafe has finished. \r\n\r\n"
+ "Deleted files: \t" + deletedFiles + "\r\n"
+ "Modified files: \t" + modifiedFiles + "\r\n";
Out(text,false);
}
function Init() {
// detect command line
try {
WScript.StdOut.WriteLine(" ");
} catch (e) {
consoleOnly = false;
}
// initialize
WSShell = new ActiveXObject("WScript.Shell");
fso = new ActiveXObject("Scripting.FileSystemObject");
currentFolder = GetCurrentFolder();
}
/// Files ------------------------------------------------------
// getcurrent folder
function GetCurrentFolder() {
return fso.GetFolder(fso.GetFile(WScript.ScriptFullName).ParentFolder);
}
// delete files by mask
function DeleteFiles(mask) {
var files = FindFiles(mask);
var i;
Out("Deleting files", true);
for (i=0; i<files.length; i++) {
try {
fso.DeleteFile(files[i], deleteByForce);
deletedFiles ++;
} catch (e) {
WScript.echo(e.Message);
}
}
if (deletedFiles == 0) {
COut("No files were deleted.");
}
}
// find files
function FindFiles(mask) {
return GetFiles(currentFolder, mask);
}
// determine, if filename matches given mask
function MatchesMask(file, mask) {
return new RegExp(mask).test(file);
}
// get files in current folder & subfolders
function GetFiles(folder, mask) {
var result = new Array();
// do files in current folder
var files = new Enumerator(folder.Files);
for (; !files.atEnd(); files.moveNext()) {
if (MatchesMask(files.item(), mask)) {
result.push("" + files.item());
}
}
// do subfolders in current folder
var folders = new Enumerator(folder.SubFolders);
for (; !folders.atEnd(); folders.moveNext()) {
result = result.concat(GetFiles(folders.item(), mask));
}
return result;
}
/// Output ------------------------------------------------------
// output
function Out(text, useTimeOut) {
if (useTimeOut) {
useTimeOut = defaultTimeOut;
} else {
useTimeOut = -1;
}
if (consoleOnly) {
WScript.StdOut.WriteLine(text);
} else {
WSShell.Popup(text, useTimeOut, "Remove from SourceSafe");
}
}
// output
function COut(text, useTimeOut) {
if (useTimeOut) {
useTimeOut = defaultTimeOut;
} else {
useTimeOut = -1;
}
if (consoleOnly) {
WScript.StdOut.WriteLine(text);
}
}
/// Modify ------------------------------------------------------
// modify all files matching given mask
function ModifyFiles(mask) {
var files = FindFiles(mask);
var i;
Out("Modifying files", true);
for (i=0; i<files.length; i++) {
// WScript.echo(files[i]);
// try {
ModifyFile(fso.GetFile(files[i]));
modifiedFiles ++;
// } catch (e) {
// WScript.echo(e.description);
// }
}
if (modifiedFiles == 0) {
COut("No files were modified.");
}
}
function ModifyFile(file) {
switch (fso.GetExtensionName(file.Path).toLowerCase()) {
case "etp":
ModifyFileETP(file);
break;
case "sln":
ModifyFileSLN(file);
break;
case "csproj":
ModifyFileCSPROJ(file);
break;
}
}
function ReadFile(file) {
var stream = file.OpenAsTextStream(ForReading, CharSetDefault);
text = stream.ReadAll();
stream.Close();
return text;
}
function WriteFile(file, text) {
var ro = ((file.Attributes & AttrReadOnly) != 0);
if (ro) file.Attributes -= AttrReadOnly;
var stream = file.OpenAsTextStream(ForWriting, CharSetDefault);
stream.Write(text);
stream.Close();
if (ro) file.Attributes += AttrReadOnly;
}
// remove element <SourceControlSettings></SourceControlSettings>
function ModifyFileETP(file) {
var text;
var re1 = new RegExp('(\\s*<SourceControlSettings(\\s[^>]*)?>[.\\s\\S\\r\\n]*<\\/SourceControlSettings>)','m');
text = ReadFile(file);
text = text.replace(re1, "");
WriteFile(file, text);
}
// remove section GlobalSection(SourceCodeControl) = preSolution EndGlobalSection
function ModifyFileSLN(file) {
var text;
var re1 = new RegExp('(\\s*GlobalSection\\(SourceCodeControl\\))[.\\r\\n\\s\\S]*?EndGlobalSection','m');
text = ReadFile(file);
text = text.replace(re1, "");
WriteFile(file, text);
}
// remove lines with SccProjectName, SccLocalPath, SccAuxPath, SccProvider
function ModifyFileCSPROJ(file) {
var text;
var re1 = new RegExp('(^\\s*SccProjectName = .*$)', 'm');
var re2 = new RegExp('(^\\s*SccLocalPath = .*$)', 'm');
var re3 = new RegExp('(^\\s*SccAuxPath = .*$)', 'm');
var re4 = new RegExp('(^\\s*SccProvider = .*$)', 'm');
text = ReadFile(file);
text = text.replace(re1, "");
text = text.replace(re2, "");
text = text.replace(re3, "");
text = text.replace(re4, "");
WriteFile(file, text);
}
var deleteByForce = true;
var consoleOnly = true;
var defaultTimeOut = 1;
var showDetails = false;
var WSShell;
var fso;
var currentFolder;
var deletedFiles = 0;
var modifiedFiles = 0;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var CharSetDefault = -2, CharSetUnicode = -1, CharSetAscii = 0;
var AttrNormal = 0, AttrReadOnly = 1, AttrHidden = 2, AttrSystem = 4,
AttrVolume = 8, AttrDirectory = 16, AttrArchive = 32, AttrAlias = 1024,
AttrCompressed = 2048;
Init();
Main();
//Test();
/// Main ------------------------------------------------------
function Main() {
var text;
// say hello
text = "Remove from SourceSafe has started.";
Out(text,true);
COut("Working folder: \r\n"+ currentFolder);
// delete files
// *.suo, *.eto, *.vssscc, *.vspscc, vssver.scc, mssccprj.scc
DeleteFiles("[.]*([.]suo$|[.]eto$|[.]vssscc$|[.]vspscc$|vssver[.]scc$|mssccprj[.]scc$)");
// modify files
// *.etp, *.sln, *.csproj
ModifyFiles("[.]*([.]etp$|[.]sln$|[.]csproj$)");
// say goodbye
text = "Remove from SourceSafe has finished. \r\n\r\n"
+ "Deleted files: \t" + deletedFiles + "\r\n"
+ "Modified files: \t" + modifiedFiles + "\r\n";
Out(text,false);
}
function Init() {
// detect command line
try {
WScript.StdOut.WriteLine(" ");
} catch (e) {
consoleOnly = false;
}
// initialize
WSShell = new ActiveXObject("WScript.Shell");
fso = new ActiveXObject("Scripting.FileSystemObject");
currentFolder = GetCurrentFolder();
}
/// Files ------------------------------------------------------
// getcurrent folder
function GetCurrentFolder() {
return fso.GetFolder(fso.GetFile(WScript.ScriptFullName).ParentFolder);
}
// delete files by mask
function DeleteFiles(mask) {
var files = FindFiles(mask);
var i;
Out("Deleting files", true);
for (i=0; i<files.length; i++) {
try {
fso.DeleteFile(files[i], deleteByForce);
deletedFiles ++;
} catch (e) {
WScript.echo(e.Message);
}
}
if (deletedFiles == 0) {
COut("No files were deleted.");
}
}
// find files
function FindFiles(mask) {
return GetFiles(currentFolder, mask);
}
// determine, if filename matches given mask
function MatchesMask(file, mask) {
return new RegExp(mask).test(file);
}
// get files in current folder & subfolders
function GetFiles(folder, mask) {
var result = new Array();
// do files in current folder
var files = new Enumerator(folder.Files);
for (; !files.atEnd(); files.moveNext()) {
if (MatchesMask(files.item(), mask)) {
result.push("" + files.item());
}
}
// do subfolders in current folder
var folders = new Enumerator(folder.SubFolders);
for (; !folders.atEnd(); folders.moveNext()) {
result = result.concat(GetFiles(folders.item(), mask));
}
return result;
}
/// Output ------------------------------------------------------
// output
function Out(text, useTimeOut) {
if (useTimeOut) {
useTimeOut = defaultTimeOut;
} else {
useTimeOut = -1;
}
if (consoleOnly) {
WScript.StdOut.WriteLine(text);
} else {
WSShell.Popup(text, useTimeOut, "Remove from SourceSafe");
}
}
// output
function COut(text, useTimeOut) {
if (useTimeOut) {
useTimeOut = defaultTimeOut;
} else {
useTimeOut = -1;
}
if (consoleOnly) {
WScript.StdOut.WriteLine(text);
}
}
/// Modify ------------------------------------------------------
// modify all files matching given mask
function ModifyFiles(mask) {
var files = FindFiles(mask);
var i;
Out("Modifying files", true);
for (i=0; i<files.length; i++) {
// WScript.echo(files[i]);
// try {
ModifyFile(fso.GetFile(files[i]));
modifiedFiles ++;
// } catch (e) {
// WScript.echo(e.description);
// }
}
if (modifiedFiles == 0) {
COut("No files were modified.");
}
}
function ModifyFile(file) {
switch (fso.GetExtensionName(file.Path).toLowerCase()) {
case "etp":
ModifyFileETP(file);
break;
case "sln":
ModifyFileSLN(file);
break;
case "csproj":
ModifyFileCSPROJ(file);
break;
}
}
function ReadFile(file) {
var stream = file.OpenAsTextStream(ForReading, CharSetDefault);
text = stream.ReadAll();
stream.Close();
return text;
}
function WriteFile(file, text) {
var ro = ((file.Attributes & AttrReadOnly) != 0);
if (ro) file.Attributes -= AttrReadOnly;
var stream = file.OpenAsTextStream(ForWriting, CharSetDefault);
stream.Write(text);
stream.Close();
if (ro) file.Attributes += AttrReadOnly;
}
// remove element <SourceControlSettings></SourceControlSettings>
function ModifyFileETP(file) {
var text;
var re1 = new RegExp('(\\s*<SourceControlSettings(\\s[^>]*)?>[.\\s\\S\\r\\n]*<\\/SourceControlSettings>)','m');
text = ReadFile(file);
text = text.replace(re1, "");
WriteFile(file, text);
}
// remove section GlobalSection(SourceCodeControl) = preSolution EndGlobalSection
function ModifyFileSLN(file) {
var text;
var re1 = new RegExp('(\\s*GlobalSection\\(SourceCodeControl\\))[.\\r\\n\\s\\S]*?EndGlobalSection','m');
text = ReadFile(file);
text = text.replace(re1, "");
WriteFile(file, text);
}
// remove lines with SccProjectName, SccLocalPath, SccAuxPath, SccProvider
function ModifyFileCSPROJ(file) {
var text;
var re1 = new RegExp('(^\\s*SccProjectName = .*$)', 'm');
var re2 = new RegExp('(^\\s*SccLocalPath = .*$)', 'm');
var re3 = new RegExp('(^\\s*SccAuxPath = .*$)', 'm');
var re4 = new RegExp('(^\\s*SccProvider = .*$)', 'm');
text = ReadFile(file);
text = text.replace(re1, "");
text = text.replace(re2, "");
text = text.replace(re3, "");
text = text.replace(re4, "");
WriteFile(file, text);
}