2016-07-12 8 views
7

Ich erstelle ein Skriptmodul und verwende ein Manifest, um Skriptelemente zu exportieren und andere Moduleigenschaften festzulegen. Ich habe fast jedes Beispiel-Manifest verfolgt, das ich gefunden habe, und sogar New-ModuleManifest verwendet, um ein Basismanifest mit den gewünschten Eigenschaften zu erstellen. Ich kann die Variablen, die ich exportieren möchte, trotzdem nicht exportieren.Variablen, die ich zum Exportieren in mein Powershell-Modul-Manifest aufgelistet habe, exportieren nicht wirklich

Hier sollen alle Deklarationen im Manifest durchgeführt werden, ohne Export-ModuleMember im Modulskript verwenden zu müssen. Hier

ist das Skriptmodul:

# 
# Widget.psm1 
# 

[System.Random]$rGen = New-Object System.Random; 
[string]$WidgetBaseName = $null; 
[string]$WidgetColor = "Blue"; 

function Get-WidgetName 
{ 
    param 
    (
     [Parameter(Mandatory=$true)] 
     [string]$widgetName, 
     [switch]$appendRandomNumber 
    ) 

    if (![string]::IsNullOrEmpty($WidgetBaseName)) 
    { 
     $widgetName = $WidgetBaseName + $widgetName; 
    } 

    if ($appendRandomNumber) 
    { 
     return [string]::Format("{0}{1:D4}", $widgetName, $rGen.Next(10000)); 
    } 
    else 
    { 
     return $widgetName; 
    } 
} 

function Get-WidgetBlessing() 
{ 
    return [string]::Format("A thousand blessings upon your {0} widget!", $WidgetColor); 
} 

Und das ist das Manifest:

# 
# Widget.psd1 
# 

@{ 

# Script module or binary module file associated with this manifest 
RootModule = 'Widget.psm1' 

# Version number of this module. 
ModuleVersion = '0.0.0.1' 

# ID used to uniquely identify this module 
GUID = 'c4437164-ea47-4148-97ed-48737bd5824d' 

# Author of this module 
Author = 'Widget Developer' 

# Company or vendor of this module 
CompanyName = 'Fictional Company Inc.' 

# Copyright statement for this module 
Copyright = '(c) 2016 Fictional Company. All rights reserved.' 

# Description of the functionality provided by this module 
Description = 'Widget Module' 

# Minimum version of the Windows PowerShell engine required by this module 
# PowerShellVersion = '' 

# Name of the Windows PowerShell host required by this module 
# PowerShellHostName = '' 

# Minimum version of the Windows PowerShell host required by this module 
# PowerShellHostVersion = '' 

# Minimum version of the .NET Framework required by this module 
# DotNetFrameworkVersion = '' 

# Minimum version of the common language runtime (CLR) required by this module 
# CLRVersion = '' 

# Processor architecture (None, X86, Amd64) required by this module 
# ProcessorArchitecture = '' 

# Modules that must be imported into the global environment prior to importing this module 
# RequiredModules = @() 

# Assemblies that must be loaded prior to importing this module 
# RequiredAssemblies = @() 

# Script files (.ps1) that are run in the caller's environment prior to importing this module 
# ScriptsToProcess = @() 

# Type files (.ps1xml) to be loaded when importing this module 
# TypesToProcess = @() 

# Format files (.ps1xml) to be loaded when importing this module 
# FormatsToProcess = @() 

# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess 
# NestedModules = @() 

# Functions to export from this module 
FunctionsToExport = @("Get-WidgetName", "Get-WidgetBlessing") 

# Cmdlets to export from this module 
# CmdletsToExport = @() 

# Variables to export from this module 
VariablesToExport = 'WidgetBaseName', 'WidgetColor' 

# Aliases to export from this module 
AliasesToExport = '*' 

# List of all modules packaged with this module 
# ModuleList = @() 

# List of all files packaged with this module 
# FileList = @() 

# Private data to pass to the module specified in RootModule/ModuleToProcess 
# PrivateData = '' 

# HelpInfo URI of this module 
# HelpInfoURI = '' 

# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. 
# DefaultCommandPrefix = '' 

} 

Um zu überprüfen, was die Mitglieder exportiert bekam, habe ich die folgenden Befehle in meinem Powershell-Fenster ausführen:

Import-Module Widget 
Get-Module -Name Widget | fl 

Dies ist der Ausgang. Beachten Sie das auffällige Fehlen exportierter Variablen.

Name    : Widget 
Path    : D:\SRE\PowerShell\Widget\Widget.psm1 
Description  : Widget Module 
ModuleType  : Script 
Version   : 0.0.0.1 
NestedModules  : {} 
ExportedFunctions : {Get-WidgetBlessing, Get-WidgetName} 
ExportedCmdlets : 
ExportedVariables : 
ExportedAliases : 

Warum ist das? Ich verwende das Manifest, das New-ModuleManifest generiert (New-ModuleManifest -VariablesToExport WidgetBaseName WidgetColor). Ist das Werkzeug kaputt oder gibt es etwas anderes im Manifest, das dieses Verhalten verursacht?

UPDATE:

Ich habe die folgende Zeile am Ende des Moduls Skript:

Export-ModuleMember -Variable WidgetBaseName, WidgetColor 

ich den Wert von VariablesToExport geändert '*' in der Manifest-Datei.

Nun, wenn ich das Modul importieren und die Prüfung durchgeführt, wie oben beschrieben, erhalte ich diese stattdessen:

Name    : Widget 
Path    : D:\SRE\PowerShell\Widget\Widget.psm1 
Description  : Widget Module 
ModuleType  : Script 
Version   : 0.0.0.1 
NestedModules  : {} 
ExportedFunctions : 
ExportedCmdlets : 
ExportedVariables : {WidgetBaseName, WidgetColor} 
ExportedAliases : 

... wo haben meine exportierten Funktionen gehen?

+0

Mögliches Duplikat von [Powershell Module Design - Export-ModulMember] (http: // stackoverflow.com/questions/22205103/powershell-modul-design-export-modulmember) – briantist

+0

Nichts ist kaputt; Sie müssen 'Export-ModuleMember' verwenden; Siehe das verknüpfte Duplikat. – briantist

+1

Hier ist ein Link, der erweitert, was @briantist sagt: http://www.itidea.nl/index.php/powershell-export-modulemember-vs-export-keys-in-manifest/. Ich habe noch nie zuvor versucht, Variablen zu exportieren. Das Verhalten, das in diesem SO-Post und diesem Link beschrieben wird, ist definitiv kontraintuitiv IMHO. –

Antwort

3

Also der Vollständigkeit halber und für jeden, der auf diese Frage in der Zukunft landet, fasse ich das Gespräch zusammen, das wir in den Anmerkungen zur Frage des OP hatten.

Alle Funktionen werden standardmäßig aus einem Modul exportiert, keine anderen Mitglieder zeigen dieses Verhalten. Es ist, als ob Export-ModuleMember -Function * implizit von innerhalb des Moduls aufgerufen wird. Sie können dann weiter einschränken, welche Funktionen über den Schlüssel ExportedFunctions im Modulmanifest, z. ExportedFunctions : {Get-WidgetBlessing, Get-WidgetName}.

Wenn Sie Variablen oder Aliase exportieren möchten, müssen Sie explizit einen Anruf an Export-ModuleMember -Variable <what you want to export> oder Export-ModuleMember -Alias <what you want to export> in Ihrem Modul hinzufügen. Nachdem Sie jedoch einen expliziten Aufruf an Export-ModuleMember hinzugefügt haben, tritt der implizite Aufruf von Export-ModuleMember -Function * nicht mehr auf. Sie müssen daran denken, Ihr Modul explizit mit Export-ModuleMember -Function * auszustatten, wenn Sie noch einen weiteren expliziten Aufruf zu Export-ModuleMember hinzufügen oder Ihre Funktionen werden nicht mehr weiter exportiert.

+0

Ich stimme zu. Das funktioniert. – user1956801

+1

Eigentlich bevorzuge ich es umgekehrt: Rufen Sie 'Export-ModuleMember' auf, um einzuschränken, was vom' psm1'-Modul exportiert wird, und belassen Sie diese Felder dann als '*' im Manifest. Dies bedeutet, dass ich alle Modulnamen von Dingen in * einer Datei * verwalten kann, anstatt so oft vor- und zurückzuspringen. – jpmc26