The creativity of our fellow CRMers does not stop to surprise me. They go to the extraordinary lengths to avoid code because, as the true masters of their craft, they do not parade the skills just for the sake of it. But, as I was preparing the awesome tip #691 I couldn’t help but repeat “there must be a better way”.
Good developers write good code but
true developers only write code when there is no any other way or when the alternative is too painful to execute.
Extracting the templates from CRM 2016 seem to be one of these cases. There are extractions and then there are extractions.
Compare setting up a fake workflow with the script that uses PowerShell module for Dynamics CRM Organization Data and extracts all templates including Excel ones into a temp folder in one sweet move:
Import-Module Microsoft.Xrm.Data.Powershell $Global:conn = Get-CrmConnection -InteractiveMode # get all template records $templates = Get-CrmRecords ` -EntityLogicalName documenttemplate ` -Fields name,documenttype,content # loop through the templates ForEach($t in $templates.CrmRecords) { # figure out file extension if($t.documenttype -eq 'Microsoft Excel') { $ext = '.xlsx' } else { $ext = '.docx' } $filename = 'c:\temp\' + $t.name + $ext write-host $filename # decode and dump file content $bytes = [convert]::FromBase64String($t.content) [io.file]::WriteAllBytes($filename, $bytes) }
PS. Credit where credit is due. After writing the script above I found the equivalent C# code, so I won’t be claiming land rights on this one.