Cmdlets/UpdateWebResource.cs
using Microsoft.Xrm.Tooling.Connector;
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Management.Automation; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; namespace Xrm.DevOps.Tools.Cmdlets { [Cmdlet(VerbsData.Update, "WebResource")] public class UpdateWebResource: Cmdlet { [Parameter(Mandatory = true)] public string ConnectionString { get; set; } [Parameter(Mandatory = true)] public string Folder { get; set; } [Parameter(Mandatory = false)] public string SearchPattern { get; set; } [Parameter(Mandatory = false)] public bool IncludeExtensionInSearch { get; set; } = false; [Parameter(Mandatory = false )] public string SolutionName { get; set; } CrmServiceClient _client; protected override void BeginProcessing() { _client = new CrmServiceClient(ConnectionString); } protected override void ProcessRecord() { //https://github.com/WaelHamze/xrm-ci-framework/blob/master/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/SetXrmWebResourcesFromFolder.cs var resourceFiles = new HashSet<string>(); var patterns = string.IsNullOrWhiteSpace(SearchPattern) ? new string[1] { "*" } : SearchPattern.Split(','); foreach (var pattern in patterns) { WriteVerbose($"Processing pattern {pattern}..."); Directory.GetFiles(Folder, pattern.Trim(), SearchOption.AllDirectories).ToList() .ForEach((item) => resourceFiles.Add(item)); } if (resourceFiles.Count == 0) { WriteVerbose($"There are no files in folder '{Folder}' matching patterns {SearchPattern}"); return; } else WriteVerbose($"Found {resourceFiles.Count} resource files."); // Buscando no Dynamics foreach (var resourceFile in resourceFiles) { WriteVerbose($"Processing file: {Path.GetFileName(resourceFile)}"); string webResourceToSearch = string.Empty; if (IncludeExtensionInSearch) { webResourceToSearch = Path.GetFileName(resourceFile); } else { webResourceToSearch = Path.GetFileNameWithoutExtension(resourceFile); } Entity webResource = GetWebResourceByName(webResourceToSearch); if (Guid.Empty == webResource.Id) continue; // update in context var fileContent = Convert.ToBase64String(File.ReadAllBytes(resourceFile)); if (webResource.GetAttributeValue<string>("content")?.GetHashCode() != fileContent.GetHashCode()) { webResource.Attributes["content"] = fileContent; Microsoft.Xrm.Sdk.Messages.UpdateRequest updateRequest = new Microsoft.Xrm.Sdk.Messages.UpdateRequest { Target = webResource }; if (!string.IsNullOrEmpty(SolutionName)) { updateRequest.Parameters.Add("SolutionUniqueName", SolutionName); } var response = _client.Execute(updateRequest); } } } private Entity GetWebResourceByName(string webResourceName) { Entity resource = new Entity(); var query = new QueryExpression { EntityName = "webresource", ColumnSet = new ColumnSet("name","content"), Criteria = new FilterExpression { Conditions = { new ConditionExpression("name", ConditionOperator.Equal, webResourceName) } } }; var response = _client.RetrieveMultiple(query); if (response.Entities.Count > 0) { resource = response.Entities.First(); } else { WriteVerbose("WebResource not found."); } return resource; } protected override void EndProcessing() { } } } |