Приложение C #, вызывающее проблемы скрипта Powershell - PullRequest
2 голосов
/ 17 марта 2010

У меня есть приложение C # Winforms, которое вызывает простой скрипт 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 #) - нет.

Любая помощь или указатели будут высоко оценены :)

Ben

Ответы [ 3 ]

3 голосов
/ 17 марта 2010

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

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

PowerShell.Create (). AddScript ("get-childitem -literalPath hklm: \ software"). Invoke ()

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

Надеюсь, это поможет

1 голос
/ 17 марта 2010

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

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

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

Вызов определенной функции PowerShell из командной строки

0 голосов
/ 19 марта 2010

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

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

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

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

Ben

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