C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/07/30 23:27
ビルド自動化のために。
PowerShell で Visual Studio のソリューションから Visual SourceSafe の関連付けを削除する関数。
この関数が行うことは以下の3つ
  • 指定したフォルダ内の全てのファイル・フォルダから、"読み取り専用" 属性を外す
  • mssccprj.scc 等の VSS ファイルを全て削除
  • ソリューションファイル, プロジェクトファイル ( ※ ) に記述されている VSS の設定を削除
※ C# プロジェクト, VB プロジェクト, Web 配置プロジェクト, セットアッププロジェクトに対応。


[ パラメータ ]
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