2013-05-06 15 views
6

Mam nadzieję użyć skryptletu Write-Verbose w skryptach i funkcjach. Działa zgodnie z oczekiwaniami w plikach skryptów (.ps1), ale nie w plikach modułu (.psm1) - polecenie jest ignorowane w modułach.Write-Verbose ignorowane w module PowerShell

Running następujący scenariusz:

PS> .\scaffold.ps1 -verbose 

Produkuje:

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" 

} 

Nie skojarzyłem w tym momencie manifestu (.psd1) z modułem (.psm1).

Czy jest wymagana specyficzna dla modułu składnia, której należy użyć?

** Edycja **

Co potrzebne jest sposobem ustalenia, jeśli flaga -verbose został ustawiony na pliku .ps1 więc mogę przekazać je do pliku .PSM1.

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" 

Odpowiedz

4

znaleźć odpowiedź tutaj: 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

Dzięki za udostępnienie; zgadzają się, że wydaje się to jedyną rzeczą, która działa; ale pachnie źle ... Jako takie mają sugestię dotyczącą funkcji. Usługa MS Connect jest wyłączona dla bankomatu PowerShell, więc na razie bloguj: https://developer42.wordpress.com/2017/02/04/powershell-suggestion-simplify-write-verbose-in-modules/ – JohnLBevan

+0

Aktualizacja: zaloguj się jako wydanie na stronie GitHub PowerShell: https://github.com/PowerShell/PowerShell/issues/3106 – JohnLBevan

5

Aby uzyskać Write-Verbose wyjście z pomocą apletu polecenia w module, trzeba korzystać ze wspólnej parametr -verbose. Zobacz http://technet.microsoft.com/en-us/magazine/ff677563.aspx

Używanie kod:

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

który pracował. Nie mogę uwierzyć, że nie myślałem o tym ... – craig

+1

Czy obecność przełącznika -verbose jest dostępna jako zmienna w samym pliku .ps1? 'foo" c: \ bar.txt "$ verbose' lub coś podobnego? – craig

+0

Nie mogę tego powiedzieć z dokumentacji. Po co miałbyś go testować? Po prostu użyj 'Write-Verbose' - jeśli użyjesz' -verbose', to wytworzy wynik, w przeciwnym razie pozostanie cichy. – alroc

3

Problem jest to, że zmienne w zakresie dzwoniącego nie zostać pobrane przez kod w module skryptu. Kiedy wywołasz ". \ Scaffold.ps1 -verbose", $ VerbosePreference jest ustawione na "Kontynuuj" w zakresie skryptu scaffold.ps1. Jeśli wywołasz skompilowany Cmdlet z tego skryptu, honoruje on wartość $ VerbosePreference, ale gdy wywołujesz funkcje zaawansowane z modułu skryptu, nie są one wykonywane.

Niedawno napisałem funkcję, która pozwala zaimportować zmienne preferencji od wywołującego, używając kombinacji $ PSCmdlet i $ ExecutionContext.SessionState, aby uzyskać odpowiednie zakresy zmiennych. Wywołanie tego polecenia, na początku funkcji eksportowanych modułu skryptowego, wygląda następująco:

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

Funkcja Get-CallerPreference można pobrać z http://gallery.technet.microsoft.com/scriptcenter/Inherit-Preference-82343b9d

Powiązane problemy