![](/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.