2010-03-17 4 views
2

У меня есть приложение C# Winforms который звонит простой Powershell скрипт, используя следующий метод:C# Применение Вызов Powershell Проблемы сценария

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

Скрипт PowerShell просто считывает ключ реестра и выводит подразделы.

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

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

У меня есть проблема в том, что, когда я запускаю скрипт из C# приложения я получаю один набор результатов, но при запуске автономного сценария (из командной PowerShell строки) я получаю различный набор результатов полностью.

Результаты работы с C# приложения являются:

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> 

При запуске из командной PowerShell строки я получаю:

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:\> 

Второй набор результатов соответствует тому, что я имею в реестре , но первый набор результатов (который пришел из приложения C#) - нет.

Любая помощь или указатели будут значительно apreciated :)

Бен

+0

ли вы имеете в виду \ "C: \\ \\ Развивать {0} \"»вместо {1} – abatishchev

+0

любое окончательное решение об этом – Kiquenet

ответ

1

Вы работаете в 64-битной версии Windows, случайно? Это может быть разница в том, как показываются два «ульи». Попробуйте заставить приложение C# скомпилировать x86/x64 вместо «Any» в свойствах Project. Посмотрите, не имеет значения.

Кроме того, ваш синтаксис командной строки немного странно, увидеть следующую нить для больше деталей, но вы можете настроить свой синтаксис:

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 решена, Спасибо за это – Ben

+0

?! Бен, ответьте как правильный – Kiquenet

3

Это на самом деле не особенно хороший способ встроить PowerShell в C# api. Для этого есть API.

Вы можете найти пример из них на MSDN, но в вашем случае, может будет выглядеть как

PowerShell.Create() AddScript ("Get-ChildItem -LiteralPath HKLM: \ Программное обеспечение"). Invoke.()

Вы также можете проверить это blog post, в котором будет показано, как рассчитать источник внутри API и как использовать этот API для доступа к другим потокам данных в PowerShell.

Надеется, что это помогает

0

Я смотрю на альтернативных методах для вызова Powershell и наткнулся на этот API.

Я правильно понимаю, что они полагаются на Microsoft SDK ??

Я не являюсь поклонником зависимостей от внешних SDK. Я работаю в довольно крупной компании и гарантирую, что SDK установлен на всех машинах-разработчиках, будет кошмаром.

Если я ошибаюсь в своих мыслях, я открыт для лучшего способа позвонить в Powershell.Мне не особо понравилось вызывать скрипт как отдельный процесс и хотелось бы иметь возможность вернуть значения из сценария.

Бен

+0

Вы должны назвать это способом, предложенным @MediaAndMicrocode - вы УЖЕ зависеть от PowerShell, поэтому единственное различие здесь заключается в том, что вы зависите от библиотеки PowerShell, а не от исполняемого файла PowerShell - называя это его путь также избавится от этого вторичного процесса exe. – Jaykul

+0

О, и вы должны «принять» ответ Гойюкса официально :) – Jaykul

Смежные вопросы