![](/img/trans.png)
[英]Powershell module loading stops in C# code when Write-Progress is used
[英]Loading a Powershell Module from the C# code of a custom Provider
我一直在“非常需要”一个非常特定的功能,以绑定到我用C#编写的自定义提供程序。
基本上,我着手寻找一种方法来复制
A:
B:
等功能在PowerShell加载时定义,因此无需键入
CD A:
您可以执行上述操作
A:
我首先尝试让提供程序将功能注入到运行空间中,但是似乎我完全错过了使它起作用的时间,所以我走了另一条路。
基本上我有一个非常简单的PSM1文件UseColons.psm1
function Use-ColonsForPSDrives
{
[CmdletBinding()] Param()
Write-Verbose "Looping Through Installed PowerShell Providers"
Get-PSProvider | % `
{
Write-Verbose "Found $($_.Name) checking its drives"
$_.Drives | ? { (Get-Command | ? Name -eq "$($_.Name):") -eq $null } | `
{
Write-Verbose "Setting up: `"function $($_.Name):() {Set-Location $($_.Name):}`""
if ($Verbose)
{
. Invoke-Expression -Command "function $($_.Name):() {Set-Location $($_.Name):}"
}
else
{
. Invoke-Expression -Command "function $($_.Name):() {Set-Location $($_.Name):}" -ErrorAction SilentlyContinue
}
Write-Verbose "Finished with drive $($_.Name)"
}
}
# Cert and WSMan do not show up as providers until you try to naviagte to their drives
# As a result we will add their functions manually but we will check if they are already set anyways
if ((Get-Command | ? Name -eq "Cert:") -eq $null) { . Invoke-Expression -Command "function Cert:() {Set-Location Cert:}" }
if ((Get-Command | ? Name -eq "WSMan:") -eq $null) { . Invoke-Expression -Command "function WSMan:() {Set-Location WSMan:}" }
}
. Use-ColonsForPSDrives
简单来说,它遍历所有已加载的提供程序,然后遍历每个提供程序的所有驱动器,然后检查Function:驱动器是否包含与{DriveName}:格式匹配的函数,如果找不到,则创建一个。
psd1文件只不过是导出所有功能
它存储在其自己的文件夹下的%ProgramFiles%\\ WindowsPowerShell \\ Modules路径中
最后我在%windir%\\ system32 \\ windowspowershell \\ v1.0目录下有profile.ps1
Remove-Module UseColons -ErrorAction SilentlyContinue
Import-Module UseColons
因此,当我加载PowerShell或ISE时,如果我想通过变量说出dir,我可以直接调用
Variable:
或者,如果我需要切换回注册表
HKLM:
HKCU:
当您与多个提供商合作时,在切换时一遍又一遍地键入该CD只会令人讨厌。
现在,对于这个问题,我仍在开发最初打算用于的实际PowerShell提供程序。 但是,当我调试它时,UseColons模块在Visual Studio转过来并加载新的提供程序之前就已加载,因此,如果我再次手动删除并导入该模块,它将完成它的工作,并且我将为提供程序提供所有驱动功能。
在长解释之后,我想知道我该怎么做:
我不想从我的标准配置文件中删除它,因为当我不使用新提供程序并且只是使用Powershell来管理内容时,它非常有用。
希望有人可以给我一些想法,或为我提供一些更深入的潜水Powershell提供商文档和操作方法的指导。
在您的模块清单( .psd1
)中,您有一个DLL作为RootModule吗?
这是一个可怕的骇客,对将来创建的驱动器无济于事,但是...
在模块清单中,而不是将YourProvider.dll用作RootModule,而应使用Dummy.psm1(可以是一个空文件)。 然后,对于NestedModules,使用@( 'YourProvider.dll', 'UseColons' )
。 这样可以在UseProvider.dll 之后加载UseColons模块。 (假人将是最后的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.