Создание дерева папок решений с использованием DTE и консоли диспетчера пакетов

Я хотел бы создать дерево папок решений, используя консоль диспетчера пакетов Visual Studio и powershell, например:

Solution 
+--- F1
     +--- F2
          +--- F3

Я могу создать первую папку с помощью этой команды:

PM> $dte.Solution.AddSolutionFolder('F1')

И я могу создать вторую папку с помощью этих команд:

PM> $f1 = $dte.Solution.ProjectItems.Item(2)
PM> $f1interface = get-interface $f1.Object ([EnvDTE80.SolutionFolder])
PM> $f1interface.AddSolutionFolder('F2')

И я могу получить ссылку на F2 (я мог бы также сохранить возвращенное значение из строки выше), выполнив это:

PM> $f2 = $f1.ProjectItems[0]

Который явно является папкой:

PM> $f2
IsDirty              : False
FileCount            : 1
Name                 : F2
Collection           : System.__ComObject
Properties           : 
DTE                  : System.__ComObject
Kind                 : {66A26722-8FB5-11D2-AA7E-00C04F688DDE}
ProjectItems         : 
Object               : System.__ComObject
ExtenderNames        : {}
ExtenderCATID        : {610d4613-d0d5-11d2-8599-006097c68e81}
Saved                : False
ConfigurationManager : 
FileCodeModel        : 
Document             : 
SubProject           : System.__ComObject
ContainingProject    : System.__ComObject

Но если я приведу это к SolutionFolder, я получу ноль:

$f2interface = Get-Interface $f2.Object ([EnvDte80.SolutionFolder])

и сейчас $f2interface -eq $null возвращает истину.

Стоит отметить, что свойство Kind папки верхнего уровня и вторичного решения отличается:

PM> $f1.Kind
{66A26720-8FB5-11D2-AA7E-00C04F688DDE}
PM> $f2.Kind
{66A26721-8FB5-11D2-AA7E-00C04F688DDE}

Я обратился к этим источникам:

1 ответ

Я столкнулся с той же проблемой, но наконец-то понял (она работает в моем скрипте powershell). Очевидно, что при поиске вложенной папки решения, в которой свойство Kind имеет guid {66A26722-8FB5-11D2-AA7E-00C04F688DDE}, это еще не правильный объект. Вы должны использовать объект в найденном предмете.

Вызывать Object для Object не очень интуитивно, но в вашем примере следующее не должно быть нулевым:

$f2interface = Get-Interface $f2.Object.Object ([EnvDte80.SolutionFolder])
Другие вопросы по тегам