如何为项目中的特定文件夹中的某种类型的所有文件运行Visual Studio宏

时间:2012-04-29 23:36:53

标签: visual-studio visual-studio-2010 macros

Visual Studio 2010宏问题:

我有一个宏,我可以在另一个宏中执行以更改.aspx文件,如下所示:

DTE.ExecuteCommand("Macros.Abba.Module1.AbbaZabba")

我希望能够为解决方案资源管理器中的文件夹中的所有.aspx文件执行此操作。

例如,我的解决方案资源管理器看起来像:

解决方案'YourSolutionName'

- 项目1

- ParentFolder

--- ChildFolder

我希望能够为子文件夹中的每个.aspx文件运行此宏 - 但是没有非aspx文件。我已经寻找了几天的方法来做到这一点,但似乎没有任何工作,现在我必须在每个文件上手动运行宏,这可能需要一段时间。

我不介意手动放置文件夹名称,也不介意在运行宏之前选择文件夹。我是编码的初学者,所以引用我使用某种方法或其他方法比没有任何方法更有帮助,但没有帮助我稍微解决它。

谢谢

2 个答案:

答案 0 :(得分:1)

我最终通过拼接两种不同的方法(一种用于查找文件夹,另一种用于遍历文件)来实现自己的工作。

找到我想要的文件夹就在这里,切换触发宏:

http://msdn.microsoft.com/en-us/library/bb264485(v=vs.80).aspx

迭代宏在这里是有用的答案:

Need Visual Studio macro to add banner to all C# files

最终解决方案:

Imports System
Imports System.ComponentModel
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module iterateFolder
  Sub IterateFiles(Optional ByVal dbProjName As String = "")
    Dim project As Project
    Dim parentFolder As String = ""
    Dim courseFolder As String = ""

    If (String.IsNullOrEmpty(dbProjName)) Then
        dbProjName = InputBox("Type the database project name.")
        If (String.IsNullOrEmpty(dbProjName)) Then
            Return
        End If
    End If

    If (String.IsNullOrEmpty(parentFolder)) Then
        parentFolder = InputBox("Type the parent folder name.")
        If (String.IsNullOrEmpty(parentFolder)) Then
            Return
        End If
    End If

    If (String.IsNullOrEmpty(courseFolder)) Then
        courseFolder = InputBox("Type the child folder name.")
        If (String.IsNullOrEmpty(courseFolder)) Then
            Return
        End If
    End If

    For Each project In DTE.Solution
        Dim projectItem As EnvDTE.ProjectItem
        If (dbProjName.Equals(project.Name)) Then
            For Each projectItem In project.ProjectItems()
                If (projectItem.Name = parentFolder) Then
                    Dim subItem As EnvDTE.ProjectItem
                    For Each subItem In projectItem.ProjectItems()
                        If (subItem.Name = courseFolder) Then
                            IterateProjectFiles(subItem.ProjectItems)
                        End If
                    Next
                End If
            Next
        End If
    Next
End Sub
Private Sub IterateProjectFiles(ByVal prjItms As ProjectItems)
    For Each file As ProjectItem In prjItms
        If file.SubProject IsNot Nothing Then
            DTE.ExecuteCommand("View.SolutionExplorer")
            If file.Name.EndsWith(".aspx") Then
                file.Open()
                file.Document.Activate()
                DTE.ExecuteCommand("Macros.Abba.Module1.AbbaZabba")
            End If
            IterateProjectFiles(file.ProjectItems)
        ElseIf file.ProjectItems IsNot Nothing AndAlso file.ProjectItems.Count > 0 Then
            DTE.ExecuteCommand("View.SolutionExplorer")
            If file.Name.EndsWith(".aspx") Then
                file.Open()
                file.Document.Activate()
                DTE.ExecuteCommand("Macros.Abba.Module1.AbbaZabba")
            End If
            IterateProjectFiles(file.ProjectItems)
        Else
            DTE.ExecuteCommand("View.SolutionExplorer")
            If file.Name.EndsWith(".aspx") Then
                file.Open()
                file.Document.Activate()
                DTE.ExecuteCommand("Macros.Abba.Module1.AbbaZabba")
            End If
        End If
    Next
End Sub
End Module

您可以对项目和文件夹名称进行硬编码,或者仅对其中一些进行硬编码,或者根据您需要的多功能性将它们全部留空。

我应该注意到abbazabba宏会关闭并保存文件,但是如果这对任何人都有用,你可以从这篇帖子的第二个链接中了解如何做到这一点。

答案 1 :(得分:0)

查看Visual Studio 2010附带的“AddDirAsSlnFolder”示例宏。看起来它有很多您正在寻找的功能。