Powershell将信息输出到文本文件中,但不输出到输出窗格中

时间:2017-11-28 14:03:50

标签: powershell

这里有一个脚本,我需要导出到文本文件的结果也显示在底部的输出窗格中。有人可以帮忙吗?

我目前得到的结果是它只显示了机器的Make和型号,但没有显示其他从Domain一直到GB中的内存。我希望它全部显示在底部的输出窗格上,并保存在一个文本文件中,该文件可以立即保存和打开。

请注意:文件打开时会显示数据,但主要问题是它不会显示在输出窗格中。这是脚本:

Clear-Host
Write-Host "Setting Execution Policy to Remote Signed..." -ForegroundColor Yellow 
Set-ExecutionPolicy RemoteSigned -Force
Write-Host "Your execution policy is set to:" -ForegroundColor Cyan 
Get-ExecutionPolicy
Start-Sleep -s 3
Clear-Host
Write-Host "Generating computer statistics..." -ForegroundColor Yellow
Write-Host " "
Start-Sleep -s 2
function systemstats {
Write-Host "Manufacturer:" -ForegroundColor Cyan 
Write-Host "$($m.Manufacturer)" -ForegroundColor Yellow
Write-Host "Model:" -ForegroundColor Cyan
Write-Host "$($m.Model)" -ForegroundColor Yellow
Write-Host "Domain:" -ForegroundColor Cyan
$env:USERDOMAIN
Write-Host "Computer Name:" -ForegroundColor Cyan 
$env:COMPUTERNAME
Write-Host "Operating System & Location:" -ForegroundColor Cyan 
(Get-WmiObject Win32_OperatingSystem).name
Write-Host "OS Architecture:" -ForegroundColor Cyan
if ((Get-WmiObject win32_operatingsystem | select osarchitecture).osarchitecture -eq "64-bit")
{
    Write "64-bit OS"
}
else
{
    Write "32-bit OS"
}
Write-Host "OS Build:" -ForegroundColor Cyan 
(Get-CimInstance Win32_OperatingSystem).version
Write-Host "Version:" -ForegroundColor Cyan 
(Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ReleaseID).ReleaseID
Write-Host "Current IP Address:" -ForegroundColor Cyan
Ipconfig | Select-String IPv4
Write-Host "Calculating RAM installed in MB:" -ForegroundColor Cyan 
(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
$m = (Get-WmiObject -Class Win32_ComputerSystem -Property * |
Select-Object -Property Manufacturer, Model)
Write-Host "Disk Space in GB:" -ForegroundColor Cyan
gwmi win32_logicaldisk | Format-Table DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}
}
$result=(systemstats)
$result | Out-File "C:\Users\brendan.hargate\Desktop\test.txt"
Invoke-Item "C:\Users\brendan.hargate\Desktop\test.txt"

2 个答案:

答案 0 :(得分:1)

使用Tee-Object代替Out-File

$result | Tee-Object -FilePath "C:\Users\brendan.hargate\Desktop\test.txt"

Tee-Object(受tee启发)将复制输入流 - 一个副本在管道下传递(在您的情况下将在命令窗格中结束),另一个写入变量或文件(如上例所示)

答案 1 :(得分:0)

部分中的systemstats函数使用Write-Host,它在PowerShell的(成功)输出流之外运行。

无法捕获

Write-Host输出(PSv4)/默认情况下未在变量或输出文件中捕获(PSv5 +)。顾名思义, Write-Host写入主机UI(控制台),并且意味着输出数据 - 那& #39; s Write-Output及其别名Write以及隐式输出(例如,$env:USERDOMAIN本身)适用于。

诸如$result = ...之类的变量赋值仅捕获(成功)输出流输出,即隐式输出和Write(a.k.a。Write-Output)命令的输出。相比之下,您的Write-Host命令直接打印到控制台。

鉴于您已将$result发送到文件 - 而不是将其打印到控制台 - 净效果是 Write-Host输出出现在控制台中。< / p>

因此,解决方案有两个组成部分:

  • 将您的功能修改为使用隐式输出(Write-Output输出)以产生数据输出。

  • 然后使用Tee-Object打印到两个控制台(通过成功输出流)一个文件,如{{3 }}

顺便说一句,在PSv5 +中,你可以躲过以下(虽然这是不明智的),基于捕获Write-Host输出的能力 - 现在是虚拟别名Write-Information - 通过新引入的输出流编号6

systemstats 6>&1 | # PSv5+: redirect the information stream to the (success) output stream.
  Tee-Object -FilePath "$([Environment]::GetFolderPath('Desktop'))\text.txt"