当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

作者:精品下载站 日期:2024-12-14 03:42:22 浏览:14 分类:玩电脑

如何使用 PowerShell Out-File 输出到文件


PowerShell 命令的输出默认显示在终端中。但在某些情况下,将输出重定向到 PowerShell 中的文件更有用。为此,我们将使用 Out-File cmdlet。

有多种方法可以将 PowerShell 脚本或命令的结果输出到文件。甚至可以在终端中显示输出,同时将其导出到文件中。您是否知道您还可以仅导出成功、警告或错误结果?

在本文中,我们将了解如何在 PowerShell 中将输出写入文件。我还将解释如何附加到现有文件或如何创建日志文件。

Powershell 将输出写入文件

有多种方法可以将 PowerShell 的输出写入文件。最常见的方法是使用 Out-File cmdlet 或重定向运算符 >。其他选项包括使用 Set-ContentAdd-Content cmdlet。我们将重点关注前两个,但如果相关,我将简要提及替代方案。

Out-File cmdlet 和重定向运算符 > 允许您将 PowerShell 输出写入并附加 (>>) 到文件中。两者之间的区别在于,前者接受参数,后者不接受参数。

通过 Out-File cmdlet,我们可以使用以下参数:

-Filepath

设置文件的位置和名称

-Append

将输出附加到文件的现有内容

-Force

覆盖只读文件

-NoClobber

防止覆盖文件

-NoNewLine

不会写入换行符。

-Width

限制每行的字符数(默认80)

-WhatIf

在测试模式下运行

PowerShell 重定向运算符

然而,重定向运算符没有任何参数。但与Out-File相比,它有一个优势。使用 Out-File cmdlet 时,仅导出成功的结果,因此警告或错误不会写入文件。

使用重定向运算符时,我们可以指定要导出的流:

OperatorDescription / StreamWrite cmdlet>Success onlyWrite-Output2>Error onlyWrite-Error3>Warning onlyWrite-Warning4>Verbose only Write-Verbose5>Debug onlyWrite-Debug6>Information onlyWrite-Information*>All

稍后我将详细解释不同的流,但让我们首先看看如何简单地将输出写入 PowerShell 中的文件。

要将输出写入文件,您只需在脚本或命令后面通过管道传输 Out-File cmdlet 并指定路径即可。如果该文件不存在,则将由 cmdlet 创建它:

Get-Process -Name explorer | Out-File -FilePath c:\temp\process.txt

# Same as:
Get-Process -Name explorer > c:\temp\process.txt

# The results
 Get-Content C:\temp\process.txt

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
    132    94,56     158,22     131,45  123364   1 explorer

PS C:\>

如您所见,Get-Process cmdlet 的结果存储在 process.txt 文件中:

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

如果不指定任何其他参数,则 Out-File cmdlet 和重定向运算符将默认覆盖任何现有文件。我们可以通过向 cmdlet 添加 -NoClobber 参数来防止这种情况

Get-Process -Name explorer | Out-File c:\temp\process.txt -NoClobber

请注意,您无法阻止使用重定向运算符进行覆盖

如果文件已经存在,则会抛出错误:

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

如果您想输出到脚本内的文件,那么我建议您首先使用 Test-Path cmdlet 来确定该文件是否已存在。这样您就可以编写更好的解决方案,例如在文件名中附加日期,而不是简单地尝试写入它:

$exportPath = "C:\temp\process.txt"

If (Test-Path $exportPath) {
    # Show a warning or change the file name here
    Write-Warning "File already exists"
    $exportPath = "C:\temp\process-1.txt" # create something nice with a date or timestamp
}else{
    Get-Process -Name explorer | Out-File $exportPath -NoClobber
}

PowerShell 附加到文件

我们还可以将输出附加到文件的现有内容中,而不是覆盖。为此,我们可以使用 -append 参数或使用重定向运算符 >>。在这两种情况下,输出的内容都将添加到现有文件中。

您还可以追加到不存在的文件,如果指定的文件不存在,两种方法都会创建一个新文件。

# Append with the Out-File cmdlet
'Apple' | Out-File -FilePath C:\temp\fruits.txt -Append
Get-Content -Path c:\temp\fruits.txt

# Result
Apple

# Append with the redirect operator
'Pear' >> C:\temp\fruits.txt
Get-Content -Path c:\temp\fruits.txt

# Result
Apple
Pear

将输出附加到现有文件时,内容将放置在新行上。如果您希望将内容放在一行上,创建一个长字符串,则需要使用带有 -NoNewLine 参数的 Out-File cmdlet。

换行符放置在您添加到文件中的值之后。因此,将 -NoNewLine 参数添加到第一个输出也很重要。

# Note that you will need to specify NoNewLine for the first entry as well
'BlueBerry;' | Out-File -FilePath C:\temp\fruits.txt -NoNewline

# Appending more berries
'StrawBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'BlackBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'RaspBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline
'CranBerry;' | Out-File -FilePath C:\temp\fruits.txt -Append -NoNewline

为了使结果更具可读性,我为所有值添加了分号。正如您所看到的,所有结果都在同一行:

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

使用 PowerShell 添加内容

将内容添加到文件的另一个选项是使用 Add-Content cmdlet。 Add-Content cmdlet 的最大优点之一是它允许您一次将内容附加到多个文件。

就像 Out-File cmdlet 和重定向运算符一样,如果文件不存在,Add-Content cmdlet 会创建一个新文件

因此,为了简单地将内容添加到文件中,我们可以使用以下命令:

Add-Content -Path c:\temp\file.txt -Value "New line to add"

要将相同的内容添加到多个文件,我们有几个参数可以帮助我们。我们可以在路径中使用通配符来指定要更新的文件。此外,我们可以排除文件名,甚至使用过滤器。

下面的示例将把当前日期添加到路径 c:\temp\files 中的所有 TXT 文件中,文件名中带有 readme 的文件除外:

Add-Content -Path C:\temp\files\*.txt -Value (Get-Date) -Exclude "readme*"

除自述文件外的所有文件均已更新:

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

include 和 except 参数都允许您指定想要或不想要更新的文件的字符串数组。

如果我们采用上面的示例,我们还可以使用过滤器参数来仅选择包含单词 log 的文件:

Add-Content -Path C:\temp\files\* -Value (Get-Date) -Filter "*log*"

仅将错误、警告或成功写入文件

out-file cmdlet 只会将命令或脚本的成功结果写入文件。但有时您也希望输出警告或错误。

为了实现这一点,我们可以使用重定向运算符。它允许您指定要输出到文件的流。

我们以下面的脚本为例:

Function Get-ProcessCpu {
    param(
        [Parameter(Mandatory = $true)]$name
    )
    Get-Process -Name $name | select cpu
}
Get-ProcessCpu -name "explorer2" | Out-File C:\temp\process.txt

进程“Explorer2”不存在,因此 Get-Process cmdlet 将引发错误。如果我们像这样运行脚本,那么 process.txt 文件将完全为空。

但是,如果我们使用重定向运算符,我们可以指定要输出的流。

# Write all results to the file:
Get-ProcessCpu -name "explorer2" *> C:\temp\process.txt

# Write only the error to the file:
Get-ProcessCpu -name "explorer2" 2> C:\temp\process-error-log.txt

# Write only warnings to a file:
Get-ProcessCpu -name "explorer2" 3> C:\temp\process-error-log.txt

如您所见,错误已使用重定向运算符写入文本文件:

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

Powershell写入日志文件

写入日志文件的最佳选择是使用 Start-Transcript cmdlet,但我们也可以使用 Add-Content cmdlet 或重定向运算符编写自己的日志函数。

使用重定向运算符会限制您的可能性,但如果您只想将脚本的错误写入日志文件,这是一个很好的方法:

Function Get-ProcessCpu {
    param(
        [Parameter(Mandatory = $true)]$name
    )
    Get-Process -Name $name | select cpu
}

# Write only errors to a log file
Get-ProcessCpu -name "explorer2" 2>> "C:\temp\files$env:computername-process.log"

但是,当您将消息写入日志文件时,您可能希望有更多的控制权。通过日志文件,我们可以了解事件发生的时间以及事件的严重性,这一点很重要。所以我们要做的就是在日志消息中添加时间戳和事件级别。

这样我们就可以轻松地读取日志文件并识别发生的任何错误。

# Set log file path
$logFile = "C:\temp\files$env:computername-process.log"

Function Write-Log {
    param(
        [Parameter(Mandatory = $true)][string] $message,
        [Parameter(Mandatory = $false)]
        [ValidateSet("INFO","WARN","ERROR")]
        [string] $level = "INFO"
    )

    # Create timestamp
    $timestamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")

    # Append content to log file
    Add-Content -Path $logFile -Value "$timestamp [$level] - $message"
}

Write-Log -level ERROR -message "String failed to be a string"

上面的函数是 PowerShell 的简单日志文件创建器的示例,它允许您将带有严重性和时间戳的消息(事件)写入日志文件。

[玩转系统] 如何使用 PowerShell Out-File 输出到文件

总结

正如您所看到的,PowerShell 中有多种方法可以将结果输出到文件中。要快速将某些内容输出到文件,可以使用重定向运算符或 Out-File cmdlet。

当您想要将输出导出到 CSV 文件时,请务必阅读本文。还可以使用 Replace 方法替换文件内的内容。

如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯