【问题标题】:Call Set-Location from within a cmdlet从 cmdlet 中调用 Set-Location
【发布时间】:2012-07-31 00:59:30
【问题描述】:

我正在为 PowerShell 创建一个 cmdlet,我需要能够从 cmdlet 中调用Set-Location(又名cd)。我会这样做

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

除了它给了我一个错误,上面写着You cannot invoke a cmdlet that derrives from PSCmdlet。我想使用 Set-Location,但我很乐意只更改 shell 的目录。

【问题讨论】:

    标签: c# powershell cmdlets


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      PathIntrinsics包含方法SetLocation

      要操作当前会话的路径,您可以使用Path 属性通过SessionState 访问PathIntrinsics

      长话短说:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          只需在脚本中使用 Set-Location 即可完成工作。

          例如:

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

          脚本完成后,再次尝试 Get-Location!

          【讨论】:

          • 我使用的是 cmdlet,而不是脚本
          【解决方案5】:

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

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

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

          【讨论】:

          • 为什么不呢?如果我使用的脚本对更改我的位置没有任何好处,它只会更改位置以使脚本更易于编写,如果脚本运行后我不在我的起始位置,我会很恼火。例如,如果您运行 dir 'c:\program files' 您不会期望在运行后您的位置会更改为 c:\program files 吗?
          猜你喜欢
          • 1970-01-01
          • 2013-03-16
          • 2020-10-07
          • 2013-06-08
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 2021-04-28
          • 2017-10-16
          相关资源
          最近更新 更多