Вызов Set-Location из командлета

Я создаю командлет для PowerShell, и мне нужно иметь возможность вызывать 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, но я был бы счастлив просто изменить каталог оболочки.


person kelloti    schedule 02.08.2012    source источник


Ответы (5)


Лучшим ответом, который я смог найти, было использование InvokeScript для смены каталога:

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

Возможно, есть способ сделать это "более С#", но я не смог его найти.

person kelloti    schedule 05.08.2012

Вопрос немного старше, но вот немного более приятное решение:

Класс PathIntrinsics содержит метод SetLocation.

Чтобы управлять путем текущего сеанса, вы можете получить доступ к PathIntrinsics через SessionState с помощью свойства Path.

короче говоря:

SessionState.Path.SetLocation("C:/some/path");
person rayphi    schedule 02.03.2021

Вы можете попытаться получить CMDLET, а не PSCMDLET.

person Thomas Lee    schedule 04.08.2012

Простое использование Set-Location внутри скрипта должно работать.

Так, например:

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

Как только скрипт закончит работу, попробуйте еще раз Get-Location!

person Thomas Lee    schedule 02.08.2012
comment
Я в командлете, а не в скрипте - person kelloti; 02.08.2012

Если я использую Set-Location в сценарии, я обычно предпочитаю сначала использовать Push-Location для сохранения текущего местоположения, а затем в конце своего сценария я могу использовать Pop-Location, чтобы вернуть пользователя туда, где он был.

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

Если, конечно, целью скрипта не является изменение каталогов для пользователя.

person Dewey Vozel    schedule 03.08.2012
comment
Почему бы нет? Если я использую сценарий, который не дает мне никакой выгоды от изменения моего местоположения, он только меняет местоположение, чтобы упростить написание сценария, меня раздражало бы, если бы я не был в своем начальном местоположении после запуска сценария. Например, если вы запустили каталог «c:\program files», вы не ожидаете, что после запуска ваше местоположение изменится на c:\program files, не так ли? - person Dewey Vozel; 07.08.2012