12

我希望Write-Verbose在脚本和函数中使用命令行开关。它在脚本 (.ps1) 文件中按预期工作,但在模块 (.psm1) 文件中不正常 - 在模块中忽略命令行开关。

运行以下脚本:

PS> .\scaffold.ps1 -verbose

产生:

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

脚手架.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"

}

此时我还没有将清单 (.psd1) 与模块 (.psm1) 相关联。

我需要使用特定于模块的语法吗?

** 编辑 **

我需要一种方法来确定-verbose标志是否已在 .PS1 文件上设置,以便我可以将其传递给 .PSM1 文件。

脚手架.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"
4

3 回答 3

10

要从模块中的 cmdlet 获取Write-Verbose输出,您需要使用-verbosecommon 参数。请参阅http://technet.microsoft.com/en-us/magazine/ff677563.aspx

使用您的代码:

>import-module R:\Common.psm1
>foo "c:\users"
path: c:\users
>foo "c:\users" -verbose
path: c:\users
VERBOSE: verbose path: c:\users
于 2013-05-06T20:44:11.773 回答
8

在这里找到答案:如何在自定义 cmdlet 中正确使用 -verbose 和 -debug 参数

脚手架.ps1:

[cmdletbinding()]
param()

import-module Common -force

write-verbose "starting foo"

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

write-verbose "ending foo"
于 2013-05-08T13:30:31.473 回答
5

这里的问题是调用者范围内的变量不会被脚本模块中的代码拾取。当您调用“.\scaffold.ps1 -verbose”时,$VerbosePreference 在scaffold.ps1 的脚本范围内设置为“继续”。如果您从该脚本调用已编译的 Cmdlet,它会遵循该 $VerbosePreference 值,但当您从脚本模块调用高级函数时,它们不会。

我最近编写了一个函数,允许您从调用者导入首选项变量,使用 $PSCmdlet 和 $ExecutionContext.SessionState 的组合来获取适当的变量范围。在脚本模块的导出函数的开头调用此命令,如下所示:

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

Get-CallerPreference 函数可以从http://gallery.technet.microsoft.com/scriptcenter/Inherit-Preference-82343b9d下载

于 2014-01-22T20:01:46.313 回答