我開發了這個腳本,將Sitecore工作流應用於整個項目,而無需通過GUI手動點擊。我對它的工作效果非常滿意,但速度很慢。這裏是腳本:爲什麼此PowerShell腳本如此緩慢?我如何加快速度?
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%。所以這不是我希望會發生的銀彈 - 我需要一個數量級或兩個數值的改進來使這個東西,我不必照顧和分批運行。我現在正在使用下面的精確答案建議的一些實際的腳本改進。我會回覆對我有用的東西。
參見[這裏](http://blogs.msdn.com/b/powershell/archive/2009/11/04/why-is-get- childitem那麼slow.aspx)。 –
在類似的說明@AnsgarWiechers的說法中,您可能會發現它在Powershell 3上更快。您使用哪個版本? –
@zespri使用[$ psversiontable.psversion] [這個問題](http://stackoverflow.com/questions/1825585/how-to-determine-what-version-of-powershell-is-installed),它說我在2.0.-1.-1,嘿。升級時間。 –