2013-05-06 5 views
6

Spero di utilizzare il comando Write-Verbose in script e funzioni. Funziona come previsto nei file di script (.ps1), ma non nei file del modulo (.psm1): il comando viene ignorato nei moduli.Write-Verbose ignorato nel modulo PowerShell

eseguendo lo script seguente:

PS> .\scaffold.ps1 -verbose 

Produce:

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" 

} 

Non ho associato un manifest (.psd1) con il modulo (.psm1) a questo punto.

Esiste una sintassi specifica del modulo che devo utilizzare?

** Modifica **

cosa ho bisogno è un modo per determinare se il flag -verbose è stata impostata sul file ps1 in modo da poter passare al file 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" 

risposta

4

trovato la risposta qui: 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

Grazie per la condivisione; d'accordo che questa sembra essere l'unica cosa che funziona; ma ha un cattivo odore ... Come tale ha un suggerimento. MS Connect è disattivato per PowerShell atm, quindi è stato effettuato il blogging per ora: https://developer42.wordpress.com/2017/02/04/powershell-suggestion-simplify-write-verbose-in-modules/ – JohnLBevan

+0

Aggiornamento: registrato come Problema sulla pagina GitHub di PowerShell: https://github.com/PowerShell/PowerShell/issues/3106 – JohnLBevan

5

Per ottenere risultati Write-Verbose uscita da un cmdlet in un modulo, è necessario utilizzare il parametro comune -verbose. Vedere http://technet.microsoft.com/en-us/magazine/ff677563.aspx

Utilizzando il codice:

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

che ha funzionato. Non riesco a credere che non ci ho pensato ... – craig

+1

La presenza della commutazione -verbo resa disponibile come variabile all'interno del file .ps1 stesso? 'pippo" c: \ bar.txt "$ verbose' o qualcosa di simile? – craig

+0

Non che io possa dire dalla documentazione. Perché dovresti testare per questo? Basta usare 'Write-Verbose' - se' -verbose' viene usato, produrrà output, altrimenti rimarrà in silenzio. – alroc

3

Il problema qui è che le variabili in ambito di un chiamante non lo fanno essere prelevato dal codice in un modulo di script. Quando si chiama ". \ Scaffold.ps1 -verbose", $ VerbosePreference è impostato su "Continua" nell'ambito dello script di scaffold.ps1. Se chiami un cmdlet compilato da quello script, onora quel valore $ VerbosePreference, ma quando chiami Funzioni avanzate da un modulo di script, non lo fanno.

Ho recentemente scritto una funzione che consente di importare le variabili di preferenza dal chiamante, utilizzando una combinazione di $ PSCmdlet e $ ExecutionContext.SessionState per ottenere gli ambiti delle variabili appropriate. La chiamata a questo comando, all'inizio della funzione esportata di un modulo di script, si presenta così:

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

La funzione Get-CallerPreference può essere scaricato dal http://gallery.technet.microsoft.com/scriptcenter/Inherit-Preference-82343b9d