我有一个带有静态方法的 DLL,它想知道当前目录。我加载库
c:\temp> add-type -path "..."
...并调用该方法
c:\temp> [MyNamespace.MyClass]::MyMethod()
但两者Directory.GetCurrentDirectory()
和 。Environment.CurrentDirectory
获取当前目录错误...
这样做的正确方法是什么?
我有一个带有静态方法的 DLL,它想知道当前目录。我加载库
c:\temp> add-type -path "..."
...并调用该方法
c:\temp> [MyNamespace.MyClass]::MyMethod()
但两者Directory.GetCurrentDirectory()
和 。Environment.CurrentDirectory
获取当前目录错误...
这样做的正确方法是什么?
您可以在 powershell 中拥有两个可能的“目录”。一个是进程的当前目录,可通过Environment.CurrentDirectory
或获得Directory.GetCurrentDirectory()
。另一个“目录”是当前 Powershell Provider 中的当前位置。这是您在命令行中看到的内容,可通过get-location
cmdlet 获得。当您使用set-location
(别名 cd)时,您正在更改此内部路径,而不是进程的当前目录。
如果您想要一些使用进程当前目录的 .NET 库来获取当前位置,那么您需要明确设置它:
[Environment]::CurrentDirectory = get-location
Powershell 有一个可扩展的模型,允许像文件系统中的驱动器一样安装不同的数据源。文件系统只是众多提供者之一。您可以通过get-psprovider
. 例如,注册表提供程序允许 Windows 注册表像文件系统一样导航。另一个“功能”可让您通过dir function:
.
如果 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