2010-11-03 2 views
1

J'ai travaillé sur ce problème pendant quelques jours et j'ai lu plusieurs articles ici, mais je n'arrive pas à faire fonctionner mon implémentation. J'appelle le script powershell pendant l'action personnalisée Commit. Lorsque j'arrive à la méthode pipeline.Invoke(), j'obtiens une exception qui indique que le script entier "n'est pas reconnu comme le nom d'une cmdlet, d'une fonction, d'un fichier de script ou d'un programme exploitable. un chemin a été inclus, vérifiez que le chemin est correct et réessayez. "Tentative d'exécution du script PowerShell 2.0 à partir de l'action personnalisée d'un programme d'installation .NET

Voici mon script:

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

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

Je l'ai essayé avec et sans les points-virgules suivi, avec et sans fonction d'emballage. J'ai vérifié que le code C# passe le chemin d'installation correct et que le fichier xml existe dans le répertoire avant que cette étape soit atteinte. Je peux l'exécuter depuis PowerShell lui-même et ça marche très bien.

Voici mon code:

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); 
      } 
     } 
    } 
} 

Lorsque l'exception est pris à pipeline.Invoke, le script entier est affiché (avec la installPath $ au lieu du chemin réel) en tant que chaîne avant que le message d'erreur détaillé au dessus. J'ai essayé plusieurs vérifications dans le script lui-même, mais j'obtiens les mêmes résultats, quoi que ce soit, ce qui me dit que l'espace d'exécution n'aime pas le script lui-même.

Répondre

0

Vous devez transmettre true comme second paramètre dans le constructeur: new Command(script, true). Il indique que la commande est un code de script, pas un nom de commande.

Voici un travail analogue PowerShell de votre code:

# 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() 

Il imprime (dans l'hôte de la console):

C:\UTIL\INSTALL 
+0

Quelque chose si simple o.o Merci beaucoup! – norepro

Questions connexes