For Powershell v2
我有以下代码(它只是我一直在研究的批量代码的一个小节)。整个地方都有写主机,我被问到是否可以把它放到日志文件中。使用这个链接我已经按照步骤尝试了其他一些东西,但我无法让所有输出工作:
很多东西都没有出现在日志文件中 - 它在日志文件中只是空白但在屏幕上显示了输出 - 即:
任何WMI呼叫输出 - 即
@(Get-WmiObject -Class Win32_OperatingSystem | Select Caption, BuildNumber,CountryCode,CSDVersion,CSName,InstallDate, @ {Name =“Physical Memory Free”; Expression = {“{0:N1} GB” -f($ .FreePhysicalMemory / 1mb)}},@ {Name =“分页文件中的可用空间”; Expression = {“{0:N1} GB”-f($ .FreeSpaceInPagingFiles / 1mb )}}, @ {Name =“Free Virtual Memory”; Expression = {“{0:N1} GB” -f($ _.FreeVirtualMemory / 1mb)}} |格式列表)
刚刚运行的任何命令:ie net localgroup administrators
还有更多,但似乎主要是所有WMI调用。
以下是有问题的代码部分:
网络部分:
$forward = nslookup $computername
$reverse = [System.Net.Dns]::GetHostByName($computername) | select -Expa AddressList | select -Expa ipaddresstostring | % { nslookup $_ }
LogWrite "Doing forward lookup: "
$forward
LogWrite `r`n
LogWrite "Doing reverse lookup: "
$reverse
#$computername = gc env:computername
#$serverName = SV180515
$NicConfig = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $computername
$myCol = @()
ForEach ($Nic in $NicConfig)
{
If ($Nic.IPAddress -ne $null)
{
$myObj = "" | Select-Object Description, DHCPEnabled, IPAddress, IPSubnet, DefaultIPGateway, DNSServers, WINSServers, NICModel, SpeedDuplex
$myObj.Description = $Nic.Description
$myObj.DHCPEnabled = $Nic.DHCPEnabled
$myObj.IPAddress = $Nic.IPAddress
$myObj.IPSubnet = $Nic.IPSubnet
$myObj.DefaultIPGateway = $Nic.DefaultIPGateway
$myObj.DNSServers = $Nic.DNSServerSearchOrder
$myObj.WINSServers = $Nic.WINSPrimaryServer,$Nic.WINSSecondaryServer
$registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $computername)
$baseKey = $registry.OpenSubKey("SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}")
$subKeyNames = $baseKey.GetSubKeyNames()
ForEach ($subKeyName in $subKeyNames)
{
$subKey = $baseKey.OpenSubKey("$subKeyName")
$ID = $subKey.GetValue("NetCfgInstanceId")
If ($ID -eq $Nic.SettingId)
{
$componentID = $subKey.GetValue("ComponentID")
If ($componentID -match "ven_14e4")
{
$myObj.NICModel = "Broadcom"
$requestedMediaType = $subKey.GetValue("RequestedMediaType")
$enum = $subKey.OpenSubKey("Ndi\Params\RequestedMediaType\Enum")
$myObj.SpeedDuplex = $enum.GetValue("$requestedMediaType")
}
ElseIf ($componentID -match "ven_8086")
{
$myObj.NICModel = "Intel"
$SD = $subKey.GetValue("*SpeedDuplex")
$enum = $subKey.OpenSubKey("Ndi\Params\*SpeedDuplex\Enum")
$myObj.SpeedDuplex = $enum.GetValue("$SD")
}
ElseIf ($componentID -match "b06bdrv")
{
$myObj.NICModel = "Broadcom"
$SD = $subKey.GetValue("*SpeedDuplex")
$enum = $subKey.OpenSubKey("BRCMndi\Params\*SpeedDuplex\Enum")
$myObj.SpeedDuplex = $enum.GetValue("$SD")
}
Else
{
$myObj.NICModel = "unknown"
$myObj.SpeedDuplex = "unknown"
}
}
}
$myCol += $myObj
}
}
$myCol
WMI位:
#Check for local groups on server
net localgroup administrators
#checking event log for errors
LogWrite "Checking System Event log for errors"
Get-Eventlog system -newest 2000 | where {$_.entryType -match "Error"} | Format-Table TimeWritten, EventID, Message -auto
LogWrite `
LogWrite "Checking Application Event log for errors"
Get-Eventlog application -newest 2000 | where {$_.entryType -match "Error"} | Format-Table TimeWritten, EventID, Message -auto
Get-WMIObject Win32_LogicalDisk | Select SystemName,DriveType,DeviceID,VolumeName,@{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}},@{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}},@{Name=”Percentage(%) Free”;Expression={“{0:0}%” -f($_.freespace*100/$_.size)}}| Format-Table -AutoSize
$pagefilesize = Get-WmiObject win32_pagefile | ForEach-Object {$_.FileSize/1gb}
#LogWrite "Page File is set to"$pagefilesize"GB"
#check pagefile is systemed managed - if it is set to 0 then it is system managed
$PageFileSystem = Get-WmiObject Win32_PageFileSetting
if ($PageFileSystem.MaximumSize -eq "0")
{
LogWrite "Page File is System Managed and set to"$pagefilesize"GB"
}
else
{
LogWrite "*********ERROR - Page File is not System Mangaged*********"
}
答案 0 :(得分:2)
运行powershell.exe -file script.ps1 *> c:\ log.txt这个shoud写入日志文件中的所有输出和错误
或者你可以使用start-transcript:
start-transcript -path c:\temp\mylog.txt
.\myscript.ps1
stop-transcript
答案 1 :(得分:1)
您是否考虑过在功能中收集脚本?然后,您可以使用Out-File -Append
运行脚本中的函数来记录它。将Write-Host
替换为Write-Output
,因为write-host是交互式cmdlet。然后在runcommand中提供logpath。这是一个示例:
Untitled2.ps1
param($logpath)
function test {
$service = Get-Service | where {$_.status -eq "Running" }
$service | ft name, status -auto
Write-output "hey"
ping 10.0.0.1
net localgroup
}
if($logpath) {
#Run functions in script
test | Out-File -Append $logpath
} else {
#Run functions in script
test
}
然后我在cmd / bat中使用以下命令运行它:
powershell.exe -noprofile -file Untitled2.ps1 -logpath "c:\users\graimer\desktop\testlog.txt"
或者在powershell中:
.\Untitled2.ps1 -logpath "c:\users\graimer\desktop\testlog.txt"
答案 2 :(得分:0)
另一个答案可能是在执行脚本后捕获缓冲区内容。看这里:http://blogs.msdn.com/b/powershell/archive/2009/01/10/capture-console-screen.aspx