C#应用程序调用Powershell脚本问题

时间:2010-03-17 13:49:44

标签: c# powershell registry

我有一个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#app运行的结果是:

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#app)却没有。

任何帮助或指针都会被大大贬低:)

3 个答案:

答案 0 :(得分:3)

这实际上不是将PowerShell嵌入C#api的特别好方法。有这方面的API。

您可以在MSDN上找到它们的示例,但在您的情况下,可能看起来像

PowerShell.Create()。AddScript(“get-childitem -literalPath hklm:\ software”)。Invoke()

您还可以查看此blog post,它将向您展示如何在API内部添加源代码以及如何使用此API来获取PowerShell中的其他数据流。

希望这有帮助

答案 1 :(得分:1)

您是否偶然运行64位版本的Windows?这两个“荨麻疹”的展示方式可能有所不同。尝试强制您的C#应用​​程序编译为x86 / x64而不是Project属性中的“Any”。看看这是否有所不同。

此外,您的命令行语法有点奇怪,请参阅以下主题以获取更多详细信息,但您可能需要调整语法:

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

答案 2 :(得分:0)

我确实看过调用Powershell的替代方法并遇到了这个API。

我是否正确地认为他们依赖于Microsoft SDK?

我真的不喜欢外部SDK的依赖。我在一家相当大的公司工作,并确保在所有开发人员的机器上安装SDK将是一场噩梦。

如果我的想法错了,我愿意接受一个更好的方式来召唤Powershell。我并不特别喜欢将脚本作为一个单独的进程调用,并且希望能够从脚本中返回值。