2

我有一个带有静态方法的 DLL,它想知道当前目录。我加载库

c:\temp> add-type -path "..."

...并调用该方法

c:\temp> [MyNamespace.MyClass]::MyMethod()

但两者Directory.GetCurrentDirectory()和 。Environment.CurrentDirectory获取当前目录错误...

这样做的正确方法是什么?

4

2 回答 2

7

您可以在 powershell 中拥有两个可能的“目录”。一个是进程的当前目录,可通过Environment.CurrentDirectory或获得Directory.GetCurrentDirectory()。另一个“目录”是当前 Powershell Provider 中的当前位置。这是您在命令行中看到的内容,可通过get-locationcmdlet 获得。当您使用set-location(别名 cd)时,您正在更改此内部路径,而不是进程的当前目录。

如果您想要一些使用进程当前目录的 .NET 库来获取当前位置,那么您需要明确设置它:

[Environment]::CurrentDirectory = get-location

Powershell 有一个可扩展的模型,允许像文件系统中的驱动器一样安装不同的数据源。文件系统只是众多提供者之一。您可以通过get-psprovider. 例如,注册表提供程序允许 Windows 注册表像文件系统一样导航。另一个“功能”可让您通过dir function:.

于 2013-09-18T03:37:58.060 回答
1

如果 DLL 中的命令继承自System.Management.Automation.PSCmdLet,则当前 PS 位置在SessionState.Path.

public class SomeCommand : PSCmdlet
{
    protected override void BeginProcessing()
    {
      string currentDir = this.SessionState.Path.CurrentLocation.Path;
    }
}

要在没有会话引用的情况下到达路径,此代码似乎有效。这个解决方案是我在通过在PS GIT Completions中使 GIT 自动完成的代码后找到的,特别是这里的这个函数

public class Test
{
  public static IEnumerable<string> GetPath()
  {
    using (var ps = PowerShell.Create(RunspaceMode.CurrentRunspace))
    {
      ps.AddScript("pwd");
      var path = ps.Invoke<PathInfo>();
      return path.Select(p => p.Path);
    }
  }
}

输出:

PS C:\some\folder> [Test]::GetPath()
C:\some\folder
于 2019-05-30T11:53:15.287 回答