2010-03-17 4 views
2

J'ai une application C# Winforms qui appelle un simple script Powershell en utilisant la méthode suivante:application C# Appel Powershell Script Questions

Process process = new Process(); 
process.StartInfo.FileName = @"powershell.exe"; 
process.StartInfo.Arguments = String.Format("-noexit \"C:\\Develop\\{1}\"", scriptName); 
process.Start(); 

Le script Powershell lit simplement une clé de Registre et délivre les sous-clés.

$items = get-childitem -literalPath hklm:\software 

foreach($item in $items) 
{ 
Write-Host $item 
} 

Le problème que j'ai est que je reçois un ensemble différent de résultats quand je lance le script de l'application C# je reçois un ensemble de résultats, mais quand je lance la version autonome de script (à partir de la ligne de commande PowerShell) entièrement.

Les résultats de l'exécution du C# application sont:

HKEY_LOCAL_MACHINE\software\Adobe 
HKEY_LOCAL_MACHINE\software\Business Objects 
HKEY_LOCAL_MACHINE\software\Helios 
HKEY_LOCAL_MACHINE\software\InstallShield 
HKEY_LOCAL_MACHINE\software\Macrovision 
HKEY_LOCAL_MACHINE\software\Microsoft 
HKEY_LOCAL_MACHINE\software\MozillaPlugins 
HKEY_LOCAL_MACHINE\software\ODBC 
HKEY_LOCAL_MACHINE\software\Classes 
HKEY_LOCAL_MACHINE\software\Clients 
HKEY_LOCAL_MACHINE\software\Policies 
HKEY_LOCAL_MACHINE\software\RegisteredApplications 
PS C:\Develop\RnD\SiriusPatcher\Sirius.Patcher.UI\bin\Debug> 

Lorsqu'il est exécuté à partir de la ligne de commande PowerShell je reçois:

PS M:\> C:\Develop\RegistryAccess.ps1 
HKEY_LOCAL_MACHINE\software\ATI Technologies 
HKEY_LOCAL_MACHINE\software\Classes 
HKEY_LOCAL_MACHINE\software\Clients 
HKEY_LOCAL_MACHINE\software\Equiniti 
HKEY_LOCAL_MACHINE\software\Microsoft 
HKEY_LOCAL_MACHINE\software\ODBC 
HKEY_LOCAL_MACHINE\software\Policies 
HKEY_LOCAL_MACHINE\software\RegisteredApplications 
HKEY_LOCAL_MACHINE\software\Wow6432Node 
PS M:\> 

La deuxième série de résultats correspondent à ce que j'ai dans le registre , mais le premier ensemble de résultats (qui proviennent de l'application C#) ne le fait pas.

Toute aide ou pointeurs seraient grandement aprécié :)

Ben

+0

Voulez-vous dire \ "C: \\ Développer \\ {0} \" » au lieu de {1} – abatishchev

+0

une solution finale à ce sujet – Kiquenet

Répondre

1

Êtes-vous en cours d'exécution d'une version 64 bits de Windows par hasard? Cela pourrait être une différence dans la façon dont les deux "ruches" sont montrées. Essayez de forcer votre application C# à compiler en x86/x64 au lieu de "Tout" dans les propriétés du projet. Voyez si cela fait toute la différence.

En outre, votre syntaxe de ligne de commande est un peu étrange, voir le fil suivant pour plus de détails, mais vous pouvez ajuster votre syntaxe:

String cmd = "-Command "& { . \"" + scriptName + "\" }"; 
Process process = new Process(); 
process.StartInfo.FileName = @"powershell.exe"; 
process.StartInfo.Arguments = cmd; 
process.Start(); 

Calling a specific PowerShell function from the command line

+0

Awesome..Problem résolu, Merci pour cette – Ben

+0

! Ben, marquez la réponse comme correcte – Kiquenet

3

Ceci est en fait pas particulièrement bon moyen d'intégrer PowerShell dans une API C#. Il y a des API pour ça.

Vous pouvez trouver un exemple d'entre eux sur MSDN, mais dans votre cas, pourrait ressemblerait

PowerShell.Create() addScript ("get-childitem -LiteralPath HKLM: \ software"). Invoke.()

Vous pouvez également consulter ce blog post, qui vous montrera comment doter la source à l'intérieur de l'API et comment utiliser cette API pour obtenir les autres flux de données dans PowerShell.

Hope this helps

0

Je ne regarde d'autres méthodes pour appeler Powershell et est tombé sur cette API.

Ai-je raison de penser qu'ils s'appuient sur un Microsoft SDK ?? Je ne suis pas vraiment un fan des dépendances sur les SDK externes. Je travaille dans une assez grande entreprise et m'assurer que le SDK est installé sur toutes les machines des développeurs serait un cauchemar.

Si je me trompe dans ma réflexion, je suis ouvert à une meilleure façon d'appeler Powershell.Je n'aimais pas particulièrement appeler le script en tant que processus séparé et aimerais avoir la possibilité d'avoir des valeurs retournées par le script.

Ben

+0

Vous devriez l'appeler de la façon suggérée par @MediaAndMicrocode - vous dépendez déjà de PowerShell - donc la seule différence ici est que vous dépendez de la bibliothèque PowerShell au lieu de l'exécutable PowerShell - appelez-le sa façon de se débarrasser de ce processus exe secondaire aussi – Jaykul

+0

Oh, et vous devriez "accepter" la réponse de Goyuix officiellement :) – Jaykul

Questions connexes