如何远程执行PowerShell命令,并把结果保存在本地文件中


PowerShell交流中心如何远程执行PowerShell命令,并把结果保存在本地文件中
0
gallen asked 5年 ago

这个脚本主要是用于检查某天更新的patches,将结果返回保存到excel文件。代码如下(本地执行的测试代码):

#获取2/7/2017所更新的patches
$patches = Get-HotFix | ForEach-Object { if( ($_.InstalledOn).ToString() -match "2/7/2017" ){$_ }  }

#创建excel文件
$excel = New-Object -ComObject Excel.Application

#添加工作簿
$workbook = $excel.Workbooks.add()

#获取工作表对象
$sheet = $workbook.worksheets.Item(1)

#更改工作表的名称
$workbook.Worksheets.item(1).name="Patches"

#连接工作表
$sheet = $workbook.WorkSheets.Item("Patches")

#设置工作表行数
$x = 2

#设置第一行各单元格的表头名称
$sheet.cells.item(1,1) = "Source"

$sheet.cells.item(1,2) = "Description"

$sheet.cells.item(1,3) = "HotFixID"

$sheet.cells.item(1,4) = "InstalledBy"

$sheet.cells.item(1,5) = "InstalledOn"

#循环遍历patches,并将数据按顺序位置输出
foreach($patch in $patches)
{
$sheet.cells.item($x,1) = $patch.PSComputerName

$sheet.cells.item($x,2) = $patch.Description

$sheet.cells.item($x,3) = $patch.HotFixID

$sheet.cells.item($x,4) = $patch.InstalledBy

$sheet.cells.item($x,5) = $patch.InstalledOn

$x++
}

#自动调整单元格的列宽
$range = $sheet.usedRange

$range.EntireColumn.AutoFit() | out-null

#将结果保存excel文件
$workbook.SaveAs("c:\patches.xlsx")

#结束EXCEL进程
Get-Process -ProcessName EXCEL | Stop-Process

请问如何让远程的计算机执行,并返回结果到本地??Many thanks.

×用微信扫描并分享
0 Answers
1
Mooser Lee 管理员 answered 5年 ago

1.远程机器首先得开启允许PowerShell远程访问

Enable-PSRemoting -Force -SkipNetworkProfileCheck

2. 本地计算机在远程机器上执行命令,并返回结果

$result = Invoke-Command -ScriptBlock { Get-HotFix |select -First 5 } -ComputerName localhost,127.0.0.1

#给远程机器结果分组
$groups = $result | Group-Object -Property PSComputerName -AsHashTable
foreach($computer in $groups.Keys)
{
$singleResult = $groups.$computer

#单个远程机器的结果
#$singleResult

#TODO:用你自己本地的Excel代码处理一下
#保存的文件名可以 使用
"D:\$computer.report.xls"
}

 

gallen replied 5年 ago

Many thanks,Mooser.这个分组想法太好了,可以很清晰的区分每台server的patches信息。另外,我想请问下Get-HotFix似乎只能获取Window Update的patch,而获取不到Microsoft Update的patch。我看到你之前有用Get-ItemProperty查找注册表,得到已安装的软件。有没有一个方法可以得到与control panel-〉Installed Update下同样的信息,就是能够把所有的已安装patches都列出来??

Mooser Lee 管理员 replied 5年 ago

试试Get-WmiObject -Class “win32_quickfixengineering”