我有一个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)却没有。
任何帮助或指针都会被大大贬低:)
本
答案 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。我并不特别喜欢将脚本作为一个单独的进程调用,并且希望能够从脚本中返回值。
本