-1

dllCmdlet命令创建了一个(参见 Get_DemoNames.cs)。从这里cmdlet我称之为方法UpdateXml(),到目前为止一切正常。但UpdateXml()如果文件不存在,也会创建文件。当我UpdateXml() 像这样调用类文件时:

var parser = new Parser();
parser.UpdateXml();

我运行项目,它进入正确的目录。

但是,如果我加载导入的 dll 并DemoNames在单独的测试项目中运行命令,如下所示:

PM> Import-Module C:\projects\EF.XML\EF.XML.dll
PM> DemoNames

程序转到错误的目录,导致以下错误:

Get-DemoNames:拒绝访问路径“C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\beheer_extern\config”。在 line:1 char:10 + DemoNames <<<< + CategoryInfo : NotSpecified: (:) [Get-DemoNames], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,EF.XML.Get_DemoNames

我在网上搜索了这个错误,发现其他人可以通过将这一行添加到构造函数来解决它:

public Parser()
{
    AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory);
}

这给了我另一个错误的路径:

Get-DemoNames :拒绝访问路径“C:\Windows\system32\beheer_extern\config”。在 line:1 char:10 + DemoNames <<<< + CategoryInfo : NotSpecified: (:) [Get-DemoNames], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,EF.XML.Get_DemoNames

Get_DemoNames.cs

namespace EF.XML
{
using System;
using System.Linq;
using System.Management.Automation;

[Cmdlet(VerbsCommon.Get, "DemoNames")]
public class Get_DemoNames : PSCmdlet
{

    [Parameter(Position = 0, Mandatory = false)]
    public string prefix;

    protected override void ProcessRecord()
    {

        var names = new[] { "Chris", "Charlie", "Isaac", "Simon" };

        if (string.IsNullOrEmpty(prefix))
        {
            WriteObject(names, true);
        }
        else
        {
            var prefixed_names = names.Select(n => prefix + n);

            WriteObject(prefixed_names, true);
        }

        System.Diagnostics.Debug.Write("hello");

        var parser = new Parser();
        parser.UpdateXml();

    }

  }
}

解析器.cs

 public class Parser
{
    public void UpdateXml()
    {
                var directoryInfo = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); // www directory

                var path = Path.Combine(directoryInfo.FullName, @"beheer_extern\config");

                //Creates the beheer_extern\config directory if it doesn't exist, otherwise nothing happens.
                Directory.CreateDirectory(path);

                var instellingenFile = Path.Combine(path, "instellingen.xml");
                var instellingenFileDb = Path.Combine(path, "instellingenDb.xml");

                //Create instellingen.xml if not already existing
                if (!File.Exists(instellingenFile))
                {
                    using (var writer = XmlWriter.Create(instellingenFile, _writerSettings))
                    {
                        var xDoc = new XDocument(
                            new XElement("database", string.Empty, new XAttribute("version", 4)));
                        xDoc.WriteTo(writer);
                    }
                }
      }
}

如何获得项目的正确目录(www 目录)?

4

2 回答 2

0

好的,所以您正在尝试从包管理器控制台中访问在 Visual Studio 中加载的项目。

知道可执行文件是Visual Studio,因此AppDomain.CurrentDomain.BaseDirectory将是 Visual Studio 安装目录。它绝对不会是当前项目的目录。

为了获取当前加载的解决方案的项目目录,您需要通过自动化与正在运行的 Visual Studio 实例进行交互。通常,这是通过编写扩展或通过 Visual Studio 核心自动化(又名EnvDTE com 对象)来完成的。这很复杂。想要这样做吗?您可能必须拿起一本关于该主题的书并阅读。

幸运的是,PMC 确实提供了一个 cmdlet,可以为您大大简化这一过程—— get-project。它返回项目的 DTE 表示,然后您可以使用它来获取项目文件的完整文件名,您可以从中获取目录名称。

这些是您需要的零件。至于从您的代码中调用 cmdlet,这是另一个问题。

于 2015-10-21T17:04:29.773 回答
0

使固定

我设法让它使用以下代码

Get_DemoNames.cs

namespace EF.XML
{
using System;
using System.Linq;
using System.Management.Automation;

[Cmdlet(VerbsCommon.Get, "DemoNames")]
public class Get_DemoNames : PSCmdlet
{

[Parameter(Position = 0, Mandatory = false)]
public string prefix;

protected override void ProcessRecord()
{

    var names = new[] { "Chris", "Charlie", "Isaac", "Simon" };

    if (string.IsNullOrEmpty(prefix))
    {
        WriteObject(names, true);
    }
    else
    {
        var prefixed_names = names.Select(n => prefix + n);

        WriteObject(prefixed_names, true);
    }

    //added
    const string networkPath = "Microsoft.PowerShell.Core\\FileSystem::";
    var currentPath = SessionState.Path.CurrentFileSystemLocation.Path;

    var curProjectDir = currentPath.Substring(networkPath.Length); 

    WriteObject(curProjectDir);

    System.Diagnostics.Debug.Write("hello");

    var parser = new Parser {CurrentProjectDirectory = curProjectDir };
    parser.UpdateXml();

    }

  }
}

解析器.cs

public class Parser
{    



public string CurrentProjectDirectory{ get; set; }

public void UpdateXml()
{

    var wwwDirectory = Path.Combine(CurrentProjectDirectory, @"www"); // www directory

    var path = Path.Combine(wwwDirectory, @"beheer_extern\config");

    //Creates the beheer_extern\config directory if it doesn't exist, otherwise nothing happens.
    Directory.CreateDirectory(path);

    var instellingenFile = Path.Combine(path, "instellingen.xml");
    var instellingenFileDb = Path.Combine(path, "instellingenDb.xml");

    //Create instellingen.xml if not already existing
    if (!File.Exists(instellingenFile))
    {
        using (var writer = XmlWriter.Create(instellingenFile, _writerSettings))
        {
            var xDoc = new XDocument(
                new XElement("database", string.Empty, new XAttribute("version", 4)));
            xDoc.WriteTo(writer);
        }
    }
  }
}

我也试过EnvDTE哪个也有效。

所需进口:

using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.Shell;

获取当前解决方案(路径)的代码:

 DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

        if (dte2 != null)
        {
            WriteObject(dte2.Solution.FullName);
        }
于 2015-10-22T13:21:55.547 回答