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?
Mögliches Duplikat von [Powershell Module Design - Export-ModulMember] (http: // stackoverflow.com/questions/22205103/powershell-modul-design-export-modulmember) – briantist
Nichts ist kaputt; Sie müssen 'Export-ModuleMember' verwenden; Siehe das verknüpfte Duplikat. – briantist
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. –