【问题标题】:Output Function Not Working输出功能不工作
【发布时间】:2014-07-11 15:53:44
【问题描述】:

我有功能可以输出到不同的多个位置,如下所示:

Function OutputToInfo
{
        %{
            Write-Host $_; 
            Out-File -FilePath $InfoLog -InputObject $_ -Append
         }
}

但是,当我运行我的脚本并像这样调用函数时:

"Script started at: ${TS}" | OutputToInfo

它不会输出到任何一个位置。输出到控制台的是函数本身-

%{
    Write-Host $_; 
    Out-File -FilePath $InfoLog -InputObject $_ -Append
}

此代码有效:

"Script started at: ${TS}" | %{write-host $_; out-file -filepath $ErrorLog -inputobject $_ -append}

但是我的脚本在我想输出到多个位置的每一行之后看起来都很草率。

有人知道为什么我的功能没有按预期工作吗?

【问题讨论】:

  • 听起来您正在尝试实现自己的Tee-Object 版本。该 cmdlet 是否不足以满足您的要求?
  • 不幸的是,事实并非如此。我需要同时写入控制台以及其他文件(有时超过两个)。不过,我想我正在取得一些进展。不知道为什么我在我的职能一开始就有“回归”。编辑 OP 以反映新代码和新错误。
  • Tee-Object 写入文件和输出流。这涵盖了您的前 2 个功能。要写入两个文件,请在管道中连续调用两次Tee-Object。或者编写一个函数,该函数接受一组文件名来写入并循环遍历它。
  • 我根据我的其他线程的答案进行了尝试 - link 但无法让它与我的脚本一起使用。人们建议其他可行的替代方案,例如我现在使用的替代方案。我只是不确定为什么它不能在函数中工作。

标签: powershell output powershell-2.0 user-defined-functions


【解决方案1】:

我认为这更符合您的要求。我想指出 Alroc 关于Tee-Object 的回复仍然值得考虑。

Function OutputToInfo
{
    $input| %{Write-Host $_; Out-File -FilePath $InfoLog -InputObject $_ -Append}
}

$input 变量允许函数访问来自管道的数据。 http://www.powershellpro.com/powershell-tutorial-introduction/powershell-functions-filters/

"Hello" | OutputToInfo
Hello

还将“Hello”附加到之前由$InfoLog定义的文件

鉴于 cmets

在没有某种循环结构的情况下,没有使用Tee-Object 或Out-File 处理多个路径的本地方法。因此,您可以为此做一个小功能。 警告:这几乎没有错误,主要是为了展示其他可以做的例子。

Function Output-ToFiles
{
    Param(
        [parameter(ValueFromPipeline=$True)]
        [string]
        $data,
        [parameter(
            Mandatory=$false,
            ValueFromRemainingArguments=$true,
            Position=0)]
        [string[]]
        $paths
    )

    # Write data to console.
    Write-Host "$data"

    # Write data to each file passed. 
    $paths | ForEach-Object{
        $data | Out-File -Append -FilePath $_
    }
}

在行动

PS C:\users\Cameron\Downloads> "DataToPipe" | Output-ToFiles "C:\temp\data.log" "C:\temp\data.log2"
DataToPipe

该函数接受管道数据作为字符串。该函数的其余参数存储在字符串数组$paths 中。对于运行Out-File 的每个路径。此外,如果您厌倦了一直键入相同的路径,您可以为$paths 设置默认值,例如$paths = "C:\temp\wood.log

您可以使用Tee-Objects 构建一个命令字符串,但这样的逻辑更容易。如果没有必要,也不必复杂化。

【讨论】:

  • 谢谢!但是有一个问题-您是否知道为什么 $Error[$Err] | OutputToError 不输出错误信息到日志文件,只输出控制台?
  • 一开始不确定,但是您的代码需要更多上下文 $err 和 OutputToError 函数是什么?我不确定,因为我是新来的,但这也可能超出了这个问题的范围。
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多