Powershell写入主机附加到文本文件-计算机名称和时间戳

oiopk7p5  于 2023-01-30  发布在  Shell
关注(0)|答案(4)|浏览(146)

我是一个Powershell新手,我目前正在写我的第二个脚本,所以请容忍我。我试图做一个write-host,并输出我的写主机消息沿着时间戳和什么计算机正在完成我的各种脚本块到一个文本文件,我有问题的语法,使事情的工作。
为了测试的目的,我尝试了下面的方法。一旦我得到语法,它将被转到服务器上--现在它将被转到我的本地C:驱动器上。

write-host "folders created successfully $env:computername" >> c:\scripts\testlog.txt

我看到的行为是正在创建文本文件,但其中没有任何内容-全部为空。

6psbrbz9

6psbrbz91#

使用Start-Transcript cmdlet -它可以捕获Write-Host输出,如下所示:

Start-Transcript -Path .\testlog.txt
Write-Host "Hello World"
Stop-Transcript
jucafojl

jucafojl2#

Write-Host不使用标准输出。它总是直接输出到控制台,跳过其他任何内容。Write-Output确实输出到标准输出。
要回答您的特定问题--如何将命令的输出附加到文本文件--您可以用途:

Write-Output "folders created successfully $env:computername" >> C:\scripts\testlog.txt

但是,您也可以使用Add-Content

Add-Content -Path C:\scripts\testlog.txt -Value "folders created successfully $env:computername"

或者可以通过管道连接到Out-File -Append

"folders created successfully $env:computername" | Out-File -FilePath C:\scripts\testlog.txt -Append

为什么你要用不同的方法呢?他们有a few differences,你不会经常碰到它。redirection operators不能给予你控制发生的事情(编码等)。

9jyewag0

9jyewag03#

Write-Host仅用于将数据发送到控制台,而不是其他地方。如果您希望将数据发送到其他地方,即文件,则需要将其发送到输出流

write-output "folders created successfully $($env:computername)" >> c:\scripts\testlog.txt

"folders created successfully $($env:computername)" >> c:\scripts\testlog.txt

注意$env周围的子表达式,我们需要确保变量在双引号中正确展开。
有关如何使用本机PowerShell cmdlet执行此操作,请参阅Bacons answer

t98cgbkg

t98cgbkg4#

正如其他回答所指出的,Write-Output是写入输出流的cmdlet,可用于将输出重定向到文件。但是,请注意,当在函数内部使用Write-Host时,它的以下特征与Write-Host有很大不同:

使用写入输出:
Function Get-SomeResult {
    Write-Output "Some logging here"
    return "My desired result"
}

Function Start-Something {
    $result = Get-SomeResult
    Write-Output "The result is: $result"
}

Start-Something >> "$PSScriptRoot\MyLog.log"

日志将为:
结果是:这里有一些日志我想要的结果
如您所见,输出已成为返回对象$result的一部分,这可能是无意的。

使用写入主机:
Function Get-SomeResult {
    Write-Host "Some logging here"
    return "My desired result"
}

Function Start-Something {
    $result = Get-SomeResult
    Write-Host "The result is: $result"
}

Start-Something >> "$PSScriptRoot\MyLog.log"

日志将如预期:
这里有些伐木
结果是:我想要的结果
因此,Get-SomeResult函数的返回对象保留了我们想要设置的值。

输出到文件函数

解决此问题的一种方法是创建一个单独的函数,如下所示,以避免在脚本中重复日志路径:

$script:logPath = "$PSScriptRoot\MyLog.log"

Function Write-Log {
    param($Message)
    Write-Output $Message >> $script:logPath
}

Function Get-SomeResult {
    Write-Log "Some logging here"
    return "My desired result"
}

Function Start-Something {
    $result = Get-SomeResult
    Write-Log "The result is: $result"
}

Start-Something

我们新的Write-Log可以像Write-Output一样使用,但没有潜在的非预期特性,它可以进一步扩展以验证或复制Write-Output的其他参数,但这种简单的格式可能适用于大多数用例。

相关问题