我有一个VB.net应用程序,我从我的vb.net窗口应用程序中调用PowerShell上的Import-Module
,但错误说它无法找到该模块。错误如下。
Import-Module:指定的模块' MSOnline'未加载,因为在任何模块目录中找不到有效的模块文件。
当我通过常规方式从外部启动PowerShell加载相同的模块时,它可以正常工作。图片如下。
VB脚本如下
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim procStartInfo As New ProcessStartInfo
Dim procExecuting As New Process
With procStartInfo
.UseShellExecute = True
.FileName = "powershell.exe"
.WindowStyle = ProcessWindowStyle.Normal
.Verb = "runas" 'add this to prompt for elevation
Dim psscript As String = My.Resources.mymsolPS
procStartInfo.Arguments = psscript
procExecuting = Process.Start(procStartInfo)
End With
End Sub
我的PowerShell脚本作为txt文件保存在my.resource中。我的PowerShell脚本如下所示。
Import-Module Msonline
Connect-msolService
我将PowerShell脚本替换为Get-Help
,只有当我使用Import-Module
Msonline时才能正常工作。
可以共享的另一个信息是模块存储在以下位置。
C:\ Windows \ System32下\ WindowsPowerShell \ V1.0 \模块\ MSOnline \ MSOnline.psd1
非常感谢任何帮助。 在此先感谢
更新2: 更多的摆弄它发现了一些我不确定是否相关的事情。
如果我从我的VB.net中启动powershell并运行以下命令,我就无法看到MSOnline模块。
PS C:\windows\system32>> cd $env:WINDIR\System32\WindowsPowerShell\v1.0\Modules\
PS C:\windows\System32\WindowsPowerShell\v1.0\Modules>> dir
如果我直接从我的系统运行PowerShell并运行上面的脚本,我可以看到模块
d----- 11/22/2017 2:59 PM MSOnline
对我来说仍然是个谜,我无法破解。 :(
答案 0 :(得分:0)
我注意到的差异是从您的应用程序启动时,或者在本地启动时,该目录是您的用户或系统..所以可能PS正在加载它无法找到模块。
如果您提供模块的完整路径怎么样?
我使用RunSpace运气好得多 - 我用它来传递任何powershell命令 - 这里是其中一个站点的片段和一些例子:
'Create the runspace.
Using R As System.Management.Automation.Runspaces.Runspace = _
System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace()
'Create the pipeline
Using P As System.Management.Automation.Runspaces.Pipeline = R.CreatePipeline()
'Open the runspace.
R.Open()
'Create each command (in this case just one)...
Dim Cmd As New System.Management.Automation.Runspaces.Command("C:\script.ps1", True)
'...and add it to the pipeline.
P.Commands.Add(Cmd)
'Execute the commands and get the response.
Dim Result As System.Collections.ObjectModel.Collection(Of _
System.Management.Automation.PSObject) = P.Invoke()
'Close the runspace.
R.Close()
'Display the result in the console window.
For Each O As System.Management.Automation.PSObject In Result
Console.WriteLine(O.ToString())
Next
End Using
End Using
最后一个提供了它正在做的非常可靠的细分。如果你不能让它工作,请告诉我,我可以尝试查看此导入是否适用于某个应用。
答案 1 :(得分:0)
我实际上经过数小时的疼痛后找到了解决方案。这是非常愚蠢的解决方案。
我去了我的应用程序属性我发现首选运行设置为32位因此当我从其中启动我的PowerShell时,它正在SYSWOW下寻找模块,它假设在System32下查看它。我取消选中" Preferred 32 BIT"而不是从系统32导入模块。
以为我应该分享这个愚蠢的错过,以便其他人不应该遭受同样的痛苦。