C# cmdlet中的调用集位置

C# cmdlet中的调用集位置,c#,powershell,cmdlets,C#,Powershell,Cmdlets,我正在为PowerShell创建cmdlet,我需要能够从cmdlet中调用Set Location(也称cd)。我会这样做 var setLocation = new Microsoft.PowerShell.Commands.SetLocationCommand(); setLocation.Path = path; setLocation.Invoke(); 除了它给我的错误是,您不能调用从PSCmdlet派生的cmdlet。我想使用设置位置,但我很乐意只更改shell的目录。只需在脚本

我正在为PowerShell创建cmdlet,我需要能够从cmdlet中调用
Set Location
(也称
cd
)。我会这样做

var setLocation = new Microsoft.PowerShell.Commands.SetLocationCommand();
setLocation.Path = path;
setLocation.Invoke();

除了它给我的错误是,
您不能调用从PSCmdlet
派生的cmdlet。我想使用
设置位置
,但我很乐意只更改shell的目录。

只需在脚本中使用设置位置就可以了

例如:

# Script.ps1
CD ~
Get-Location
Set-Location c:\Windows
Get-location

脚本完成后,再次尝试获取位置

如果我在脚本中使用Set Location,我通常会首先使用Push Location来存储当前位置,然后在脚本结束时,我可以使用Pop Location将用户返回到他们所在的位置

Push-Location $PWD
Set-Location $somewhere
#script body
Pop-Location

当然,除非脚本的目的是为用户更改目录。

您可以尝试从CMDLET而不是PSCMDLET派生。

我能找到的最佳答案是使用
InvokeScript
更改目录:

InvokeCommand.InvokeScript(string.Format("Set-Location {0}", fullPath));

有可能有一种“更多的C#”方法可以做到这一点,但我找不到它。

这个问题有点老,但这里有一个更好的解决方案:

该类包含该方法

要操纵当前会话的路径,可以使用属性通过访问

长话短说:

SessionState.Path.SetLocation("C:/some/path");

我在cmdlet中,而不是脚本中为什么不?如果我使用的脚本没有从更改位置中获得任何好处,它只会更改位置以使脚本更易于编写,如果脚本运行后我不在起始位置,它会让我感到恼火。例如,如果您运行dir'c:\program files',您不会期望在运行之后您的位置被更改为c:\program files,是吗?