Попытка выполнить сценарий PowerShell 2.0 из пользовательского действия установщика .NET - PullRequest
1 голос
/ 03 ноября 2010

Я работал над этой проблемой пару дней и прочитал несколько постов здесь, но не могу заставить свою реализацию работать.Я вызываю сценарий powershell во время пользовательского действия «Зафиксировать».Когда я попадаю в метод pipe.Invoke (), я получаю исключение, в котором говорится, что весь сценарий «не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, еслипуть был включен, проверьте правильность пути и попробуйте снова. "

Вот мой сценарий:

Param(
    [parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string]$installPath
    );

schtasks /create /TN MyTask /RU domain\account /RP password /xml $installPath\MyTaskSchedule.xml;

Я пробовал его с конечными точками с запятой и без,с и без функции упаковки.Я проверил, что код C # передает правильный путь установки и что xml-файл существует в каталоге до того, как будет выполнен этот шаг.Я могу запустить это из самого PowerShell, и он работает просто отлично.

Вот мой код:

public override void Commit( System.Collections.IDictionary savedState )
{
    base.Commit( savedState );

    String targetDirectory = this.Context.Parameters["TDir"].ToString();
    String script = System.IO.File.ReadAllText( targetDirectory + "TaskScheduler.ps1" );

    RunspaceConfiguration c = RunspaceConfiguration.Create();

    using ( Runspace runspace = RunspaceFactory.CreateRunspace() )
    {
        runspace.Open();
        using ( Pipeline pipeline = runspace.CreatePipeline() )
        {
            Command myCommand = new Command( script );
            CommandParameter param = new CommandParameter( "installPath", targetDirectory.Replace("\\\\", "\\") );

            myCommand.Parameters.Add( param );
            pipeline.Commands.Add( myCommand );

            try
            {
                 pipeline.Invoke();
            }
            catch ( Exception e )
            {
                 MessageBox.Show( e.Message );
            }
        }
    }
}

Когда исключение перехватывается в pipe.Invoke, отображается весь сценарий (с$ installPath вместо фактического пути) в виде строки перед сообщением об ошибке, описанным выше.Я пробовал несколько проверок внутри самого скрипта, но я получаю одинаковые результаты, несмотря ни на что, что говорит мне о том, что пространству выполнения просто не нравится сам скрипт.

1 Ответ

0 голосов
/ 03 ноября 2010

Вы должны передать true в качестве второго параметра в конструкторе: new Command(script, true). Он говорит, что команда является кодом сценария, а не именем команды.

Вот рабочий аналог вашего кода в PowerShell:

# This script calls the external command (cmd) with passed in parameter
$script = @'
param
(
    [parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string]$installPath
)

cmd /c echo $installPath
'@

# Note: the second parameter $true tells that the command is a script code, not just a command name
$command = New-Object Management.Automation.Runspaces.Command $script, $true
$param = New-Object Management.Automation.Runspaces.CommandParameter "installPath", "C:\UTIL\INSTALL"
$command.Parameters.Add($param)

$rs = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
$rs.Open()
$pipeline = $rs.CreatePipeline()
$pipeline.Commands.Add($command)
$pipeline.Invoke()

Он печатает (на хосте консоли):

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