首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果是新会话,则覆盖文件;如果是相同会话,则附加文件

如果是新会话,则覆盖文件;如果是相同会话,则附加文件
EN

Stack Overflow用户
提问于 2019-05-29 04:52:39
回答 3查看 136关注 0票数 2

我有一个函数可以将脚本中的任何write-hosts (保留它们以便以后着色)转换为tee对象

代码语言:javascript
复制
function Write-Host($object) 
{
    $object | tee .\LOG.txt -Append
}

如果文件存在,则当前会将其附加到文件中(如果不存在,则创建一个文件)

我想在每次启动新会话时创建一个。仅当您在同一会话中时才追加到文件

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-29 05:51:52

这是少数几种全局变量有用的情况之一,因为它们可以在整个会话中持续存在。在本例中,我使用它们来设置唯一的文件名(在本例中是今天的日期),以记录到:

代码语言:javascript
复制
function Write-Host($object) 
{
    if($global:LogFile -eq $null)
    {
        $global:LogFile = ".\LOG-$(Get-Date -Format 'yyyy-MM-dd').txt"
    }

    $object | tee $global:LogFile -Append
}

-编辑:

在注释中,如果您希望在会话开始时有一个新文件,并在会话期间添加,我们仍然可以使用全局变量来确定会话的开始,但我们只需使用检查来删除开始时的文件,并将附加保留到Tee:

代码语言:javascript
复制
function Write-Host($object) 
{
    if($global:LogFile -eq $null)
    {
        $global:LogFile = ".\LOG.txt"
        Remove-Item $global:LogFile -ErrorAction SilentlyContinue
    }

    $object | tee $global:LogFile -Append
}

-编辑2:

摘自第二条评论:

Remove-Item是一个不同的动物,因为它默认没有输出。实际上,获得任何输出的唯一方法是添加-Verbose参数。但是Tee-Object不会捕获冗长的流。为了解决这个问题,我们必须使用两个技巧。首先,我们指定带有重定向(about_Redirection)的-Verbose参数(以获取输出),以将详细流(4)重定向到标准的成功(1) /信息流。这将允许Tee-ObjectRemove-Item cmdlet捕获信息:

代码语言:javascript
复制
Remove-Item test.txt -Verbose 4>&1 | Tee-Object out.txt
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 06:06:04

您没有定义新的“会话”对您来说是什么,所以让我们使用变量$PID,它是PowerShell运行时所使用的进程ID。

理想情况下,您只需在文件名中包含这一部分,以便每个进程都有自己的日志。但是你在评论中说你不想要多个文件。在这种情况下,将PID写为文件中的第一行,并每次读取它。

代码语言:javascript
复制
function Write-Host($object) 
{
    $filename = '.\LOG.txt'

    $logPID = Get-Content -LiteralPath $filename -ReadCount 1 -ErrorAction Ignore
    $newSession = $logPID -ne $PID

    if ($newSession) {
        $PID | Set-Content -LiteralPath $filename
    }

    $object | Tee-Object -FilePath $filename -Append
}
票数 1
EN

Stack Overflow用户

发布于 2019-05-29 08:02:32

我将为未来的搜索者提供一种替代方法。您可以获取当前进程的开始时间,将其与创建文件的时间进行比较,如果文件是在当前PID启动之前创建的,则可以删除该文件。

代码语言:javascript
复制
function Write-Host
{
[cmdletbinding()]
Param([parameter(ValueFromPipeline=$true)]$object)
Begin{
    $allObjects=New-Object System.Collections.ArrayList
}
Process{
    $allObjects.Add($object)|out-null
}
End{
    if((test-path .\log.txt) -and (get-item '.\LOG.txt').CreationTime -lt (Get-Process -Id $PID).StartTime){Remove-Item .\LOG.txt}
    $allObjects | tee .\LOG.txt -Append
}
}

此外,使用到高级函数的转换,您可以通过管道将某些内容传递给它,例如:

代码语言:javascript
复制
Get-Process | Write-Host

或者,我认为最简单的做法就是删除日志文件,这是脚本要做的第一件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56349899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档