gpt4 book ai didi

powershell - 为什么这个 PowerShell 脚本这么慢?我怎样才能加快速度?

转载 作者:行者123 更新时间:2023-12-02 07:22:02 30 4
gpt4 key购买 nike

我开发了这个脚本,将 Sitecore 工作流程应用于整个项目,而无需手动单击 GUI。我对它的效果非常满意,但速度很慢。这是脚本:

Import-Module 'C:\Subversion\CMS Build\branches\1.2\sitecorepowershell\Sitecore.psd1'

# Hardcoded IDs of workflows and states
$ContentApprovalWfId = "{7005647C-2DAC-4C32-8A09-318000556325}";
$ContentNoApprovalWfId = "{BCBE4080-496F-4DCB-8A3F-6682F303F3B4}";
$SettingsWfId = "{7D2BA7BE-6A0A-445D-AED7-686385145340}";

#new-psdrive *REDACTED*

set-location m-rocks:

function ApplyWorkflows([string]$path, [string]$WfId) {
Write-Host "ApplyWorkflows called: " $path " - " $wfId;
$items = Get-ChildItem -Path $path;
$items | foreach-object {
if($_ -and $_.Name) {
$newPath = $path + '\' + $_.Name;
$newPath;
} else {
Write-host "Name is empty.";
return;
}

if($_.TemplateName -eq "Folder" -or $_TemplateName -eq "Template Folder") {
# don't apply workflows to pure folders, just recurse
Write-Host $_.Name " is a folder, recursing.";
ApplyWorkflows $newPath $wfId;
}
elseif($_.TemplateName -eq "Siteroot" -or $_.TemplateName -eq "InboundSiteroot") {
# Apply content-approval workflow
Set-ItemProperty $newPath -name "__Workflow" $ContentApprovalWfId;
Set-ItemProperty $newPath -name "__Default workflow" $ContentApprovalWfId;

# Apply content-no-approval workflow to children

Write-Host $_.Name " is a siteroot, applying approval workflow and recursing.";
ApplyWorkflows $newPath $ContentNoApprovalWfId;
}
elseif($_.TemplateName -eq "QuotesHomePage") {
# Apply settings workflow to item and children

Write-Host $_.Name " is a quotes item, applying settings worfklow recursing.";

Set-ItemProperty $newPath -name "__Workflow" $SettingsWfId;
Set-ItemProperty $newPath -name "__Default workflow" $SettingsWfId;

ApplyWorkflows $newPath $SettingsWfId;
}
elseif($_.TemplateName -eq "Wildcard")
{
Write-Host $_.Name " is a wildcard, applying workflow (and halting).";
Set-ItemProperty $newPath -name "__Workflow" $ContentApprovalWfId;
Set-ItemProperty $newPath -name "__Default workflow" $ContentApprovalWfId;
}
elseif($_ -and $_.Name) {
# Apply passed in workflow and recurse with passed in workflow
Write-Host $_.Name " is a something else, applying workflow and recursing.";
Set-ItemProperty $newPath -name "__Workflow" $WfId;
Set-ItemProperty $newPath -name "__Default workflow" $WfId;

ApplyWorkflows $newPath $wfId;
}
}
}

ApplyWorkflows "sitecore\Content\" $ContentNoApprovalWfId;

它在不到一秒的时间内处理一个项目。其进程中有一些暂停 - 证据表明这是 Get-ChildItem 返回大量项目的时候。我想尝试很多事情,但它仍在我们的一个网站上运行。大约过了 50 分钟,看起来可能完成了 50%,也可能更少。看起来它的工作广度优先,因此很难确切地了解已完成的内容和未完成的内容。

那么是什么让我放慢了脚步?

是路径构建和检索吗?我尝试通过 $_$_.Name 获取当前项目的子项,但它总是在当前工作目录(即根目录)中查找,并且找不到该项目。每次递归时更改目录会更快吗?

是输出让它陷入困境吗?没有输出,我不知道它在哪里,也不知道它是否仍在工作。有没有其他方法可以让我知道它在哪里、已经完成了多少次等等?

有没有更好的方法,我只需将 Get-ChildItem -r 与过滤器集一起使用并循环这些过滤器集?如果是这样,我们将非常感谢您第一次尝试将第一个脚本中的一些条件合并到过滤器集中。我是 PowerShell 新手,因此我确信我的代码中需要进行不止一两个改进。

即使没有子项,我是否总是调用递归位?这里的内容树非常广泛,有很多没有子节点的叶子。什么是检查子项目是否存在的好方法?

最后,我们拥有的 PowerShell 提供程序 (PSP) 并不完整。它似乎没有 Get-Item 的有效实现,这就是为什么所有内容几乎完全用 Get-ChildItem 编写的原因。我们的 Sitecore.Powershell.dll 说它是版本 0.1.0.0。升级会有帮助吗?有更新的吗?

编辑:终于完成了。我对输出进行了计数,得出了 1857 个项目,运行时间约为 85 分钟,平均每分钟 21 个项目。比我想象的要慢,甚至...

编辑:我的第一次运行是在 PowerShell 2.0 上,使用 Windows PowerShell ISE 。我还没有尝试过 Sitecore PowerShell 插件模块或社区。直到昨天我什至都不知道它的存在:-)

升级到 PowerShell 3.0 后我尝试了另一次运行。从本地启动 - 从我的笔记本电脑运行脚本,连接到远程服务器 - 没有明显的差异。我在托管箱上安装了 PowerShell 3.0 并从那里运行脚本,发现速度可能提高了 20-30%。所以这不是我所希望的 Elixir ——我需要一个或两个数量级的改进才能使我不必照顾和批量运行。我现在正在尝试下面的详细答案所建议的一些实际脚本改进。我会回复对我有用的内容。

最佳答案

我个人认为,如果您开始使用社区 PowerShell 实现而不是 Rocks 实现,您将获得最大的提升。

让我解释一下原因。

您正在遍历整个树,这意味着您必须访问分支中的每个节点,这意味着它必须被读取并通过 Rocks Web 服务至少传输一次。然后,每个属性保存都是另一个 Web 服务调用。

我已经在社区控制台中运行了您的脚本,大约花了 25 秒才处理了 3724 个项目。(我删除了修改,因为这些值与我的系统无关)。

简单

Get-ChildItem -recurse

我的 3724 项目树在社区控制台中花费了 11 秒,而在 Rocks 实现中花费了 48 秒。

您可以在脚本的社区实现中使用的其他调整是使用 Sitecore 查询,例如:

get-item . -Query '/sitecore/content/wireframe//*[@@TemplateName="Template Folder"]'

并且仅将这些项目发送到您的函数中

这并不意味着Rocks控制台写得不好,它只是意味着Rocks控制台的设计选择和他们的目标不同。

您可以在此处找到社区控制台: http://bit.ly/PsConScMplc

关于powershell - 为什么这个 PowerShell 脚本这么慢?我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18006050/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com