VS2010 - 删除不在解决方案中的文件

时间:2012-03-21 15:39:35

标签: visual-studio-2010 resharper

我需要删除已从Visual Studio 2010中的解决方案中删除但尚未从文件系统中删除的文件(主要是.cs和.cshtml)。我知道如果我选择显示所有文件选项会显示这些文件,但是,我不想手动搜索它们,因为它会花费很多时间而且容易出错。

有没有办法列出这些文件?我正在使用Visual Studio 2010和Resharper 6.1(也许Resharper有一些选项可以做到这一点。)

1 个答案:

答案 0 :(得分:3)

我根据@jovball的回答编写了一个PowerShell脚本。主要区别是我将接受.sln文件并删除该解决方案中所有项目中排除的所有文件。

以下是发布此答案时脚本的版本。但请查看here以获取最新版本。

<#
.SYNOPSIS
Find all files excluded from a Visual Studio solution with options to delete.

.DESCRIPTION
Finds all excluded files in all projects in the provided Visual Studio solution with options to delete the files.

.PARAMETER Solution
The path to the .sln file

.PARAMETER VsVersion
The Visual Studio version (10, 11, 12) (Used to locate the tf.exe file)

.PARAMETER DeleteFromTfs
Mark files as pending deletion in TFS

.PARAMETER DeleteFromDisk
Delete the files directly from the disk

#>

[CmdletBinding()]
param(
    [Parameter(Position=0, Mandatory=$true)]
    [string]$Solution,
    [Parameter(Mandatory=$false)]
    [ValidateRange(10,12)] 
    [int] $VsVersion = 12,  
    [switch]$DeleteFromDisk,
    [switch]$DeleteFromTfs
)
$ErrorActionPreference = "Stop"
$tfPath = "${env:ProgramFiles(X86)}\Microsoft Visual Studio $VsVersion.0\Common7\IDE\TF.exe"
$solutionDir = Split-Path $Solution | % { (Resolve-Path $_).Path }

$projects = Select-String -Path $Solution -Pattern 'Project.*"(?<file>.*\.csproj)".*' `
    | % { $_.Matches[0].Groups[1].Value } `
    | % { Join-Path $solutionDir $_ }

$excluded = $projects | % {
    $projectDir = Split-Path $_

    $projectFiles = Select-String -Path $_ -Pattern '<(Compile|None|Content|EmbeddedResource) Include="(.*)".*' `
        | % { $_.Matches[0].Groups[2].Value } `
        | % { Join-Path $projectDir $_ }

    $diskFiles = Get-ChildItem -Path $projectDir -Recurse `
        | ? { !$_.PSIsContainer } `
        | % { $_.FullName } `
        | ? { $_ -notmatch "\\obj\\|\\bin\\|\\logs\\|\.user|\.*proj|App_Configuration\\|App_Data\\" }

    (compare-object $diskFiles $projectFiles -PassThru) | Where { $_.SideIndicator -eq '<=' }
} 

Write-Host "Found" $excluded.count "excluded files"

if ($DeleteFromTfs) 
{
    Write-Host "Marking excluded files as deleted in TFS..."
    $excluded | % {
        [Array]$arguments = @("delete", "`"$_`"")
        & "$tfPath" $arguments
    }
} 
elseif($DeleteFromDisk)
{
    Write-Host "Deleting excluded files from disk..."
    $excluded | % { Remove-Item -Path $_ -Force -Verbose}
}
else 
{
    Write-Host "Neither DeleteFromTfs or DeleteFromDisk was specified. Listing excluded files only..."
    $excluded
}