这是我的第一篇文章,因为我找不到解决方案,而且我不明白出了什么问题......
我有一个简单的脚本,应该在调用命令中使用 get-content 读取客户端上的大型日志文件。
如果我直接在客户端执行get-content,不到20秒,日志文件就已经读入变量了。
如果我通过调用执行相同的命令,则需要 2 分钟(2)。
invoke-command -ComputerName "computername" -ScriptBlock{
$datemsg = (get-date)
$msg = @()
$msg += "$datemsg vor"
$test = get-content "G:\test.log"
$datemsg = (get-date)
$msg += "$datemsg nach"
return $msg
}
知道为什么吗?
您可以通过从中返回单个字符串来提高脚本的性能,您需要考虑
Get-Content
本身,没有 -Raw
已经效率很低,因为它将把每一行包装在 PSObject
中,然后将属性附加到每行(PSPath
、PSParentPath
、PSChildName
等)。然后你需要考虑到 Invoke-Command
也会做类似的事情,对于每行它都会附加更多属性(PSComputerName
、RunspaceId
、PSShowComputerName
等),使其效率更低。那么你需要考虑运输这些物体的成本,运输单个大串比运输一千个小串更有效率,所以你可以做的是:
$result = Invoke-Command -ComputerName 'computername' -ScriptBlock {
[System.Text.StringBuilder]::new().
AppendLine("$(Get-Date) vor").
Append((Get-Content 'G:\test.log' -Raw)).
AppendLine("$(Get-Date) nach").
ToString()
}
在这种情况下创建单个字符串应该更有效,那么如果您需要在本地将其转换为数组,您可以使用
-split
,即:
$stringArray = $result -split '\r?\n'
$stringArray[0] # start time, result of `"$(Get-Date) vor"`
$stringArray[-1] # end time, result of `"$(Get-Date) nach"`