2013-05-06 4 views
6

Ich hoffe, das Write-Verbose Commandlet in Skripten und Funktionen zu verwenden. Es funktioniert wie erwartet in Skriptdateien (.ps1), jedoch nicht in Moduldateien (.psm1) - das Befehlszeil wird in Modulen ignoriert.Write-Verbose ignoriert in PowerShell-Modul

Ausführen des folgenden Skripts:

PS> .\scaffold.ps1 -verbose 

Produziert:

VERBOSE: starting foo 
path: c:\bar.txt 
[missing entry here - 'verbose path: c:\bar.txt'] 
VERBOSE: ending foo 

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" 

write-verbose "ending foo" 

Common.psm1:

function foo { 

    [cmdletbinding()] 
    Param(
    [string]$path 
) 

    write-host "path: $path" 
    write-verbose "verbose path: $path" 

} 

Ich habe zu diesem Zeitpunkt kein Manifest (.psd1) mit dem Modul (.psm1) verknüpft.

Gibt es eine modulspezifische Syntax, die ich verwenden muss?

** bearbeiten **

Was ich brauche, ist ein Weg, um festzustellen, ob der -verbose-Flag auf der PS1-Datei festgelegt worden, so kann ich es in die .psm1 Datei übergeben.

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" $verbose_flag # pass verbose setting to module based on what was set on the script itself 

write-verbose "ending foo" 

Antwort

4

die Antwort hier gefunden: How to properly use the -verbose and -debug parameters in custom cmdlet

scaffold.ps1:

[cmdletbinding()] 
param() 

import-module Common -force 

write-verbose "starting foo" 

foo "c:\bar.txt" -Verbose:($PSBoundParameters['Verbose'] -eq $true) 

write-verbose "ending foo" 
+0

Danke für das Teilen; stimme zu, dass dies das einzige zu sein scheint, was funktioniert; aber es riecht schlecht ... Als solche haben einen Feature-Vorschlag. MS Connect ist für PowerShell atm deaktiviert, so dass Sie jetzt blogged: https://developer42.wordpress.com/2017/02/04/powershell-suggestion-simplify-write-verbose-in-modules/ – JohnLBevan

+0

Update: Protokolliert als ein Problem auf der GitHub-Seite von PowerShell: https://github.com/PowerShell/PowerShell/issues/3106 – JohnLBevan

5

Um Write-Verbose Ausgabe von einem Cmdlets in einem Modul zu erhalten, müssen Sie die -verbose gemeinsame Parameter verwenden. Siehe http://technet.microsoft.com/en-us/magazine/ff677563.aspx

Arbeiten mit dem Code:

>import-module R:\Common.psm1 
>foo "c:\users" 
path: c:\users 
>foo "c:\users" -verbose 
path: c:\users 
VERBOSE: verbose path: c:\users 
+0

Das funktionierte heruntergeladen werden. Kann nicht glauben, dass ich nicht darüber nachgedacht habe ... – craig

+1

Ist das Vorhandensein des Schalters -verbose als Variable in der .ps1-Datei selbst verfügbar? 'foo" c: \ bar.txt "$ verbose' oder etwas ähnliches? – craig

+0

Nicht, dass ich das aus der Dokumentation ersehen kann. Warum sollten Sie es testen? Verwenden Sie einfach "Write-Verbose" - wenn "-verbose" verwendet wird, wird die Ausgabe erzeugt, ansonsten bleibt es ruhig. – alroc

3

Das hier Problem ist, dass Variablen in einem Umfang des Anrufers nicht Sie werden von Code in einem Skriptmodul abgeholt. Wenn Sie ". \ Scaffold.ps1 -verbose" aufrufen, wird $ VerbosePreference im Skriptbereich von scaffold.ps1 auf "Continue" gesetzt. Wenn Sie ein kompiliertes Cmdlet aus diesem Skript aufrufen, berücksichtigt es den $ VerbosePreference-Wert, aber wenn Sie Advanced Functions von einem Skriptmodul aufrufen, tun dies nicht.

Ich habe vor kurzem eine Funktion geschrieben, die es Ihnen ermöglicht, die Präferenzvariablen vom Aufrufer zu importieren, indem Sie eine Kombination aus $ PSCmdlet und $ ExecutionContext.SessionState verwenden, um die entsprechenden Variablenbereiche zu erhalten. Der Anruf auf diesen Befehl zu Beginn eines exportierten Funktion des Script-Modul, sieht wie folgt aus:

Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState 

Die Get-CallerPreference Funktion kann von http://gallery.technet.microsoft.com/scriptcenter/Inherit-Preference-82343b9d