PowerShell脚本在PowerShell中运行,但在VB.Net中无法运行。

4
我有一个简单的PowerShell脚本,用于在Exchange中启用邮箱,名为test.ps1。以下是脚本内容:
add-pssnapin microsoft.exchange.management.powershell.admin Enable-Mailbox -Identity 'gi joe' -database 'myserver\myserver mailbox database 17'
如果我进入PowerShell控制台并输入
./test.ps1
它将成功运行。但是,如果我在VB.net中调用它,使用
Process.Start("powershell", "test.ps1")
终端窗口会闪现得太快,以至于我无法看到它的输出,并且它也不会创建邮箱。这是为什么,或者如何防止终端在我读取错误信息之前消失?
1个回答

5
为了查看出错原因,请尝试使用以下方法:
Process.Start("powershell", "-noexit -file c:\<path>\test.ps1")

我怀疑你遇到的错误是因为没有提供 test.ps1 的完整路径。
另一个可能性是你的32位VB应用程序需要启动64位Powershell(插件或模块可能只在那里可用)。在这种情况下,你需要通过路径调用PowerShell,并且必须在你的路径中使用 SysNative 才能看到64位的 PowerShell 目录。
var powerShellPath = "C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe"
Process.Start(powerShellPath , "-noexit -file c:\<path>\test.ps1")

抱歉,这可能不是正确的VB语法,但应该能帮助您开始。


谢谢,结果发现错误是“没有为Windows PowerShell版本2注册任何快照”。这很奇怪,因为脚本的第一行添加了快照。我能否替换“powershell”以包含所有模块的powershell?这样我就不需要那行代码添加快照了。 - Pickle
@Austin,这听起来像是你遇到了32位与64位的问题。当你在32位shell中注册一个snapin时,它不会自动在64位shell中注册,反之亦然。你的VB应用程序是以64位还是32位运行的? - Keith Hill
是的,请使用32位版本powershell的路径,例如C:\ Windows \ SysWow64 \ WindowsPowershell \ v1.0 \ powershell.exe。当然,您可能希望使用System.Environment类获取windir环境变量,而不是硬编码c:\ windows - Keith Hill
我尝试将其指向PowerShell的32位版本和64位版本,但除非我将目标CPU设置为任何CPU,否则它不起作用。它只是忽略了我的脚本中的“add-pssnapin”行。 - Pickle
好的,这很奇怪。当您将VB.NET应用程序运行为AnyCPU时,它会以64位运行,因此当您启动“powershell”(无路径)时,它会启动64位版本的PowerShell(标题栏应该带有x64),并且脚本可以正常工作。但是,如果您在VB.NET应用程序中切换到x86,它将以32位运行,启动32位PowerShell(标题栏中是x86),但是无法运行脚本-显示“未注册任何Snap-in”。但是,当您手动从32位PowerShell运行脚本时,脚本可以正常工作。这真是太奇怪了。您是否在不同的凭据下启动PowerShell或禁止用户配置文件加载? - Keith Hill
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接