Powershell v4 non importa automaticamente il modulo

Sto usando Microsoft PowerShell v4 :

 PS C:\> get-host Name : ConsoleHost Version : 4.0 InstanceId : 3b4b6b8d-70ec-46dd-942a-bfecf5fb6f31 UI : System.Management.Automation.Internal.Host.InternalHostUserInterface CurrentCulture : de-CH CurrentUICulture : en-US PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy IsRunspacePushed : False Runspace : System.Management.Automation.Runspaces.LocalRunspace 

Ho sviluppato un progetto C # in Visual Studio 2012 per il targeting di .NET Framework 4 che contiene alcuni Cmdlet e Snapin . Posso eseguire il debug di loro e tutto funziona bene.

Ho creato il percorso C:\PowerShell\Modules\ e l’ho aggiunto alla variabile d’ambiente PSModulePath .

Ho inserito il r MySnapIn.dll nel percorso C:\PowerShell\Modules\MySnapIn .

Mi aspetto che il modulo venga caricato automaticamente così ho i miei nuovi cmdlet pronti per l’uso, ma non lo sono: il modulo non è caricato. Devo scrivere il Import-Module MySnapin per caricarlo.

Come posso caricare automaticamente il modulo?

Se si desidera caricarlo automaticamente, è ansible aggiungere la riga di comando Import-Module MySnapin al profilo PowerShell .

Per trovare la posizione del tuo profilo PowerShell, digita $profile in un PowerShell e per impostazione predefinita il percorso del profilo è:

 C:\Documents and Settings\User\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 

Se il file Microsoft.PowerShell_profile.ps1 non esiste, basta crearlo.

Una lista di controllo che può aiutarti a identificare il problema:

  1. In base alle novità di Windows PowerShell , “L’importazione automatica dei moduli viene triggersta da (a) utilizzando il cmdlet in un comando, (b) esegue Get-Command per un cmdlet senza caratteri jolly o (C) esegue Get-Help per un cmdlet senza caratteri jolly. ” (Questo vale per V3 e V4.) Come hai confermato che il modulo non è stato caricato?

  2. Secondo about_Modules , “Solo i moduli che sono memorizzati nella posizione specificata dalla variabile di ambiente PSModulePath vengono importati automaticamente.” Hai affermato di aver aggiunto il tuo percorso a PSModulePath. Quando esamino il mio, vedo che ogni percorso incluso è terminato con una barra rovesciata, quindi nel tuo caso avresti bisogno di C:\PowerShell\Modules\ piuttosto che C:\PowerShell\Modules . Qual è il valore del tuo $env:PsModulePath ?

  3. Secondo questo post di Thomas Lee e della mia esperienza, il caricamento automatico non funziona con i moduli di script ; tuttavia, dichiari che stai usando un modulo compilato , quindi questo non dovrebbe essere il tuo problema.

  4. La variabile di preferenza $PSModuleAutoLoadingPreference può essere utilizzata per distriggersre l’autoloading; tuttavia, a meno che non lo si sia modificato in modo esplicito, il valore predefinito è All così probabilmente non è questo il problema ( about_Preference_Variables mostra i valori possibili). Qual è il tuo valore di $PSModuleAutoLoadingPreference ?

  5. Ultimo ma non meno importante – Sono particolarmente sospettoso sul fatto che sembra che tu stia mescolando snap-in e moduli. Sono tipi distinti di quadro e non sono progettati per essere mescolati. Gli snap-in vengono caricati tramite Add-PSSnapin . I moduli vengono caricati tramite Import-Module . E i moduli, come sai, vengono caricati anche con il caricamento automatico: sospetto che potrebbe non essere vero per il codice scritto come snap-in. Inoltre, gli snap-in sono deprecati; il nuovo codice deve essere scritto utilizzando i moduli (ovvero, derivano da Cmdlet o PSCmdlet , come descritto in Scrittura di un Cmdlet di Windows PowerShell ).

Ho notato che la seguente struttura non è supportata da PowerShell 4:

 Modules\MySnapIn\1.0.0\MySnapIn.psm1 

Funziona bene dopo l’aggiornamento alla versione 5.

Nota: sto creando solo moduli di script, quindi potrei sbagliarmi.

Il caricamento automatico del modulo PowerShell dipende dal rilevamento dei comandi. Sospetto che se crei manifest ( New-ModuleManifest ) e comandi di denominazione che il tuo modulo binario espone, l’autocaricamento dovrebbe avviare e caricare il modulo se qualcuno proverà ad utilizzare uno di questi comandi:

 New-ModuleManifest -Path MySnappin.psd1 -RootModule MySnappin.dll -CmdletsToExport Get-Foo, Set-Bar