using System; using System.Windows.Forms; using System.IO; using System.Text.RegularExpressions; using System.Text; class Script { /// <summary> /// This script will write a Text file containing all the Biml Script Locations/Names/Descriptions. /// /// The Description is pulled from an annotation in the format /// <#@ annotation annotationtype="Description" tag="Summary" text="<Description>" #> /// </summary> /// <param name="args">The args.</param> [STAThread] static public void Main(string[] args) { // Location to dump the output. var outputPath = @"C:\Temp\BimlScriptDocumentation.txt"; // Set up the location where the Biml Scripts live. var edw3Trunk = Environment.GetEnvironmentVariable("BFG_BI_EDW3_TRUNK", EnvironmentVariableTarget.Machine); var bimlScriptPath = Path.Combine(edw3Trunk, "Framework", "BimlScripts"); StringBuilder output = new StringBuilder(); // Output the table header output.AppendFormat("||{0}||{1}||{2}||\r\n", "Path", "Script", "Description"); // Loop over all the Biml files foreach(var file in Directory.GetFiles(bimlScriptPath, "*.biml", SearchOption.AllDirectories)) { string relativePath = Path.GetDirectoryName(file).Remove(0, bimlScriptPath.Length+1); string scriptName = Path.GetFileNameWithoutExtension(file); string scriptContents = File.ReadAllText(file); string scriptDocumentation = " "; // Important! Required for the table to format correctly. // Get the first "Description" annotation in the file (if one exists). string annotationRegex = "<\\#@(?:\\s+)annotation(?:\\s+)annotationtype=\"Description\"(?:\\s+)tag=\"Summary\"(?:\\s+)text=\"(.*?)\"(?:\\s+)\\#>"; RegexOptions options = ((RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline) | RegexOptions.IgnoreCase); Regex reg = new Regex(annotationRegex, options); var groupCollection = reg.Match(scriptContents).Groups; if (groupCollection.Count >= 2) { scriptDocumentation = groupCollection[1].Value.ToString(); } // Output the table row output.AppendFormat("|{0}|{1}|{2}|\r\n", relativePath, scriptName, scriptDocumentation); } // Write the output to a file; it's hard to get from the console. if (File.Exists(outputPath)) { File.Delete(outputPath); } File.WriteAllText(outputPath, output.ToString()); } }
Our team has created several dozen Biml Scripts over the last few months... enough that it is tough to know exactly what we have. We use the following C# to enumerate the scripts (stored in a common location and included in all of our projects) and generate a Confluence wiki table. You'll have to modify this to adjust the output / path but it might be helpful to someone.
This assumes scripts have a Description annotation in the format
<#@ annotation annotationtype="Description" tag="Summary" text="
Comments
Paul S. Waters
3:58pm 10.31.13
Nice script David.
After making the edits for my environment, I was not able to run the script without the following error:
C:\WINDOWS\system32>echo off C# Script execution engine. Version 3.6.0.0. Copyright (C) 2004-2013 Oleg Shilo.
Error: Specified file could not be executed.
System.ArgumentOutOfRangeException: Index and count must refer to a location wit hin the string. Parameter name: count at System.String.Remove(Int32 startIndex, Int32 count) at Script.Main(String[] args) Press any key to continue . . .
To resolve the issue I edited the following line from: string relativePath = Path.GetDirectoryName(file).Remove(0, bimlScriptPath.Length+1); To: string relativePath = Path.GetDirectoryName(file).Substring(0, bimlScriptPath.Length);
It ends up getting the absolute path, but for my case that is fine.
Thanks.