Установка стартового каталога при вызове Powershell из .NET? - PullRequest
15 голосов
/ 22 мая 2009

Я использую API-интерфейс System.Management.Automation для вызова сценариев PowerShell приложением WPF на C #. В следующем примере, как бы вы изменили начальный каталог ($ PWD), чтобы он выполнял foo.ps1 из C: \ scripts \ вместо расположения .exe, из которого он был вызван?

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
    runspace.Open();
    using (Pipeline pipeline = runspace.CreatePipeline())
    {
        pipeline.Commands.Add(@"C:\scripts\foo.ps1");
        pipeline.Invoke();
    }
    runspace.Close();
}

Ответы [ 4 ]

10 голосов
/ 18 сентября 2013

Вам не нужно менять System.Environment.CurrentDirectory, чтобы изменить рабочий путь для ваших скриптов PowerShell. Это может быть довольно опасно, потому что это может привести к непреднамеренным побочным эффектам, если вы запускаете другой код, чувствительный к вашему текущему каталогу.

Поскольку вы предоставляете Runspace, все, что вам нужно сделать, это установить свойства Path для SessionStateProxy:

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
    runspace.Open();
    runspace.SessionStateProxy.Path.SetLocation(directory);
    using (Pipeline pipeline = runspace.CreatePipeline())
    {
        pipeline.Commands.Add(@"C:\scripts\foo.ps1");
        pipeline.Invoke();
    }
    runspace.Close();
}
7 голосов
/ 27 мая 2009

Установка System.Environment.CurrentDirectory с опережением времени сделает то, что вы хотите.

Вместо того, чтобы добавлять Set-Location в свой скрипт, вы должны установить System.Environment.CurrentDirectory в любое время до открытия области выполнения. Он будет наследовать то, чем является CurrentDirectory, когда он открыт:

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
    System.Environment.CurrentDirectory = "C:\\scripts";
    runspace.Open();
    using (Pipeline pipeline = runspace.CreatePipeline())
    {
        pipeline.Commands.Add(@".\foo.ps1");
        pipeline.Invoke();
    }
    runspace.Close();
}

И помните, Set-Location не устанавливает CurrentDirectory фреймворка .net, поэтому, если вы вызываете методы .Net, которые работают в "текущем" местоположении, вам нужно установить его самостоятельно.

3 голосов
/ 22 мая 2009

Что-то не так с делом:

pipeline.Commands.AddScript(@"set-location c:\scripts;.\foo.ps1")

-Oisin

1 голос
/ 22 мая 2009

Вы можете установить рабочий каталог в powershell с помощью следующей команды

set-location c:\mydirectory

Вы также можете попробовать скрипт запуска PowerShell ($ profile). C: .... \ MyDocs \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1 Но только если этот каталог исправлен и не изменяется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...