问题“使用大文件调用命令和获取内容”

问题描述 投票:0回答:1

这是我的第一篇文章,因为我找不到解决方案,而且我不明白出了什么问题......

我有一个简单的脚本,应该在调用命令中使用 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

}

知道为什么吗?

powershell invoke-command
1个回答
0
投票

您可以通过从中返回单个字符串来提高脚本的性能,您需要考虑

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"`
© www.soinside.com 2019 - 2024. All rights reserved.