PowerShell で Visual Studio のソリューションから Visual SourceSafe の関連付けを削除する関数。
この関数が行うことは以下の3つ
- 指定したフォルダ内の全てのファイル・フォルダから、"読み取り専用" 属性を外す
- mssccprj.scc 等の VSS ファイルを全て削除
- ソリューションファイル, プロジェクトファイル ( ※ ) に記述されている VSS の設定を削除
[ パラメータ ]
solutionFolderPath
ソリューションが格納されているフォルダのパス。
[ Delete-VssRelation 関数 ]
function Delete-VssRelation
{
param ([string] $solutionFolderPath)
$solutionAllContents = Get-ChildItem $solutionFolderPath -recurse -force;
# 全てのコンテンツから読み取り専用属性を削除
foreach ($content in $solutionAllContents)
{
$contentAttributes = [System.IO.File]::GetAttributes($content.FullName);
$newContentAttributes = $contentAttributes -band (-bnot[System.IO.FileAttributes]::ReadOnly);
[System.IO.File]::SetAttributes($content.FullName, $newContentAttributes);
}
# VSS関連ファイルの削除
$vssFiles = $solutionAllContents | Where-Object{ ($_.Name -like "*.scc") -or ($_.Name -like "*.vssscc") -or($_.Name -like "*.vsscc") -or ($_.Name -like "*.vspscc"); };
if ($() -ne $vssFiles)
{
$vssFiles | Remove-Item -force;
}
# ソリューションファイルからVSS関連付けの記述を削除
$slnFiles = $solutionAllContents | Where-Object { $_.Name -like "*.sln"; };
if ($() -ne $slnFiles)
{
foreach ($slnFile in $slnFiles)
{
$slnFilePath = $slnFile.FullName;
$slnFileContents = [System.IO.File]::ReadAllText($slnFilePath, [System.Text.Encoding]::UTF8);
$newSlnFileContents = $slnFileContents -replace @("([ \t]*?GlobalSection\(SourceCodeControl\)(.|\r|\n)*?EndGlobalSection\r?\n|[ \t]*?Scc.*?\r?\n)", "");
[System.IO.File]::WriteAllText($slnFilePath, $newSlnFileContents, [System.Text.Encoding]::UTF8);
}
}
# プロジェクトファイル ( C# or VB or Web Deployment ) からVSS関連付けの記述を削除
$projFiles = $solutionAllContents | Where-Object { ($_.Name -like "*.csproj") -or ($_.Name -like "*.vbproj") -or ($_.Name -like "*.wdproj"); };
if ($() -ne $projFiles)
{
foreach ($projFile in $projFiles)
{
$projFilePath = $projFile.FullName;
$projFileContents = [System.IO.File]::ReadAllText($projFilePath, [System.Text.Encoding]::UTF8);
$newProjFileContents = $projFileContents -replace @("[ \t]*?<Scc.*?>[^<]*?</Scc.*?>\r?\n", "");
[System.IO.File]::WriteAllText($projFilePath, $newProjFileContents, [System.Text.Encoding]::UTF8);
}
}
# プロジェクトファイル ( Setup ) からVSS関連付けの記述を削除
$vdprojFiles = $solutionAllContents | Where-Object { $_.Name -like "*.vdproj"; };
if ($() -ne $vdprojFiles)
{
foreach ($vdprojFile in $vdprojFiles)
{
$vdprojFilePath = $vdprojFile.FullName;
$vdprojFileContents = [System.IO.File]::ReadAllText($vdprojFilePath, [System.Text.Encoding]::UTF8);
$newVdprojFileContents = $vdprojFileContents -replace @("[ \t]*?`"Scc.*?`".*?\r?\n", "");
[System.IO.File]::WriteAllText($vdprojFilePath, $newVdprojFileContents, [System.Text.Encoding]::UTF8);
}
}
trap
{
break;
}
}
[ 使用例 ]
Delete-VssRelation "C:\work\Solution1";
# 自分用に適当に作ったのであしからず。
【 ダウンロード 】
自作の PowerShell 関数は、以下の記事からまとめてダウンロードできます。
YokoKen.PowerShell.Scripts
// コード修正履歴
2008/08/24
・拡張子 vssscc のファイルを削除対象に含めるよう修正
2007/10/12
・foreach の際に null チェックを行うよう修正
・ソリューションファイルの中身に VSS の記述が一部残ってしまっていたので正規表現を修正
・VSS 関連ファイルの一部 ( システムファイル ) が残ってしまっていたので削除するよう修正
VSS2SVNでSubversionへ移行を行ったのですが、
VSSの参照を消す必要があり、こちらのスクリプトを使わせて頂きました。
ソリューションファイルは問題なく置き換わっていましたが
プロジェクトファイルは置き換わりませんでした。
(VB.NET 2003)
うちの環境では、
SccProjectName = "???"
SccLocalPath = "???"
SccAuxPath = "???"
SccProvider = "???"
この4行を消す必要があったので、
$newProjFileContents = $projFileContents -replace @("[ t]*?<Scc.*?>[^<]*?</Scc.*?>r?n", "");
を
$newProjFileContents = $projFileContents -replace @("[ t]*?SccProjectName(.|r|n)*?SccProvider.*?rn", "");
と手直ししたら上手く行きました。
ご報告まで。
2008.10.07 19:43 URL | sakura #z8Ev11P6 [ 編集 ]
ご報告ありがとうございます!
手元に VS 2003 が無いので検証ができないのですが
VS 2003 と VS 2005/2008 では記述が異なるのかもしれませんね
# C# と VB の違いかとも思ったのですが、VB 2008 で確認してみたところ同じでした
2008.10.08 12:39 URL | よこけん #Ay6tTHf6 [ 編集 ]
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/150-244c4f19