powershell脚本,只将cmd界面的某些部分写入.txt文件

powershell Script that only writes certain Parts from the cmd interface to a .txt file

我是 Powershell 的新手,目前正在编写一个脚本,该脚本将 wbadmin get versions 命令的结果写入文本文件。结果包含两个(或更多)条目。

我的结果(德语):

wbadmin 1.0 - Sicherungs-Befehlszeilentool
(C) Copyright Microsoft Corporation. Alle Rechte vorbehalten.

Sicherungszeit: 06.01.2022 10:02 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-09:02
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {a14340c6-b013-4f24-9e0c-01b508d32e73}

Sicherungszeit: 06.01.2022 15:43 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-14:43
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {eaac6691-2fc7-416c-aec2-b9c936908206}

测试脚本:

$patht = "C:\blaBla.txt"
$process = wbadmin get versions

New-Item $patht
Add-Content $patht -Value $Process 

问题是我只对第二个 (06.01.2022 15:43) 条目感兴趣。有没有办法只将需要的条目导出到我的 .txt 文件?

I'm only interested in the second (06.01.2022 15:43) entry.

我想你的意思是你只对列表的最后一个条目感兴趣,而不是那个特定日期的条目。

您可以在双换行处拆分并取最后一部分:

$process = @"
wbadmin 1.0 - Sicherungs-Befehlszeilentool
(C) Copyright Microsoft Corporation. Alle Rechte vorbehalten.

Sicherungszeit: 06.01.2022 10:02 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-09:02
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {a14340c6-b013-4f24-9e0c-01b508d32e73}

Sicherungszeit: 06.01.2022 15:43 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-14:43
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {eaac6691-2fc7-416c-aec2-b9c936908206}
"@

$last = $process -split '\r?\n\r?\n' | select -Last 1
Write-Host $last

打印

Sicherungszeit: 06.01.2022 15:43 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-14:43
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {eaac6691-2fc7-416c-aec2-b9c936908206}

我假设 wbadmin get versions returns 一个字符串数组,在这种情况下,您可以执行以下操作:

# join the strings to form a single multilined string
$process = (wbadmin get versions) -join [environment]::NewLine
# split on the empty newlines to get text blocks.
$blocks = $process -split '(\r?\n){2,}' | Where-Object { $_ -match '\S'}

# now select the block that has the info for the date you are after
# since the string contains dots (that have special meaning in regex), you need to escape the search string
$search = [regex]::Escape('Sicherungszeit: 06.01.2022 15:43')
$blocks | Where-Object { $_ -match "(?m)^$search" } | Set-Content -Path "C:\blaBla.txt"

结果:

Sicherungszeit: 06.01.2022 15:43 
Sicherungsziel: 1394/USB-Datenträger, Beschriftung Volume Ni-ssan Skyline(D:)
Versions-ID: 01/06/2022-14:43
Wiederherstellbar: Volume(s), Datei(en), Anwendung(en), Bare-Metal-Recovery, Systemstatus
Snapshot-ID: {eaac6691-2fc7-416c-aec2-b9c936908206}

(回答我自己的问题)

那天我进一步研究,发现可能是该问题最简单的解决方案。我只是将任务拆分。

完成代码:

$patht = "C:\temp\BackUpInfo.txt"
$pathm = "C:\temp\UwU.txt"
$process = wbadmin get versions

#.txt file with webadmin result#
New-Item $pathm
Add-Content $pathm -Value $process 

#seperate newest log entry#
$last = Get-Content $pathm
$akt = $last | Select-Object -Last 6

#.txt file with newest log#
New-Item $patht
Add-Content -Path "C:\temp\BackUpInfo.txt" -Value $akt

所以,让我们分解一下...首先,我创建了一个 .txt 文件,我在其中保存了 "wbadmin" 结果。

之后,我查看了导出的 .txt 文件,发现最新的备份总是最低的。然后我计算了有多少行包含该条目。所以我只是把想要的行分成一个变量。

最后但同样重要的是,我创建了我的最终 .txt 文件,我将之前分离的日志条目导出到该文件中。在那之后,我得到了我想要的结果。可能有更好的解决方案,但这完美无缺,足以让我满意。后来在我的脚本中,在 "Backupinfo" 附加到电子邮件后,这两个文件都被删除了,因此 "this 中从来没有任何错误文件已经存在。所以是的......一个简单问题的非常简单的解决方案。

-干杯