<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>VSoft Technologies Blogs</title><description>VSoft Staff Blogs</description><link>http://www.finalbuilder.com/Resources/Blogs.aspx</link><item><title>EC2 Support in FinalBuilder 7.0</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/416/EC2-Support-in-FinalBuilder-70.aspx</link><category>FinalBuilder</category><pubDate>Sun, 04 Sep 2011 14:00:00 GMT</pubDate><description>&lt;p&gt;FinalBuilder 7.0.0.1497 adds support for Amazon's EC2 Cloud Services. The EC2 Actions allow you to interact with EC2 instances during your build process. This enables deploying to test or production environments running on EC2 services.&lt;/p&gt;
&lt;p&gt;The EC2 support add's 16 new Actions to FinalBuilder&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;EC2 Get Instance Properties - This action allows you to retrieve the selected property of instances available to you. You can filter which results to return using the optional filters.&lt;span style="font-family: calibri; font-size: 11pt;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;EC2 Change Instance States - This action enables you to change the state of one or more instances.&lt;/p&gt;
&lt;p&gt;EC2 Run&amp;nbsp;Instances - This action enables you to run (create) one or more instances.&lt;/p&gt;
&lt;p&gt;EC2 Terminate Instance - This action enables you to terminate one or more instances. Note that this action is permanent and cannot be undone.&lt;/p&gt;
&lt;p&gt;EC2 Get Image Properties - This action allows you to retrieve the selected property of images available to you. You can filter which results to return using the optional filters.&lt;/p&gt;
&lt;p&gt;EC2 Create Image - This action enables you to create an image from an instance.&lt;/p&gt;
&lt;p&gt;EC2 Deregister Image - This action enables you to deregister (delete) an image. Please note that this action is permanent and cannot be undone.&lt;/p&gt;
&lt;p&gt;EC2 Create Volume - This action enables you to create a volume,  either as a blank volume of a specific size, or a volume restored from a  snapshot.&lt;/p&gt;
&lt;p&gt;EC2 Delete Volume - This action enables you to delete a volume. Note that this action is permanent and cannot be undone.&lt;/p&gt;
&lt;p&gt;EC2 Attach Volume - This action enables you to attach a volume to an instance.&lt;/p&gt;
&lt;p&gt;EC2 Detatch Volume - This action enables you to detach a volume from any instances it is attached to.&lt;/p&gt;
&lt;p&gt;EC2 Get Volume Properties - This action allows you to retrieve the  selected property of volumes available to you. You can filter which  results to return using the optional filters.&lt;/p&gt;
&lt;p&gt;EC2 Get Snapshot Properties - This action allows you to retrieve the selected property of snapshots available to you. You can filter which results to return using the optional filters.&lt;/p&gt;
&lt;p&gt;EC2 Create Snapshot - The Access Key and Secret Key for your AWS account. If "Use Global Values" is checked, the values set in the options page (Tools &amp;gt; Options &amp;gt; Internet &amp;gt; EC2) will be used instead.&lt;/p&gt;
&lt;p&gt;EC2 Delete Snapshot - This action enables you to delete a snaphot. Note that this action is permanent and cannot be undone.&lt;/p&gt;
&lt;p&gt;EC2 Get Availability Zones - This action allows you to retrieve the name of availability zones available to you. You can filter which results to return using the optional filters.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>FinalBuilder: now with NuGet-y goodness</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/690/FinalBuilder-now-with-NuGet-y-goodness.aspx</link><category>FinalBuilder</category><pubDate>Fri, 27 May 2011 08:12:00 GMT</pubDate><description>&lt;p&gt;NuGet is a open source package management tool for .NET applications. It allows you to very simply install, create and share reusable assemblies. With the latest release, FinalBuilder now contains a set of actions to help you interact with NuGet&amp;nbsp;as part of&amp;nbsp;your automated build process.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="background-color: white; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: tahoma, arial, helvetica, sans-serif;"&gt;
&lt;h2 style="color: #293955; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'trebuchet ms', helvetica, arial, sans-serif; line-height: 1.2em; font-size: 1.4em;"&gt;First things first&lt;/h2&gt;
&lt;p&gt;To get started, you'll need to download nuget.exe from&amp;nbsp;&lt;a style="color: #354c67; text-decoration: none;" href="http://nuget.codeplex.com/releases"&gt;codeplex&lt;/a&gt;. Optionally, if you'd like to Push or Delete to nuget.org you will need an APIKey. You can get one by creating an account at&amp;nbsp;&lt;a style="color: #354c67; text-decoration: none;" href="http://nuget.org"&gt;nuget.org&lt;/a&gt;&amp;nbsp;and going to the My Account page.&lt;/p&gt;
&lt;p&gt;Once you have those,&amp;nbsp;in FinalBuilder&amp;nbsp;go to Tools -&amp;gt; Options and under .Net Tools select NuGet. Set the path to the folder where nuget.exe is located and if you have an API Key, add it in as well.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" width="501" height="153" style="border-width: initial; border-color: initial;border-width: 0px;border-style: none;" src="/blogimages/ben/nuget/options.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="color: #293955; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'trebuchet ms', helvetica, arial, sans-serif; line-height: 1.2em; font-size: 1.4em;"&gt;Installing packages&lt;/h2&gt;
&lt;p&gt;If you use nHibernate, jQuery or any of the 1500 other packages that are available from nuget.org, you can use the NuGet Install action to keep your build process up to date. This is particularly useful if you're using FinalBuilder on a continious integration server such as FinalBuilder Server.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" style="border-width: initial; border-color: initial;border-width: 0px;border-style: none;" src="/blogimages/ben/nuget/install.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;install&gt;&lt;/install&gt;&lt;/p&gt;
&lt;p&gt;You can install from the default (nuget.org) server or your own custom package feed. Having your CI server pull down the latest version of a third party library is a quick and easy way to see if the latest version has any breaking changes for your codebase. If it does, you can choose to install a specific version until you've modified your code to be compatable with the changes.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="color: #293955; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'trebuchet ms', helvetica, arial, sans-serif; line-height: 1.2em; font-size: 1.4em;"&gt;Sharing packages&lt;/h2&gt;
&lt;p&gt;If you develop an open source library for .NET and want people to use it, it makes a lot of sense to have it published on NuGet. And if you use FinalBuilder to build the library, it's pretty simple to add publishing into your build process. Or, if you have a lot of shared internal assemblies and are looking for a better way to distribute them, publishing to an internal NuGet server may make your life a lot easier.&lt;/p&gt;
&lt;p&gt;FinalBuilder has 4 actions to help with the publishing process. If you're familiar with using nuget.exe from the command line they should be very familiar.&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;&lt;strong&gt;Spec&lt;/strong&gt;&amp;nbsp;action creates a .nuspec file - either with placeholder data or with metadata from a project file (.csproj) or an assembly. The nuspec is an XML file, so after you've created it you can use FinalBuilder's XML actions to easily manipulate it.&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;&lt;strong&gt;Pack&lt;/strong&gt;&amp;nbsp;action creates a .nupgk file from your nuspec, ready for deployment. Alternatively, you can create a package directly from a project file. The Pack action lets you choose which project configuration to use (if you're using a csproj), override the version number and use a pattern to exclude files from the package.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" style="border-width: initial; border-color: initial;border-width: 0px;border-style: none;" src="/blogimages/ben/nuget/pack.png" /&gt;&lt;/p&gt;
&lt;p&gt;Once you have your nupkg, you can use the&amp;nbsp;&lt;strong&gt;Push&lt;/strong&gt;&amp;nbsp;action to publish it to either the default server on nuget.org, or to your custom NuGet server. If you prefer, you can upload but not publish the package. That way you can manually go to the site and press the Go button before anyone will see it.&lt;/p&gt;
&lt;p&gt;Lastly there's the&amp;nbsp;&lt;strong&gt;Delete&lt;/strong&gt;&amp;nbsp;action, which removes the package you specify from the server.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style="color: #293955; font-weight: bold; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'trebuchet ms', helvetica, arial, sans-serif; line-height: 1.2em; font-size: 1.4em;"&gt;Further information&lt;/h2&gt;
&lt;p&gt;&lt;a style="color: #354c67; text-decoration: none;" href="http://nuget.org"&gt;NuGet.org&lt;/a&gt;&amp;nbsp;is the place to go any lots more information. Scott Hanselman also has an&amp;nbsp;&lt;a style="color: #354c67; text-decoration: none;" href="http://www.hanselman.com/blog/NuGetForTheEnterpriseNuGetInAContinuousIntegrationAutomatedBuildSystem.aspx"&gt;excellent presentation&lt;/a&gt;&amp;nbsp;that covers everything you should need to know (although we disagree with his choice of build automation tools :) )&lt;/p&gt;
&lt;/div&gt;</description></item><item><title>FinalBuilder Master Class - Part 1 - Hidden features. </title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/415/FinalBuilder-Master-Class-Part-1-Hidden-featu.aspx</link><category>FinalBuilder</category><pubDate>Tue, 26 Apr 2011 14:00:00 GMT</pubDate><description>&lt;p&gt;Over the next few posts, I'm going to try to talk about some of the lesser known features in FinalBuilder, and show some ideas and techniques that I hope will help you improve your FinalBuilder projects.&lt;/p&gt;
&lt;h6&gt;Wouldn't it be great if a failed action could automatically retry if it fails?&lt;/h6&gt;
&lt;p&gt;Absolutely, it's a great idea, and its a feature that's been in FinalBuilder for several years. Unfortunately it's not as obvious as it could be, we ran out of screen real estate a few versions back and it got pushed into another dialog (rather than add another tab!)&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/Portals/0/ArticleImages/BlogImages/ActionRetry.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;Note that this feature should really only be used when accessing a resource which might occasionally fail, for example we use this on our SignTool action when codesigning/timestamping the exe's because the timestamp server (Verisign's) sometimes fails to respond. We found if we ran the build again straight away, the timestamp server usually responds just fine, the server availability issue is usually transient and the retry option with a suitable pause resolves this issue nicely. It makes no sense to use this option on a compiler action though, as the result would most likely not change.&lt;/p&gt;
&lt;h6&gt;I&amp;nbsp;wish I could define local Variables!&lt;/h6&gt;
&lt;p style="text-align: left;"&gt;In FinalBuilder 7, you can! The Action Group action in FB7 allows you to define local variables. These variables are then available to all child actions of the Action Group action.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/Portals/0/ArticleImages/BlogImages/FB7_LocalVar1.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;How can I&amp;nbsp;capture and process the output of my custom executable?&lt;/h6&gt;
&lt;p style="text-align: left;"&gt;We get ask this one quite often, so I&amp;nbsp;guess we haven't done a great job of publicising the Output Monitors feature. Output Monitors are available on all actions, and they allow you to process the logged output of the action. A typical example of the use of output monitors might be to fail an action if a particular bit of text is output from the action.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/Portals/0/ArticleImages/BlogImages/Outputmonitors.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;h6&gt;Variable Suggestion (F12)&lt;/h6&gt;
&lt;p style="text-align: left;"&gt;This is another one of those features that has been there a while but is not well known. I&amp;nbsp;showed this feature to some of the newer developers here last week and got lots of "oh wow, I never knew that" type responses. I have to admit I'd forgotten about it myself until I&amp;nbsp;started looking for ideas for this post! The way it works is that pressing F12 on a text field will drop down a list of suggestions on variable usage. The list is weighted so that variables that replace the most of the original string will list at the top. This is a great help in making sure you don't hard code paths when the project needs to run on another machine.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/Portals/0/ArticleImages/BlogImages/VariableSuggestion.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>DUnit and FinalBuilder/FinalBuilder Server - better integration.</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/414/DUnit-and-FinalBuilderFinalBuilder-Server-bette.aspx</link><category>FinalBuilder,FinalBuilder Server</category><pubDate>Sun, 14 Nov 2010 14:00:00 GMT</pubDate><description>&lt;p&gt;FinalBuilder has had an NUnit action for some time now, but for DUnit  we have always advocated just compiling the unit test executable as a  console app using the TextTestRunner, and using the Execute Program  action. This has worked fine, however it doesn't provide the same sort  of integration into FinalBuilder Server as the NUnit action provides.&lt;/p&gt;
&lt;p&gt;FinalBuilder 7.0.0.848 or later includes a new DUnit action. This action  is designed to run DUnit test applications that are written as console  apps, and use the FinalBuilder.XMLTestRunner.pas file to run the unit  tests. This unit produces and xml report file in the same format as  NUnit, which means that FinalBuilder already knows how to parse it. Also  included in the FinalBuilder\DUnit folder is an XSL stylesheet and a CSS&amp;nbsp;file to transform the xml report file to html (which can be done using the TransformXML action. The  FinalBuilder.XMLTestRunner is a combination of the xml test runner and  the text test runner. It still writes out to the console (which the  action sends to the FinalBuilder log) and it also writes the xml report  file.&lt;/p&gt;
&lt;p&gt;When the DUnit action is used under FinaBuilder Server 7.x - the DUnit results are shown on the Status page :&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/blogimages/DUnitSummary.png" /&gt;&lt;/p&gt;
&lt;p&gt;and in a separate tab on the Build Log page :&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" width="600" src="http://www.finalbuilder.com/blogimages/DUnitPass.png" /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" width="600" src="http://www.finalbuilder.com/blogimages/DUnitFailure.png" /&gt;&lt;/p&gt;
&lt;p&gt;The Passes and Failures can be inspected by clicking on the green or red buttons.&lt;/p&gt;
&lt;p&gt;The FinalBuilder\DUnit folder also includes a simple example test  application which shows how to structure your test executable to use the  FinalBuilder.XMLTestRunner.&lt;/p&gt;
&lt;p&gt;FinalBuilder 7.0.0.848 is available &lt;a href="http://www.finalbuilder.com/downloads/finalbuilder/aex6/FB700_848.exe"&gt;here&lt;/a&gt; - disclaimer - please note it is a Test build, which means it's a build which contains bug fixes and or new features since the last official update, but has not had the same testing applied to it as an official update build would.&lt;/p&gt;</description></item><item><title>Introducing FinalBuilder 7</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/412/Introducing-FinalBuilder-7.aspx</link><category>FinalBuilder</category><pubDate>Sun, 11 Jul 2010 14:00:00 GMT</pubDate><description>&lt;p&gt;It's been a long time in the making, but FinalBuilder 7 is almost here.  FinalBuilder 7 has been in private beta testing for a few weeks, and  today we are opening the beta to existing customers.&lt;/p&gt;
&lt;p&gt;If you have an  account on our website, and have a license for any version of  FinalBuilder then you should have access to the FinalBuilder 7 Beta  Forum. If you don't see it, try logging out and in again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #993300; font-size: medium;"&gt;What's new in FinalBuilder 7?&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: larger;"&gt;NEW&amp;nbsp;IDE&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Well, as the saying goes, a picture is worth a thousand words.. so lets take a look :&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/Portals/0/ArticleImages/BlogImages/FB7_IDE_1.png" target="_blank"&gt;&lt;img alt="" height="276" width="400" src="/Portals/0/ArticleImages/BlogImages/FB7_IDE_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FinalBuilder 7 sports a new IDE.&amp;nbsp; The FinalBuilder 7 IDE&amp;nbsp;is capable of opening multiple projects (whereas FB6 only allows 1 at a time). The new IDE includes docking, something that has been requested many times over the years, so you can lay out the IDE to suite your taste. The current theme is modelled on Visual Studio, however by the time FB7 ships we should have an alternative theme available too.&lt;/p&gt;
&lt;p&gt;There are many little enhancements and tweaks in the IDE. The most requested feature that we did implement is the renaming of variables. In FB6, when you rename a variable it does not rename references to it in the project. FB7 will attempt to find and rename all references (there may be a few cases we have missed, if you find any let us know).&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: larger;"&gt;&lt;strong&gt;&lt;span style="color: #993300;"&gt;Core Changes&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: larger;"&gt;Unicode Support&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;FinalBuilder is now compiled with a unicode aware compiler. The native internal string type is UTF16, and we have worked hard to ensure that all actions that work with files respect the original files encoding. This has been a massive endevour, and we are still in the process of testing actions to ensure compliance. The user interface should fully support unicode.&amp;nbsp; Note that while FinalBuilder may support unicode, many of the tools it calls do not.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: larger;"&gt;Variable Types&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In FinalBuilder 6 and earlier, all FinalBuilder variables are implemented as Variants. Those of you who have done some COM programming, or used Visual Basic 6 or earlier, or Delphi might be familiar with Variants. A Variant is a type that can store values of various types. Variants are very useful in many cases, but are not without their problems. For example, if you want to store a string "03" in a variant, you will have to put the double quotes around the 03, otherwise we have no idea it's not a number. To circumvent this problem, in FinalBuilder 7 we allow you to specify the variable type :&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/Portals/0/ArticleImages/BlogImages/FB7_VariableType.png" target="_blank"&gt;&lt;img alt="" height="342" width="400" src="/Portals/0/ArticleImages/BlogImages/FB7_VariableType.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you specify a variable type, that is how the variable will be treated, so for example if you attempt to assign a string value to an integer variable it will fail. Typed variables also allow you to specify a format string, which will be used when the variable is evaluated in an expression. For example, if you have a build number variable, that you always want to use as 4 digits, with zeros padding out the left, setting the format string to %.4d will do this.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: larger;"&gt;Local Variables&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In addition to the existing variable scopes (environment, application,user, project) and action list parameters, FinalBuilder 7 includes a local variable scope. The Action Group Action has a new property page that allows you to define the local variables.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/Portals/0/ArticleImages/BlogImages/FB7_LocalVar1.png" target="_blank"&gt;&lt;img alt="" height="358" width="400" src="/Portals/0/ArticleImages/BlogImages/FB7_LocalVar1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These variables are only visible to child actions of the group. Since groups can be nested, this provides the ability to override variables locally, and define variables for temporary use.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" height="101" width="280" src="/Portals/0/ArticleImages/BlogImages/FB7_LocalVar2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Local variables cannot be persisted and cannot be used as environment variables.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #993300; font-size: medium;"&gt;New Actions &lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Of course as with every new release we added a bunch of actions:&lt;/p&gt;
&lt;p class="MsoNormal"&gt;- NDepend Action&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- Git Actions&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- Plastic SCM Actions&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- Check If Host Exists Action&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- SetupBuilder Actions&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- SecureZIP Actions&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
- Signtool Actions&lt;br /&gt;
- Hyper V Actions&lt;br /&gt;
- Mercurial Actions&lt;br /&gt;
- SSH&amp;nbsp;Actions&lt;br /&gt;
- XML&amp;nbsp;Node Exists Action&lt;/p&gt;
&lt;p class="MsoNormal"&gt;And many of the existing actions had enhancements to them, support for filesets added to more actions.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: medium; color: #993300;"&gt;What about FinalBuilder Server 7?&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;The FinalBuilder Server 7 beta will be ready in a day or two. It's currently being used to build FB7 (FB7 is built using FB7 and FB Server 7).&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color: #993300; font-size: medium;"&gt;What now&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;FinalBuilder 7 is feature complete for the 7.0  release, there are still many more features we would like to implement  in updates. Right now we are in Test/Bug fix mode, that is all the team  are working on. So now it's time for some feedback.. let us know what you think, and more importantly, if you find something that isn't working right then let us know. Please keep all beta bug reports and feeback to the FinalBuilder 7 Beta Forum. If you don't see the Beta forum and you are a customer please contact support at finalbuilder dot com and we'll grant you access.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>FinalBuilder Roadmap for 2010</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/409/FinalBuilder-Roadmap-for-2010.aspx</link><category>FinalBuilder</category><pubDate>Mon, 14 Dec 2009 14:00:00 GMT</pubDate><description>&lt;p&gt;We don't usually have a published roadmap. I generally don't like to talk too much about the next version until I have something to show (ie when we are close to beta), however it's been a while since we release FB6 and some customers have asked what our plans are. &lt;br /&gt;
&lt;br /&gt;
I will say that FinalBuilder and FinalBuilder Server are being actively worked on.  Below is just a general outline of what we are up to :&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;FinalBuilder 7.0: &lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
1) Full Unicode support. This is something that we have been working on for the last year. It meant finding replacements for many libraries and components we use, the biggest of which was the Active Scripting support. We ended up having to write our own active scripting library as the old one was impossible to move forward with (the vendor has long since disappeared). This work is mostly completed. &lt;br /&gt;
&lt;br /&gt;
2) A new IDE - with the ability to open multiple projects, and hopefully be able to step into included projects. This required some major re-architecting of the core and the IDE and that is something we are still working on. &lt;/p&gt;
&lt;p&gt;3)&amp;nbsp;General enhancements to existing actions and some new actions. As usual, we have a long todo list to keep us busy. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FinalBuilder Server 7.0&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;FinalBuilder Server 7.0 will be a revision of the FBServer 6.0 code base. (Note that this has changed from my forum post in Nov. due to resourcing issues).&lt;/p&gt;
&lt;p&gt;1)&amp;nbsp;Support for more version control triggers. MKS, Clearcase and possibly Git have been identified as popular targets. &lt;/p&gt;
&lt;p&gt;2)&amp;nbsp;Enhancements to the user interface.. cleaning up html, more use of client side script to reduce postbacks.&lt;/p&gt;
&lt;p&gt;3)&amp;nbsp;Performance enhancements where possible. &lt;/p&gt;
&lt;p&gt;We will also be looking at feature requests to see what else we can implement, but many will be implemented in a future product (see below). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FinalBuilder Server vNext + 1 &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Along side the developement of FinalBuilder, we have had another project running over the last year that was intended to be FinalBuilder Server 7. Due to a lack of resources (or more to the point, a lack of success in recruiting) we had to rethink our plans for this product. It's a large project, and it became clear over the last few weeks that it was not going to be ready to release alongside FinalBuilder 7. This project was born out of the feature requests and feedback from users, and an in depth look at what people were really asking for and why, as well as our own future needs (we are our own best customer!). It was clear quite early on that the architecture of FinalBuilder Server was not capable of supporting some of the features, and neither was ASP.NET. &lt;/p&gt;
&lt;p&gt;So we started fresh. FB Server vNext (actual product name yet to be decided) was designed from outset to support work flow, build agents (possibly also on other platforms), tight integration with bug tracking systems and version control. We are also focusing more on the release management side of things.. management of build artifacts, release notes, tracking which issues are related to which builds, which checkins are related to which builds etc. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When???&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now what you are probably wanting to hear is when will the next versions be released. I'm not going to make any promises here, but we are aiming for FinalBuilder 7 and FBServer 7 at the end of Q1 next year. FinalBuilder Server vNext will come later in the year.&lt;br /&gt;
&lt;br /&gt;
The biggest blocking issue for us at the moment is a lack of manpower (or woman power!). We are finding it hard to recruit suitable people. Canberra is a difficult place to run a software business, we have to compete with the many (both federal and ACT)&amp;nbsp;government departments for people... and despite the election promises the government has only gotten larger over the last 2 years. We will continue our recruitment drive in the new year (but feel free to submit your resume - if you have the right to work and live in Australia).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Team Foundation Build and FinalBuilder</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/684/Team-Foundation-Build-and-FinalBuilder.aspx</link><category>FinalBuilder,TFS</category><pubDate>Tue, 02 Dec 2008 14:00:00 GMT</pubDate><description>&lt;p&gt;&lt;span class="nodeText editable"&gt;The &lt;a href="http://blog.accentient.com"&gt;Accentient Blog&lt;/a&gt; provided an interesting post recently comparing &lt;a href="http://blog.accentient.com/TeamFoundationBuildAndFinalBuilder.aspx"&gt;Team Foundation Build and FinalBuilder&lt;/a&gt;.&lt;/span&gt; It was great to see them offer an unbiased insight in to the distinctive advantages of each of these tools and it's worth a read if you're using or planning to use one or both.&lt;/p&gt;
&lt;p&gt;&lt;span class="nodeText editable"&gt;We've had plenty to say over the years about the relationship between FinalBuilder and TFS/MSBuild&lt;/span&gt;&lt;span class="nodeText editable"&gt;/Team Foundation Build&lt;/span&gt;&lt;span class="nodeText editable"&gt;. Naturally, we have a slight bias toward one of the tools, but if you're interested in learning more about combining the two, check out:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;how to integrate &lt;a href="http://www.finalbuilder.com/Resources/Articles/ID/29/articles.aspx"&gt;FinalBuilder with TFS&lt;/a&gt;;&lt;/li&gt;
    &lt;li&gt;why you would use &lt;a href="http://www.finalbuilder.com/Resources/Blogs/tabid/77/EntryId/245/-I-have-Microsoft-Team-System-why-do-I-need-FinalBuilder.aspx"&gt;FinalBuilder when you already have Team System&lt;/a&gt;;&lt;/li&gt;
    &lt;li&gt;&lt;span class="nodeText editable"&gt;why &lt;a href="http://www.finalbuilder.com/Resources/Blogs/tabid/77/EntryId/252/Team-Foundation-Build-and-FinalBuilder-6-a-match-made-in-heaven.aspx"&gt;FinalBuilder and Team Foundation Build are a match made in heaven&lt;/a&gt;&lt;/span&gt;;&lt;/li&gt;
    &lt;li&gt;a comparison between the &lt;a href="http://www.finalbuilder.com/Resources/Blogs/tabid/77/EntryId/246/MSBuild-Wish-List-vs-FinalBuilder-Feature-Set.aspx"&gt;MSBuild community's wish list and the feature set of FinalBuilder&lt;/a&gt;; and&lt;/li&gt;
    &lt;li&gt;the benefits of using both &lt;a href="http://www.finalbuilder.com/team-foundation-server.aspx"&gt;FinalBuilder and TFS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, I must disagree with just one of Accentient's statments. The final line read:&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;quote&gt;As Team Foundation Build matures, it will likely provide a feature parity competitor to FinalBuilder, but it has some catching up to do.&lt;/quote&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;As Team Foundation Build matures, it may begin to provide feature parity with FinalBuilder 5 or even 6. However, by then we'll be on to FB 7 or FB 8 and we have every intention of making sure these future versions will offer unique and useful features. Team Foundation Build will always have some catching up to do with FinalBuilder. &lt;img alt="" src="/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/images/smiley/msn/regular_smile.gif" /&gt;&lt;/p&gt;</description></item><item><title>Using Python in FinalBuilder</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/677/Using-Python-in-FinalBuilder.aspx</link><category>FinalBuilder</category><pubDate>Wed, 04 Jun 2008 14:00:00 GMT</pubDate><description>&lt;p&gt;Today &lt;a target="_blank" href="http://www.finalbuilder.com/forums.aspx?forumid=1&amp;amp;postid=7229&amp;amp;view=topic"&gt;FB 6.1 was released as a beta version&lt;/a&gt;. One of the major new features in this version is Python language support. We're leveraging Microsoft's &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; project for this, and because version 2 of IronPython is built on the Dynamic Language Runtime, we're expecting that as other DLR languages become available, we'll be able to support them in FinalBuilder as well.&lt;/p&gt;
&lt;p&gt;The Python language is pretty neat, and the fact that IronPython interacts seamlessly with the .NET Framework makes it pretty powerful by itself. It shares this feature with PowerShell.&lt;/p&gt;
&lt;p&gt;However, &lt;a target="_blank" href="http://xkcd.com/353/"&gt;what really makes Python awesome&lt;/a&gt; is the amount of extra library functionality that comes with the standard language distribution.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;This is a totally arbitrary example. Say your build process needs to calculate a SHA1 hash. FinalBuilder only supports MD5 at the moment. Can Python save the day?&lt;/p&gt;
&lt;h2&gt;Step One: Install Python Libraries&lt;/h2&gt;
&lt;p&gt;You need to install the Python standard libraries in order to get access to their many functions. You get this as part of the standard Windows Python distribution. Grab the "Windows Binary installer" from &lt;a target="_blank" href="http://python.org/download/"&gt;http://python.org/download/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Step Two: Tell FinalBuilder&lt;/h2&gt;
&lt;p&gt;You need to tell FinalBuilder where the Python library is installed. If you launch FinalBuilder and go to Tools -&amp;gt; Options -&amp;gt; FinalBuilder -&amp;gt; Script Options, as shown, you will see this options page:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Script Options Frame" src="/blogimages/Python/Options.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Enter the path to the Python library directory, as shown here. The options page says you need to restart, but you actually only need to do this if you've run a Python script since you started FinalBuilder.&lt;/p&gt;
&lt;h2&gt;Step Three: Run Script Action&lt;/h2&gt;
&lt;p&gt;I use the Action filter to search for the all-purpose Run Script action, which I can then add to my project:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Actions Tab" src="/blogimages/Python/ActionFilter.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Step Four: Type in Script&lt;/h2&gt;
&lt;p&gt;Here's my SHA1 script code. I entered this in the OnExecute event, under the Script Editor tab at the bottom of the main FinalBuilder IDE. Make sure you set the script language to "Python", as shown:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Script Editor view" src="/blogimages/Python/ScriptEditor.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Note that the FBVariables object behaves just like a normal Python dictionary.&lt;/p&gt;
&lt;p&gt;&lt;a href="/blogimages/Python/Python SHA1 Example.zip"&gt;Click here to download a sample project file&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Step Five: Run it!&lt;/h2&gt;
&lt;p&gt;Here's the log output from the SHA1 Run Script:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Log Output" src="/blogimages/Python/LogOutput.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Where do I go from here?&lt;/h2&gt;
&lt;p&gt;This was a pretty basic example, but the Python library provides you with literally hundreds of similar pieces of functionality. Take a look at the &lt;a target="_blank" href="http://docs.python.org/lib/"&gt;Python Library Reference&lt;/a&gt; for a complete list.&lt;/p&gt;
&lt;h2&gt;Can't I just use the .NET Framework?&lt;/h2&gt;
&lt;p&gt;Yes! The .NET Framework also provides you with a wealth of built-in functionality. Using it from IronPython is pretty simple, too. Here's Python code that performs the same functionality, written to use the .NET Framework instead of the Python library:&lt;/p&gt;
&lt;p&gt;&lt;img alt=".NET Framework version" src="/blogimages/Python/DotNetVersion.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;(It's a bit more complicated, mostly because I couldn't find a neat .NET-based way to convert a byte array to a hexadecimal string. Note that this approach does not require the Python libraries, it will work out of the box with FinalBuilder.)&lt;/p&gt;
&lt;p&gt;Both sample scripts are included in the &lt;a href="/blogimages/Python/Python SHA1 Example.zip"&gt;downloadable example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It would also be possible to rewrite the .NET version to use PowerShell, instead. I'll leave that as an exercise.&lt;/p&gt;</description></item><item><title>Hate Team Foundation Server?</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/676/Hate-Team-Foundation-Server.aspx</link><category>FinalBuilder,TFS</category><pubDate>Thu, 15 May 2008 14:00:00 GMT</pubDate><description>&lt;p&gt;According to Google Analytics statistics for the past month, a number of people found the FinalBuilder web site in Google search results for the query &lt;a href="http://www.google.com/search?q=hate+%22team+foundation+server%22" target="_blank"&gt;&lt;strong&gt;&lt;em&gt;hate "Team Foundation Server"&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I didn't know so many people felt that way!&lt;/p&gt;
&lt;p&gt;(For the record, we think that &lt;a href="/team-foundation-server.aspx"&gt;FinalBuilder complements Team Foundation Build&lt;/a&gt; in very productive ways.)&lt;/p&gt;</description></item><item><title>FinalBuilder/Automise Keyboard Shortcuts</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/674/FinalBuilderAutomise-Keyboard-Shortcuts.aspx</link><category>Automise,FinalBuilder</category><pubDate>Tue, 15 Apr 2008 14:00:00 GMT</pubDate><description>&lt;p&gt;Brent was watching me fly through some FinalBuilder operations the other day and he suggested I write a blog post about the best keyboard shortcuts to use.&lt;/p&gt;
&lt;p&gt;Even as a power user/developer, you can sometimes use a tool every day and not know the best keyboard shortcuts for it. I only learned many of the keyboard shortcuts for Visual Studio after I attended a special session at TechEd last year.&lt;/p&gt;
&lt;p&gt;I don't want to drown you in information here, so I'm going to list four shortcuts that are essential to know,&lt;strong&gt; &lt;/strong&gt;and another four that are very useful.&lt;/p&gt;
&lt;h2&gt;Essential&lt;/h2&gt;
&lt;p&gt;If you own a keyboard and use FinalBuilder or Automise, the following keyboard shortcuts are essential. They will improve your productivity ten-fold!&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;table width="767" height="173" cellspacing="1" cellpadding="1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Key&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;Ctrl-&lt;/span&gt;&lt;span style="font-family: 'courier new';"&gt;I&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Main IDE Window&lt;/td&gt;
            &lt;td&gt;
            &lt;p&gt;Focus the Actions filter field to search for a new action.&lt;br /&gt;
            If the filter field is already focused, this keystroke hides the Actions sidebar instead.&lt;sup&gt;*&lt;/sup&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;Ctrl-Right&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Selected action(s)&lt;/td&gt;
            &lt;td&gt;Indent the selected action(s) as new children of the action above them.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;Ctrl-Left&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Selected action(s)&lt;/td&gt;
            &lt;td&gt;Outdent the select action(s) relative to their parent action&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;Ctrl-Up/Down&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Selected action(s)&lt;/td&gt;
            &lt;td&gt;Move selected action(s) up and down&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In my opinion, using the Ctrl-Arrow keys to rearrange actions is essential (drag and drop is just too fiddly!)&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;sup&gt;*&lt;/sup&gt; The "hide sidebar if currently focused" feature is new in FB 6.&lt;/p&gt;
&lt;h2&gt;Very Useful&lt;/h2&gt;
&lt;p&gt;The following key combinations are very useful when you are typing in a text field while editing an action:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;table width="767" cellspacing="1" cellpadding="1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Key&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;F3&lt;br /&gt;
            &lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Define a new variable on-the-fly.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;F2&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Pop up an advanced edit dialog with lists of variables, PropertySets, etc.&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;F12&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Pop up a list of &lt;a href="http://www.finalbuilder.com/blogs.aspx?EntryID=251"&gt;suggested variable replacements&lt;/a&gt;.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;span style="font-family: 'courier new';"&gt;Ctrl-Space&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
            &lt;td&gt;Automatic completion for variable and PropertySet names.&amp;nbsp;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For FB 6, we also did a lot of work on the Tabbing behaviour in the IDE. You should be able to use Tab to navigate the main IDE elements very easily.&lt;/p&gt;</description></item><item><title>Log output formatting in FinalBuilder 6</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/408/Log-output-formatting-in-FinalBuilder-6.aspx</link><category>FinalBuilder</category><pubDate>Thu, 03 Apr 2008 14:00:00 GMT</pubDate><description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In FinalBuilder 6, we have done a lot of work to improve the log output formatting. In particular, we wanted to make it easier to find errors, warnings in compiler output.&lt;/p&gt;
&lt;h2&gt;Output Grouping&lt;/h2&gt;
&lt;p&gt;Most compilers are quite verbose in their output, for example the Visual Studio action outputs reams text when using msbuild (the default for VS2005 and later). In the FinalBuilder 6 logging architecture, we add the ability to create Output groups. This allows us to structure the output in a manner that makes it much more readable, and they (as the name implies) allow us to group different parts of the action output. In the Visual Studio and MSBuild actions for example, we group the output but Project and Target :&lt;/p&gt;
&lt;p&gt;&lt;img width="856" height="318" alt="Visual Studio Action output" src="/Portals/0/ArticleImages/VSOutput.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Output Status Color Tagging&lt;/h2&gt;
&lt;p&gt;The output of most (if not all) actions in FinalBuilder 6 had been enhanced to use the new color tagging feature. When Error messages are generated, they are sent to the log with an error status, and the log displays the message in red. The screenshot below shows the message types and colors.&lt;/p&gt;
&lt;p&gt;&lt;img width="616" height="151" alt="Output color tagging" src="/Portals/0/ArticleImages/OuputColorTags.png" /&gt;&lt;/p&gt;
&lt;p&gt;You can also use this tagging when using action script events and in custom actions. This is how it's done from a script event (in JavaScript) :&lt;/p&gt;
&lt;p&gt;Action.SendLogMessage("This is Information message (the default).",stInformation)&lt;br /&gt;
Action.SendLogMessage("This is Success message.",stSuccess)&lt;br /&gt;
Action.SendLogMessage("This is a Warning message.",stWarning)&lt;br /&gt;
Action.SendLogMessage("This is an Error message.",stError)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>FinalBuilder 6 - Output Monitors</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/673/FinalBuilder-6-Output-Monitors.aspx</link><category>FinalBuilder</category><pubDate>Thu, 03 Apr 2008 14:00:00 GMT</pubDate><description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;Output Monitors give you a quick way to watch action output and change the behaviour of the action depending on what you see. This lets you extend built-in actions in powerful ways.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Sample Project&lt;/h2&gt;
&lt;p&gt;Unlike my normal "pie in the sky" examples, this one is based on a real problem. This morning we had a customer in our chatroom who had a problem deploying to QA:&lt;/p&gt;
&lt;blockquote&gt;when a user's connection to the database breaks, or if a user is accessing some of the files in QA and connected to a different database (different to the one we are checking against) the FinalBuilder project will try and deploy the files and get a sharing violation which causes the build to fail&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;: the customer needed a way to tell if one or more files were open on a remote machine.&lt;/p&gt;
&lt;h2&gt;SysInternals Tools Are Awesome&lt;/h2&gt;
&lt;p&gt;SysInternals make PsTools and a raft of other excellent Windows "power administrator tools". If you haven't checked them out, &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals"&gt;you should&lt;/a&gt;. It's no wonder that Microsoft bought the company.&lt;/p&gt;
&lt;p&gt;For my solution to the above problem, I made use of two great SysInternals tools:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx"&gt;PsExec&lt;/a&gt; (part of PsTools) can deploy and run an executable on a remote machine. There's a PsExec action built into FinalBuilder, although you still need to download and install PsTools.&lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx"&gt;Handle&lt;/a&gt; is a great little command line tool that dumps (among other things) all of the open files on a system. An excellent debugging aid.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;The Plan&lt;/h2&gt;
&lt;p&gt;Use PsExec to deploy and execute handle.exe on the remote computer, and use FinalBuilder to scan the output for the file(s) we need to check for.&lt;/p&gt;
&lt;h2&gt;The Project&lt;/h2&gt;
&lt;p&gt;Here's the complete project, including my verbose comments. Because of the powerful Output Monitor (and the awesome Sysinternals tools), almost everything happens inside the PsExec action:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Check Remote Open File project" src="/blogimages/OutputMonitors4.png" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Output Monitor&lt;/h2&gt;
&lt;p&gt;To check for our file(s), we need to configure an Output Monitor on the PsExec action. We have two variables:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;fileName - The filespec or filename that we want to check for. This variable is set by the user.&lt;/li&gt;
    &lt;li&gt;fileInUse - The details of the file that's in use, if there is one. This variable is set when the PsExec action runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every action in FinalBuilder 6 has an option on the Runtime tab called "Monitor Action Output":&lt;/p&gt;
&lt;p&gt;&lt;img alt="Runtime Property Tab" align="middle" src="/blogimages/OutputMonitors1.png" style="vertical-align: middle;" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Click the button to edit the Output Monitors for that action:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Output Monitors Dialog with one monitor" src="/blogimages/OutputMonitors2.png" /&gt;&lt;/p&gt;
&lt;p&gt;For our monitor (shown above), we're checking for any content which contains %fileName% and saving the first match to the variable fileInUse.&lt;/p&gt;
&lt;p&gt;There are lots of other options for output monitor behaviour. Click on the dropdown for a full list:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Full list of behaviours" src="/blogimages/OutputMonitors3.png" /&gt;&lt;/p&gt;
&lt;p&gt;... For example, if we wanted a list of all matching lines, we could use the "Save All Matches to Variable" behaviour.&lt;/p&gt;
&lt;p&gt;As configured, the output monitor supports wildcard matching with * and ?. If we wanted it to be really powerful, we could change it to use a regular expression - grep-in-a-box!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Project File&lt;/h2&gt;
&lt;p&gt;You can download the FinalBuilder 6 project file &lt;a href="/blogimages/CheckRemoteOpenFile.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Alternatives&lt;/h2&gt;
&lt;p&gt;Sometimes you need more powerful output processing, and Output Monitors are not up to the task. You can always use the OnStatusMessage script event to run some script every time the action outputs data. I actually did a &lt;a href="/blogs.aspx?EntryID=254"&gt;blog post about this&lt;/a&gt; a couple of weeks ago.&lt;/p&gt;</description></item><item><title>FinalBuilder 6 : PowerShell (Part Three, Custom Actions)</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/672/FinalBuilder-6-PowerShell-Part-Three-Custom-Acti.aspx</link><category>FinalBuilder</category><pubDate>Wed, 02 Apr 2008 14:00:00 GMT</pubDate><description>&lt;p&gt;This is the last in a series of blog posts about PowerShell support in FinalBuilder 6.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.finalbuilder.com/blogs.aspx?EntryID=253"&gt;Part One&lt;/a&gt; showed how to use one-liners to create powerful PowerShell execute conditions.&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.finalbuilder.com/blogs.aspx?EntryID=254"&gt;Part Two&lt;/a&gt; showed how to use PowerShell script events to parse output and change the behaviour of an action.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For this last post, I'm going to walk through creating a custom action which scans the Event Log and reports the frequency of messages from different sources.&lt;/p&gt;
&lt;h2&gt;The Script&lt;/h2&gt;
&lt;p&gt;Here are the parts of the PowerShell script that I'm going to use to implement the new action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) A custom function&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WMI uses dmtf date formatting. This is a PowerShell function to create a dmtf datetime string representing (Now - $x hours) ago.&lt;/p&gt;
&lt;blockquote&gt; function dmtfWithin([int] $hours)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;[System.Management.ManagementDateTimeconverter]::ToDmtfDateTime `&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;([DateTime]::Now.AddHours(- $hours))&lt;br /&gt;
}&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Read Action Properties&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Action properties are loaded using the same syntax as other custom actions. If you've used ActionStudio before then this will look familiar. Coming in-the-pipeline are some CmdLets to make this look more like PowerShell and less like .NET.&lt;/p&gt;
&lt;blockquote&gt; # Set up parameters&lt;br /&gt;
$computerName = $Context.ExpandExpression($Context.Properties.PropertyAsString("ComputerName"), $True)&lt;br /&gt;
$hours = $Context.Properties.PropertyAsString("Hours")&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Process Event Log&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is where the dirty work happens - build a WQL filter string, get the WMI objects for the event log entries, and build a hashtable mapping event source names to their frequencies. The particularly neat line is the last one with the % sign - that's shorthand for "for each".&lt;/p&gt;
&lt;blockquote&gt; # Read results&lt;br /&gt;
$filter = "TimeWritten &amp;gt; '" + (dmtfWithin($hours)) + "'"&lt;br /&gt;
$results = Get-WmiObject -computer $computerName -class Win32_NTLogEvent -filter $filter&lt;br /&gt;
$freqTable = @{}&lt;br /&gt;
$results | % { $freqTable[$_.SourceName] += 1 }&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Log the Results&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Log the contents of our hash table, sorted and formatted into a table:&lt;/p&gt;
&lt;blockquote&gt;# Log Results&lt;br /&gt;
$freqTable.GetEnumerator() | sort -descending Value | ft Value, Name -autosize -wrap&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5) Set Result to True&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
The Result parameter determines whether or not to fail the action.&lt;/p&gt;
&lt;blockquote&gt;$Result = $True &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Creating the custom action&lt;/h2&gt;
&lt;p&gt;I recorded a screencast showing how to create the custom action in ActionStudio. &lt;a target="_blank" href="/blogimages/PowerShell/Writing.html"&gt;Click here&lt;/a&gt; to view in a new window.&lt;/p&gt;
&lt;p&gt;&lt;object width="911" height="649" codebase="http://active.macromedia.com/flash5/cabs/swflash.cab#version=7,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;
&lt;param value="/blogimages/PowerShell/Writing.swf" name="movie"&gt;
&lt;param value="true" name="play"&gt;
&lt;param value="false" name="loop"&gt;
&lt;param value="transparent" name="wmode"&gt;
&lt;param value="low" name="quality"&gt; &lt;embed width="911" height="649" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="transparent" loop="false" quality="low" src="/blogimages/PowerShell/Writing.swf"&gt;  &lt;/object&gt; &lt;/p&gt;
&lt;h2&gt;Running the custom action&lt;/h2&gt;
&lt;p&gt;&lt;a target="_blank" href="/blogimages/PowerShell/Running.html"&gt;Click here&lt;/a&gt; to view this screencast in a new window.&lt;/p&gt;
&lt;p&gt;&lt;object width="834" height="628" codebase="http://active.macromedia.com/flash5/cabs/swflash.cab#version=7,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;
&lt;param value="/blogimages/PowerShell/Running.swf" name="movie"&gt;
&lt;param value="true" name="play"&gt;
&lt;param value="false" name="loop"&gt;
&lt;param value="transparent" name="wmode"&gt;
&lt;param value="low" name="quality"&gt; &lt;embed width="834" height="628" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="transparent" loop="false" quality="low" src="/blogimages/PowerShell/Running.swf"&gt;  &lt;/object&gt;&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;&lt;a href="/blogimages/PowerShell/PowerShellCustomAction.zip"&gt;Click here to download&lt;/a&gt; a zip file with the custom action package. The unzipped .fbap file needs to be saved in the ActionDefs directory inside the FinalBuilder 6 program directory.&lt;/p&gt;
&lt;h2&gt;More Resources&lt;/h2&gt;
&lt;p&gt;The example action package "FBScriptExamples.fbap" comes with FinalBuilder, and contains some more sample PowerShell actions which can be loaded in ActionStudio.&lt;/p&gt;
&lt;p&gt;The ActionStudioManual.pdf file (located in the FinalBuilder Program directory) contains a reference section with built-in custom action types and methods, and also some more information on creating PowerShell actions.&lt;/p&gt;
&lt;h2&gt;Some Notes&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;This is a pretty simple example, but (like the others) it is fairly simple to extend it to cover lots of other Windows-related tasks.&lt;/li&gt;
    &lt;li&gt;FYI, there is a dedicated Get-EventLog command in PowerShell. In this instance, I chose to use WMI instead because WMI can read from remote machines, and can read across all event logs. If you use the dedicated command, you need to choose a single event log to read from.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>FinalBuilder 6 : PowerShell (Part Two, Script Events)</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/671/FinalBuilder-6-PowerShell-Part-Two-Script-Events.aspx</link><category>FinalBuilder</category><pubDate>Wed, 26 Mar 2008 05:00:00 GMT</pubDate><description>&lt;h2&gt;&amp;nbsp;PowerShell Script Events&lt;/h2&gt;
&lt;p&gt;This is Part Two in a series about the new PowerShell support in FinalBuilder 6. In &lt;a href="http://www.finalbuilder.com/blogs.aspx?EntryID=253&amp;amp;language=en-US"&gt;Part One&lt;/a&gt;, we learned how to create an action Execute Condition using PowerShell.&lt;/p&gt;
&lt;p&gt;In this article we will show how to use PowerShell as a scripting language in the FinalBuilder IDE, in order to customize the behaviour of a built-in FinalBuilder action. We'll also showcase some of the powerful string processing features in PowerShell.&lt;/p&gt;
&lt;h2&gt;Script Events&lt;/h2&gt;
&lt;p&gt;When you add an action to a FinalBuilder project, you also add at least three script events:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;BeforeAction - This script event is called before the action runs.&lt;/li&gt;
    &lt;li&gt;OnStatusMessage - This script event is called each time the action outputs something to the log.&lt;/li&gt;
    &lt;li&gt;AfterAction - This script event is called after the action has finished running.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can access the script events by clicking on the "Script Editor" tab in FinalBuilder. For this blog post, we're going to use PowerShell to create an implementation for each of these script events.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;PsLogList&lt;/h2&gt;
&lt;p&gt;I'm going use scripting to extend the built-in FinalBuilder action for the PsLogList tool. PsLogList is part of the &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx"&gt;PsTools suite from SysInternals/Microsoft&lt;/a&gt;. It dumps the contents of the event log on a local or remote machine.&lt;/p&gt;
&lt;p&gt;We're going to customize the action so it parses the list of log entries to automatically extract data about the frequency of events from different sources.&lt;/p&gt;
&lt;h2&gt;Output format&lt;/h2&gt;
&lt;p&gt;Here's an example log entry, as output from PsLogList:&lt;/p&gt;
&lt;blockquote&gt; [16664] Service Control Manager&lt;br /&gt;
Type:     INFORMATION&lt;br /&gt;
Computer: DYNAMO&lt;br /&gt;
Time:     3/03/2008 3:09:18 PM   ID:       7035 &lt;br /&gt;
User:     NT AUTHORITY\SYSTEM&lt;br /&gt;
The IMAPI CD-Burning COM Service service was successfully sent a start control.&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For our example, the piece of data want to extract would be "Service Control Manager" in the expression above. To extract this, we can use the following Regular Expression:&lt;/p&gt;
&lt;blockquote&gt;^\[\d+\] (.+)$&lt;/blockquote&gt;
&lt;p&gt;Regular expressions are supported directly in PowerShell. You can create a regular expression using a code snippet like this:&lt;/p&gt;
&lt;blockquote&gt;$headerExpr = [regex] "\[\d+\] (.+)"&lt;/blockquote&gt;
&lt;p&gt;(If you ever need help remembering Regular Expression syntax, I recommend &lt;a target="_blank" href="http://www.regular-expressions.info/reference.html"&gt;www.regular-expressions.info&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Hash tables&lt;/h2&gt;
&lt;p&gt;The other piece of PowerShell functionality that we're going to make use of is the hash table. We're going to create an empty PowerShell hash table, and then use it as a dictionary to store event source names along with the frequency that each source appears.&lt;/p&gt;
&lt;p&gt;Here's the script used to create a new empty hashtable:&lt;/p&gt;
&lt;blockquote&gt;$hashTable = ${}&lt;/blockquote&gt;
&lt;p&gt;To increment the frequency of an item in the table, we can use the increment operation += on the hashtable entry. If there is no entry, PowerShell returns $null, but ($null + 1) == 1 so it will work properly.&lt;/p&gt;
&lt;blockquote&gt;$hashTable[$name] += 1&lt;br /&gt;
&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Scripting it up&lt;/h2&gt;
&lt;p&gt;Here are the complete script events: (&lt;a href="http://www.finalbuilder.com/blogimages/PowerShell Script Event Example.zip"&gt;download as project&lt;/a&gt;.)&lt;/p&gt;
&lt;h3&gt;BeforeAction Script Event&lt;/h3&gt;
&lt;blockquote&gt; # Create empty hash table for use in action (we need to store it in a Project Variable)&lt;br /&gt;
$FBVariables["FrequencyTable"] = @{ }&amp;nbsp;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;h3&gt;OnStatusMessage Script Event&lt;/h3&gt;
&lt;blockquote&gt;  # When output comes from the action, check if it is an Event header line&lt;br /&gt;
&lt;br /&gt;
$headerPattern = "^\[\d+\] (.+)$"&lt;br /&gt;
$RegexOptions = [System.Text.RegularExpressions.RegexOptions]&lt;br /&gt;
&lt;br /&gt;
foreach ( $match in [regex]::Matches( $StatusMessage.MessageText, $headerPattern, $RegexOptions::MultiLine ) )&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$appName = $match.Groups[1].Value.Trim()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;$freqTable = $FBVariables["FrequencyTable"]&lt;br /&gt;
&amp;nbsp; $freqTable[$appName] += 1&lt;br /&gt;
}  &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;AfterAction Script Event&lt;/h3&gt;
&lt;blockquote&gt; # Log the frequencies, sorted by value&lt;br /&gt;
"Frequencies for different sources"&lt;br /&gt;
$FBVariables["FrequencyTable"].GetEnumerator() | sort -descending Value | ft Value, Name -autosize -wrap&lt;br /&gt;
#&lt;br /&gt;
# (the .GetEnumerator() call in the expression above is a trick which allows us to sort the contents of the hashtable.)&lt;br /&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Download the Project&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.finalbuilder.com/blogimages/PowerShell Script Event Example.zip"&gt;Click here to download a sample project with this action&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The downloaded project has one more feature: it suppresses the normal output from PsLogList. Only our custom information is shown in the log.&lt;/p&gt;
&lt;h2&gt;Action output&lt;/h2&gt;
&lt;p&gt;Here's the log output from when the action is run normally:&lt;/p&gt;
&lt;blockquote&gt;Frequencies for different sources&lt;br /&gt;
Value Name&lt;br /&gt;
----- ----&lt;br /&gt;
29 Service Control Manager&lt;br /&gt;
3 Application Popup&lt;br /&gt;
2 W32Time&lt;br /&gt;
2 IPSec&lt;br /&gt;
2 EventLog&lt;br /&gt;
2 WinHttpAutoProxySvc&lt;br /&gt;
1 DCOM&lt;br /&gt;
1 AeLookupSvc&lt;br /&gt;
1 Tcpip6&lt;br /&gt;
1 Tcpip&lt;br /&gt;
1 redbook&lt;br /&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Why this is Useful&lt;/h2&gt;
&lt;p&gt;OK, so this example isn't particularly relevant for automated builds. However, this technique (or one like it) can be used to parse information from any tool which is run by FinalBuilder.&lt;/p&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Having a script event run every time data is logged decreases the performance of the action. For actions which log very large amounts of data, it's better to use Log To Variable and then process the output all-at-once in a separate action.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
    &lt;li&gt;You'll note that the actual regular expression call used in the script event is different to the example&amp;nbsp; expression showed at the beginning. We have to call the .NET RegularExpression class directly in order to use MultiLine mode. (If anyone from the PowerShell Team is reading this, please try and find a way to set the expression mode with simpler syntax!)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
    &lt;li&gt;You can actually do everything shown in the example with JavaScript instead of PowerShell, using a Regexp object and an associative array. However, some steps (like automatically printing the results) are much more complex to do with JavaScript.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
    &lt;li&gt;You could also get the same results from a PowerShell action by using get-wmi and the Win32_NTLogEvent class. That will be the subject of upcoming blog post Part Three: Custom actions.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>FinalBuilder 6 : PowerShell (Part One, Execute Conditions)</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/670/FinalBuilder-6-PowerShell-Part-One-Execute-Condi.aspx</link><category>FinalBuilder</category><pubDate>Tue, 18 Mar 2008 05:00:00 GMT</pubDate><description>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;PowerShell support in FinalBuilder 5.5 was limited to the Execute PowerShell Action. For FinalBuilder 6, we've made PowerShell a "first class" scripting language, alongside JavaScript and VBScript.&lt;/p&gt;
&lt;p&gt;This is the first in a series of blog posts which show the different ways PowerShell can integrate with FinalBuilder. Today's example is the Execute Condition.&lt;/p&gt;
&lt;h2&gt;Execute Conditions&lt;/h2&gt;
&lt;p&gt;Every action in FinalBuilder has a field called the "Execute Condition", on the Runtime property page.&lt;/p&gt;
&lt;p&gt;This lets you place a single line of script which evaluates as a boolean condition. If the script evaluates "True", the action will execute. If the script evaluates "False", the action will be skipped.&lt;/p&gt;
&lt;h2&gt;PowerShell Execute Conditions&lt;/h2&gt;
&lt;p&gt;Due to it's terse but expressive syntax, PowerShell seems to lend itself to one-line expressions (a quick &lt;a href="http://www.google.com.au/search?q=PowerShell+one-liners" target="_blank"&gt;Google search&lt;/a&gt; will confirm this.) This can be great for execute conditions.&lt;/p&gt;
&lt;h2&gt;Examples&lt;/h2&gt;
&lt;p&gt;If you want an action to only run if Notepad is executing, you can use this one-line expression:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;get-Process | where {$_.name -eq "NotePad"}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="PowerShell Execute Condition" src="/blogimages/PowerShell/PowerShellExecuteCondition.png" /&gt;&lt;/p&gt;
&lt;p&gt;If you want an action to run only if a remote computer is online, you can use this expression:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gwmi Win32_PingStatus -Filter "Address='remotePC'" |where {$_.StatusCode -eq 0}&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PowerShell treats any non-null value as equivalent to $True, so any result will be regarded as True, while no result will be regarded as False.&lt;/p&gt;
&lt;h2&gt;Caveats&lt;/h2&gt;
&lt;p&gt;I think one-liners are neat. It's probably because they remind me of growing up with my Apple //e and &lt;a href="http://en.wikipedia.org/wiki/Nibble_(magazine)" target="_blank"&gt;Nibble magazine's&lt;/a&gt; one-liner competition. However, like anything else, one liners can be abused. They can be the stuff of programming horror stories.&lt;/p&gt;
&lt;p&gt;My suggestions for responsible Execute Condition use:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Put something in the action comment field if the Execute Condition isn't self-documenting.&lt;/li&gt;
    &lt;li&gt;Use a script event if the Execute Condition gets longer than the text field on the Runtime page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Next - &lt;a href="http://www.finalbuilder.com/blogs.aspx?EntryID=254"&gt;Part Two : Script Events&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;( Credits : thanks to beta tester Robert for the Notepad suggestion.)&lt;/p&gt;</description></item><item><title>Team Foundation Build and FinalBuilder 6 (a match made in heaven)</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/669/Team-Foundation-Build-and-FinalBuilder-6-a-match-.aspx</link><category>FinalBuilder,TFS</category><pubDate>Fri, 14 Mar 2008 05:00:00 GMT</pubDate><description>&lt;p&gt;I just posted a new article on &lt;a href="http://www.finalbuilder.com/articles.aspx?mid=370&amp;amp;ctl=ArticleView&amp;amp;articleId=29"&gt;Integrating FinalBuilder with Microsoft Team Foundation Server&lt;/a&gt;. The article deals with the great new Team Build integration in FinalBuilder 6.&lt;/p&gt;
&lt;p&gt;You can now do things with FinalBuilder 6 and Team Build which are impossible to achieve with any other tool combination, and you can do it all without editing any MSBuild files &lt;span style="text-decoration: underline;"&gt;at all&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Need MbUnit test statistics in your Team Build Quality Report? &lt;em&gt;Do it with FinalBuilder.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Need to deploy build results via FTP? &lt;em&gt;Do it with FinalBuilder.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Need to build legacy Visual Studio 2003/Delphi/C++ Builder/VB 6 projects with Team Build, and see compiler metrics in the Team Build Report? &lt;em&gt;Do it with FinalBuilder.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Need smart version information management (including auto-incrementing version numbers across projects) without having to use custom C# code? &lt;em&gt;Do it with FinalBuilder.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Need to do perform any of the thousands of other built-in operations, with full graphical configuration and structured logging output? &lt;em&gt;Do it with FinalBuilder&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you're interested, &lt;a href="http://www.finalbuilder.com/articles.aspx?mid=370&amp;amp;ctl=ArticleView&amp;amp;articleId=29" target="_blank"&gt;check out the new article here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I also wanted to plug a great (FREE) Screencast creator called &lt;a href="http://www.debugmode.com/wink/" target="_blank"&gt;Wink&lt;/a&gt;, by DebugMode Software. Paul put me onto this and I used it to create the Flash videos in the article. We also have a license to an expensive commercial product, but I don't think I'll ever want to use it again now that I've found Wink.&lt;/p&gt;</description></item><item><title>Variable Suggestion in FinalBuilder 6</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/407/Variable-Suggestion-in-FinalBuilder-6.aspx</link><category>FinalBuilder</category><pubDate>Wed, 12 Mar 2008 05:00:00 GMT</pubDate><description>&lt;p&gt;Variables in FinalBuilder make your build process more maintainable, but working out which variables to use where can be difficult, especially when you are trying to retrofit them into an existing project. Variable Suggestion is a new feature in FinalBuilder 6 which aims to ease the use of Variables.&lt;/p&gt;
&lt;p &gt;
&lt;img width="559" height="494" src="/Portals/0/ArticleImages/variablesuggestion.png" alt="Variable Suggestion" /&gt;&lt;/p&gt;
&lt;p&gt;Variable Suggestion is a very simple feature. In any text field, press F12. FinalBuilder will scan the text in the field and determine if there are possible variable replacements that could be made. It does this recursively (not infinately though, we limited the depth to preserve reasonable performance), and will then present the list of possible variable replacement. The order that the suggestions are shown in is based on the total number of characters replaced/saved by using the variables. Not a very scientifc method, but in practice we found that in most cases the top few suggestions are the ones that make sense.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>FinalBuilder 6 Tech Article - .NET custom action API</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/668/FinalBuilder-6-Tech-Article-NET-custom-action-A.aspx</link><category>FinalBuilder</category><pubDate>Tue, 04 Mar 2008 06:00:00 GMT</pubDate><description>&lt;p&gt;I just posted a new tech article about the &lt;a href="http://www.finalbuilder.com/Default.aspx?tabid=70&amp;amp;mid=370&amp;amp;ctl=ArticleView&amp;amp;articleId=28"&gt;FinalBuilder 6 .NET Custom Action API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you've ever done any custom action development with .NET, then I strongly suggest you check this out. It's a really nifty API and it makes designing FB 6 actions incredibly simple.&lt;/p&gt;
&lt;p&gt;In addition, it is still possible to tweak the API slightly to add functionality before FB 6 goes final - so please let us know if there's anything that you'd like to see added.&lt;/p&gt;</description></item><item><title>"The Bus Factor", Software Development practices, and FinalBuilder</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/667/The-Bus-Factor-Software-Development-practices-and.aspx</link><category>FinalBuilder</category><pubDate>Wed, 27 Feb 2008 06:00:00 GMT</pubDate><description>&lt;p&gt;(This blog post is shamelessly &lt;span style="text-decoration: line-through;"&gt;ripped off from&lt;/span&gt; based on &lt;a href="http://weblogs.asp.net/rosherove"&gt;Roy Osherove&lt;/a&gt;'s praise of FinalBuilder(&lt;a href="#footnote1"&gt;*&lt;/a&gt;)&lt;a name="footnote1_top"&gt;&lt;/a&gt; during a session at TechEd Barcelona last year.)&lt;/p&gt;
&lt;p &gt;
&lt;span style="font-size: 18px;"&gt;&lt;em&gt;&lt;em&gt;"&lt;/em&gt;[&lt;em&gt;The Bus Factor]&lt;/em&gt; means if the developer who wrote [the project] is hit by a bus, you're screwed."&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- &lt;a href="http://www.hanselman.com/blog/StrippingOutEmptyXmlElementsInAPerformantWayAndTheBusFactor.aspx"&gt;Scott Hanselman&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It's common to talk about the Bus Factor of a software project or a piece of code. Specifically, the Bus Factor is the number of people on your team who need to be "hit by a bus" (or change jobs, or change projects, or move away, or retire, or get sat on by an elephant) before the project is in trouble. The hallmark of a bad Bus Factor is having specialised, hard to access, knowledge which is only understood by one or two people on your team.&lt;/p&gt;
&lt;p&gt;FinalBuilder encourages a good Bus Factor for builds.&lt;/p&gt;
&lt;p&gt;To help demonstrate this, here's the Nant build process for one of my favourite .NET Open Source tools, &lt;a href="http://www.nunit.org"&gt;NUnit&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;(Start scrolling now...)&lt;/p&gt;
&lt;p&gt;&lt;a href="/blogimages/busfactor/NantBuild_1.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_1.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_2.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_2.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_3.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_3.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_4.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_4.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_5.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_5.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_6.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_6.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_7.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_7.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_8.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_8.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_9.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_9.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_10.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_10.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_11.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_11.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_12.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_12.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_13.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_13.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_14.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_14.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_15.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_15.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_16.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_16.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_17.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_17.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_18.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_18.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_19.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_19.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_20.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_20.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_21.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_21.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_22.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_22.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_23.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_23.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_24.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_24.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_25.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_25.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_26.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_26.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_27.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_27.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_28.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_28.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_29.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_29.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_30.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_30.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_31.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_31.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_32.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_32.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_33.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_33.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_34.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_34.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_35.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_35.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_36.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_36.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_37.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_37.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_38.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_38.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_39.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_39.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_40.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_40.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_41.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_41.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_42.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_42.png" /&gt; &lt;/a&gt; &lt;a href="/blogimages/busfactor/NantBuild_43.png"&gt; &lt;img alt="" src="/blogimages/busfactor/Thumbs/NantBuild_43.png" /&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(&lt;a href="#footnote2"&gt;**&lt;/a&gt;)&lt;a name="footnote2_top"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The build process is 2,688 lines of XML, spread amongst 33 XML files. I combined them all into a PDF to create the images shown above. NUnit uses NAnt, but if you're using MSBuild then your build process will look very similar.&lt;/p&gt;
&lt;p&gt;Comparatively speaking, this a simple build process. The entire NUnit codebase is only around 70 thousand lines of C# code. The build above doesn't do anything particularly complex. Imagine how much worse this gets if either the codebase, or the level of functionality, needs to grow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Would you want to be a new developer in charge of working on that build process?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For comparison sake, I recreated most of the NUnit build functionality in FinalBuilder (this is based on a rolling demo that we used at TechEd Barcelona.)&lt;/p&gt;
&lt;p&gt;&lt;img src="/blogimages/busfactor/FinalBuilder_1.png" alt="Main Action List" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/blogimages/busfactor/FinalBuilder_2.png" alt="PreBuild Action List" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/blogimages/busfactor/FinalBuilder_3.png" alt="Build and Test" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/blogimages/busfactor/FinalBuilder_4.png" alt="PostBuild" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/blogimages/busfactor/FinalBuilder_5.png" alt="Clean" /&gt;&lt;/p&gt;
&lt;p&gt;The FinalBuilder project doesn't do absolutely everything that the NAnt script does, but it could be extended to fill in the gaps without changing the appearance drastically from what you see here. The FinalBuilder project also does do some things that the NAnt project does not do - namely version control integration and FTP deployment.&lt;/p&gt;
&lt;p&gt;Ask yourself: &lt;strong&gt;Which type of build process would I like to see deployed in my organization?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nitpicker's Corner&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This isn't an entirely fair comparison, because lots of the details about &lt;em&gt;how&lt;/em&gt; the FinalBuilder project works are hidden away under the GUI abstraction. That's my the point, though: In FinalBuilder the project details aren't all in your face, but they're easy to find and understand if the person who wrote the build process happens to get hit by a bus.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;Footnotes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name="footnote1"&gt;&lt;/a&gt;(*) For the record, we didn't ask Roy to praise FinalBuilder, and we definitely didn't pay him to do so. He said it all off his own bat. I hope he doesn't mind me quoting him. (&lt;a href="#footnote1_top"&gt;back&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a name="footnote2"&gt;&lt;/a&gt;(**) I don't mean to pick on NUnit here. Naturally, OSS development involves different factors which come into play when choosing tools. That said, we'd be happy to offer the NUnit project a free license (or two) of FinalBuilder for use with internal build and configuration management. (&lt;a href="#footnote2_top"&gt;back&lt;/a&gt;)&lt;/p&gt;</description></item><item><title>Safely Using Relative Paths in Actions</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/666/Safely-Using-Relative-Paths-in-Actions.aspx</link><category>Automise,FinalBuilder</category><pubDate>Tue, 26 Feb 2008 06:00:00 GMT</pubDate><description>&lt;p&gt;Using relative paths in a project is a good idea - they make a project more maintainable, readable and portable.&lt;/p&gt;
&lt;p&gt;However, lately I've seen quite a few sample FinalBuilder projects where people are using this kind of relative path in their actions:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;table width="200" cellspacing="1" cellpadding="1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;MySolutionFile.sln&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;.\MyProject\Installer\Project.iss&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;..\..\MyOtherProject\MyProject.dproj&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The idea is that if the file is located relative to the project file path, the relative path will resolve to the right directory.&lt;/p&gt;
&lt;p&gt;Great idea, right? Unfortunately, no.&lt;/p&gt;
&lt;p&gt;These relative paths rely on the current Windows working directory for the process. Unfortunately, FinalBuilder and Automise only have limited control over this property. Various API calls (made by actions, scripts or the IDE) might change this directory unexpectedly.&lt;/p&gt;
&lt;p&gt;The safe way to use relative paths in a FinalBuilder or Automise project is to use the variable &lt;strong&gt;%FBPROJECTDIR%&lt;/strong&gt; (called &lt;strong&gt;%PROJECTDIR%&lt;/strong&gt; in Automise.) This variable evaluates to the directory which contains the current project file.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;table width="200" cellspacing="1" cellpadding="1" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Unsafe&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;Safe&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;MySolution.sln&lt;/td&gt;
            &lt;td&gt;%FBPROJECTDIR%\MySolution.sln&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;.\MyProject\&lt;/td&gt;
            &lt;td&gt;%FBPROJECTDIR%\MyProject\Installer\Project.iss&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;..\..\MyOtherProject\MyProject.dproj&lt;/td&gt;
            &lt;td&gt;%FBPROJECTDIR%\..\..\MyOtherProject\MyProject.dproj&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;We recommend defining new project variables to prevent these paths from becoming too long and unwieldy, and to make your project easier to read.&lt;/p&gt;
&lt;p&gt;For instance, you could define a project variable called &lt;em&gt;InstallerPath&lt;/em&gt; and set it to &lt;em&gt;%FBPROJECTDIR%\MyProject\Installer&lt;/em&gt;. Turn on the "Macro" option for the &lt;em&gt;InstallerPath&lt;/em&gt; variable to make sure variable references are expanded each time the variable is read.&lt;/p&gt;
&lt;p&gt;&lt;img src="/blogimages/FBPROJECTDIR-AddVariableMacro.png" alt="Add Macro Variable " /&gt;&lt;/p&gt;</description></item><item><title>XML Actions and the "XPath returned no node" error.</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/665/XML-Actions-and-the-XPath-returned-no-node-error.aspx</link><category>Automise,FinalBuilder</category><pubDate>Mon, 25 Feb 2008 06:00:00 GMT</pubDate><description>&lt;p&gt;(It's been a while since I blogged about anything, so I thought I'd write about this while my coffee kicks in on a Monday morning.)&lt;/p&gt;
&lt;p&gt;An issue which comes up quite often is people seeing this error when they try to use XML actions in FinalBuilder or Automise:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;XPath returned no node : /Project/Import&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The reason is because of the way MSXML deals with document namespaces.&amp;nbsp; If your XML file uses XML namespaces (and most do), then you need to tweak the action slightly.&lt;/p&gt;
&lt;p&gt;I'm not going to go into XML Namespaces in detail. There are &lt;a href="http://www.w3schools.com/xml/xml_namespaces.asp"&gt;better places to learn about them&lt;/a&gt;. I'll just show you an example:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Say you have a Visual Studio 2005 .csproj file (which is really just an XML file wearing a funny hat.) You want to iterate over all of the imported project names with an XML Node Iterator action. If you try to use the XPath &lt;em&gt;/Project/Import&lt;/em&gt;, then you'll see the error I showed above.&lt;/p&gt;
&lt;p&gt;Here's the first line of the .csproj file:&lt;/p&gt;
&lt;xmp&gt;&amp;lt;Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&amp;gt;&lt;/xmp&gt;
&lt;p&gt;This means the document has a &lt;strong&gt;default XML Namespace&lt;/strong&gt;, which is "&lt;em&gt;http://schemas.microsoft.com/blahblahblah&lt;/em&gt;". This is why MSXML can't follow the XPath properly.&lt;/p&gt;
&lt;p&gt;To fix this, open the XML action and navigate to the "MSXML Parser" page.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="/blogimages/DefaultXMLNamespace.png" alt="MSXML Parser Dialog" /&gt;&lt;/p&gt;
&lt;p&gt;Turn on the "Automatically use namespace prefixes..." checkbox, and type a letter in the field for the default Namespace. I used "x" in the screenshot shown above.&lt;/p&gt;
&lt;p&gt;Now change your XPath from &lt;em&gt;/Project/Import&lt;/em&gt; to:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/x:Project/x:Import&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It works! Namespace prefix "x" now refers to the default namespace in the document.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pedantic Details&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;There is a way to specify the namespace URI as part of the XPath, without using this prefix feature, but the resulting XPaths are enormous and hard for humans to read.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;If you have namespace prefixes defined as attributes in the document root node, ie &lt;em&gt;s:xmlns="http://www.myfunkyurl.com/namespace"&lt;/em&gt;, then turning on this option will let you use the prefixes in your XPath.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;This is the best solution we've come up with so far. We're planning to revisit this in future and (hopefully) make it all automatic without any manual configuration or custom prefixes.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>MSBuild Wish List vs FinalBuilder Feature Set</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/664/MSBuild-Wish-List-vs-FinalBuilder-Feature-Set.aspx</link><category>FinalBuilder</category><pubDate>Fri, 07 Dec 2007 03:47:46 GMT</pubDate><description>&lt;p&gt;The MSBuild Team recently posted a "&lt;a href="http://blogs.msdn.com/msbuild/archive/2007/11/17/how-would-you-spend-100-on-msbuild.aspx"&gt;wish list&lt;/a&gt;" of potential new MSBuild features, and encouraged people to vote on which ones they would like to see in future versions. &lt;a href="http://blogs.msdn.com/msbuild/archive/2007/11/30/response-to-the-feature-poll.aspx"&gt;The results&lt;/a&gt; came out last week.&lt;/p&gt;
&lt;p&gt;We have a lot of respect for MSBuild here at VSoft Technologies. We're committed to making our own MSBuild support top-notch so you can easily interoperate between FinalBuilder and MSBuild projects. However, I wouldn't recommend MSBuild for end-to-end build automation.&lt;/p&gt;
&lt;p&gt;I couldn't help but compare the top ten most popular MSBuild feature requests with existing FinalBuilder features. &lt;span style="font-family: arial, sans-serif; font-size: 10pt;"&gt;  &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;span style="font-weight: bold;"&gt;1)&amp;nbsp; Debugger&lt;br /&gt;
&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;FinalBuilder gives you a full graphical debugging environment - breakpoints, stepping, watches, pause and resume.&lt;/p&gt;
&lt;p&gt;You also get a structured log which quickly allows you to move between your project's structure and it's output. No need to scan text log files for line numbers and target names.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2)&lt;/strong&gt; and &lt;strong&gt;3)&lt;/strong&gt; These both relate to converting existing non-MSBuild-friendly formats to MSBuild. This problem is more or less bypassed if you use FinalBuilder, because the built-in action types give you "first class" access to building these project types.&lt;/p&gt;
&lt;p &gt;
&lt;strong&gt;4) Visualization&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is another feature that FinalBuilder gives you "out of the box" - FinalBuilder projects are represented as structured trees, and refactoring is often as simple as drag-and-drop.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5) Native Code / VC Support&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FinalBuilder has built-in support for Visual C++, at the same level of integration as other tools.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6) Distributed Builds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FinalBuilder doesn't do this either. Yet.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7) Extensible reuseable inline tasks&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every single action in FinalBuilder has extensibility built in via VBScript, JavaScript, and soon PowerShell. (Ssh! Don't tell anyone I told you!)&amp;nbsp; If that's not enough, with ActionStudio you can whip up a custom action type in minutes, using one of these scripting languages or .NET.&lt;/p&gt;
&lt;p&gt;For further extensibility, resuseable action lists can be easily created and called from different parts of your project.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8) Multiprocessor Peformance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Async Action Groups let you automatically schedule parts of your build to run in parallel with others, allowing you to take advantage of multiprocessor architectures.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9) Extensible Functions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;See No. 7. The inclusion of scripting throughout a FinalBuilder project makes it easy to extend specific fields.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10) (Editing UI)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is FinalBuilder's core feature. The FinalBuilder IDE gives you a clear graphical layout of your build process, and combined with debugging and structured logging you have a quick and easy way to move between project structure and project output.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>"I have Microsoft Team System, why do I need FinalBuilder?"</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/663/I-have-Microsoft-Team-System-why-do-I-need-FinalB.aspx</link><category>FinalBuilder,TFS</category><pubDate>Wed, 07 Nov 2007 14:19:44 GMT</pubDate><description>&lt;p&gt;I'm writing this entry from a delegate work area at TechEd Barcelona. We've been talking to a lot of people over the past two days about FinalBuilder.&lt;/p&gt;
&lt;p&gt;Many people have said "Oh, we have Team System. We already have automated builds." The surprising thing is how many people don't realise what they're missing out on, or that FinalBuilder can integrate directly with Team System.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With Team System you can do this in your build:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Get a fresh copy of your project's source&lt;/li&gt;
    &lt;li&gt;Build one or more Visual Studio 2005 solutions&lt;/li&gt;
    &lt;li&gt;Run Visual Studio tests &amp;amp; Visual Studio code coverage analysis&lt;/li&gt;
    &lt;li&gt;Deploy built applications to a network share&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... &lt;strong&gt;that's about it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Not that this is a bad thing - sometimes all you need to do is to build a solution, and you're done. It's still an automated build, and it's a world better than &lt;a href="http://www.codinghorror.com/blog/archives/000988.html"&gt;F5 as a build process&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, &lt;strong&gt;with FinalBuilder you can easily extend Team Build to:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Change the build process without editing XML&lt;/li&gt;
    &lt;li&gt;Automatically update and increment version information&lt;/li&gt;
    &lt;li&gt;Build solutions with any version of Visual Studio or MSBuild&lt;/li&gt;
    &lt;li&gt;Create, edit or remove Work Items based on build outcomes&lt;/li&gt;
    &lt;li&gt;Deploy to multiple locations, or via FTP&lt;/li&gt;
    &lt;li&gt;Build third party projects&lt;/li&gt;
    &lt;li&gt;Build installers&lt;/li&gt;
    &lt;li&gt;Run tests using different test frameworks&lt;/li&gt;
    &lt;li&gt;Build multiple versions or editions of the same product&lt;/li&gt;
    &lt;li&gt;Build legacy code (possibly using different tools)&lt;/li&gt;
    &lt;li&gt;Retrieve source code from legacy source repositories&lt;/li&gt;
    &lt;li&gt;Generate structured build logs, with the ability to instantly jump to any points of failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://finalbuilder.com/articles.aspx?mid=370&amp;amp;ctl=ArticleView&amp;amp;articleId=20"&gt;FinalBuilder slots directly into Team Build as a build engine, in place of (or beside) MSBuild&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At TechEd, many people have recognised that they face one or more of these scenarios. A few have no other build requirements, but a lot of people have said "Oh, we've been doing that manually" or "Yes, we've been doing this with MSBuild but it's hard and it keeps breaking."&lt;/p&gt;
&lt;p&gt;These are the cases where FinalBuilder can help create a true end-to-end build and release system, one which saves time and money and helps safeguard build quality and avoid last-minute surprises.&lt;/p&gt;
&lt;p&gt;... and no more XML files!&lt;/p&gt;</description></item><item><title>Window resizing issues on 64 bit Windows</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/406/Window-resizing-issues-on-64-bit-Windows.aspx</link><category>FinalBuilder</category><pubDate>Wed, 17 Oct 2007 04:20:17 GMT</pubDate><description>&lt;p&gt;I just spent the better part of 3 days trying to find out why the FinalBuilder IDE was not resizing properly on my machine. I have Windows Vista Business X64 on my machine, and found that code that worked perfectly on XP was not working on Vista. After many hours of debugging our source and the source to some third party components, I got nowhere.&amp;nbsp; I realised that I hadn't tested this on another Vista X64 machine, and sure enough... it worked fine on another machine. &lt;br /&gt;
&lt;br /&gt;
My first thought was to update my video drivers, and after rebooting and logging in to the machine, it seems the problem was resolved. However, as I was sitting there, resizing the window of my test application, the problem suddenly re-appeared! Since there were other applications still starting up at the time, it became a process of elimination.&lt;/p&gt;
&lt;p&gt;The culprit is Logitech SetPoint, which came with my Wireless keyboard &amp;amp; mouse (which I no longer use as they died when the office was flooded). Close SetPoint, and my test app (and FinalBuilder and Automise) resize properly. Start it up again and the problem is back.&lt;br /&gt;
&lt;br /&gt;
Since find the cause, we have tested on Vista 64 bit, Vista 32bit, XP 64 bit and XP 32bit. The problem only shows on 64 bit versions of windows.&amp;nbsp; I suspect this issue is one that Jordan Russell talks about here :&lt;/p&gt;
&lt;p&gt;&lt;a href="http://news.jrsoftware.org/news/toolbar2000/msg07779.html"&gt;http://news.jrsoftware.org/news/toolbar2000/msg07779.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So to sum up, if you see applications not resizing or not painting properly when resizing on 64 bit windows, see whether you have Logitech SetPoint running or not.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Automise, FinalBuilder and XML Formatted Data</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/661/Automise-FinalBuilder-and-XML-Formatted-Data.aspx</link><category>Automise,FinalBuilder</category><pubDate>Thu, 05 Jul 2007 22:36:17 GMT</pubDate><description>&lt;p&gt;Now and again people comment that they think FinalBuilder or Automise uses proprietary binary formats. I sympathise entirely. Binary formats are a pain to work with in version control, and a format like XML can be great when you need to make a sweeping change or tweak something. (If the people who make our help authoring tool are reading this post, please take note!)&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;The good news is that all of FinalBuilder and Automise's data is available via XML or raw text, you just need to know how to look for it!&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;The project files are XML&lt;/h2&gt;
&lt;p&gt;Both Automise and FinalBuilder save their project files as XML. If you save in the .FBP5 / .ATP2 "uncompressed" project format, then the project file is actually just an XML document. The XML isn't exquisitely formatted for human eyes, but a machine will be able to read it just fine..&lt;/p&gt;
&lt;p&gt;If you save in the .FBZ5 / .ATZ2 "compressed" project format, the project file is compressed using industry-standard zip compression. If you rename the file to .ZIP, and open it in a zip program (like &lt;a href="http://www.7zip.org"&gt;7zip&lt;/a&gt;), then you can view or extract the uncompressed project file inside.&lt;/p&gt;
&lt;p&gt;To choose whether to save "compressed" or "uncompressed" by default, go to Tools -&amp;gt; Options -&amp;gt; General IDE Options -&amp;gt; Design Time Options:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Options Dialog, showing compressed file option" src="/blogimages/angus/xmlformat/options.png" /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;h2&gt;Project logs can be exported as XML&lt;/h2&gt;
&lt;p&gt;OK, you've got me. Automise and FinalBuilder project log files (.fbl5 and .log2) are a &lt;a href="http://www.nexusdb.com"&gt;proprietary database format&lt;/a&gt;. In the old days, FinalBuilder 1 &amp;amp; 2 used a text formatted log file (or so I'm told.) This led to performance problems with large log files and long running projects. Hence the move to an embedded database engine.&lt;/p&gt;
&lt;p&gt;However, you can still export any project log as XML. To export a single log, go to the History tab, select a log, and click "Export Log to XML" (or HTML, or plain text.) To export the current log automatically as part of a running project, use the Export Log action:&lt;/p&gt;
&lt;p&gt;&lt;img src="/blogimages/angus/xmlformat/exportlog.png" alt="Export Log Properties" /&gt;&lt;/p&gt;
&lt;p&gt;Logs can be exported as text, HTML, or XML. XML formatted logs can be further tweaked via XSLT. It is possible to pass data from FB/AT to the XSL stylesheet, via the use of extra XSLT parameters. If you're interested in writing an XSL transform for the Export Log action, take a look at the "Stylesheets" directory in the FinalBuilder or Automise program directory. It contains the XSL files which are used to do the exports for text, xml and html.&lt;/p&gt;
&lt;h2&gt;The Other Project Files are INI Files&lt;/h2&gt;
&lt;p&gt;Any extra project files (like the FBD data file, or the FBV persistent variables file) are actually INI files which can be viewed in any text editor. Go ahead and try it!&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;... armed with this knowledge, you should be diffing, merging, checking in, parsing, cutting, pasting and transforming in no time!&lt;/p&gt;</description></item><item><title>Windows Vista compatibility</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/658/Windows-Vista-compatibility.aspx</link><category>FinalBuilder</category><pubDate>Wed, 23 May 2007 05:00:00 GMT</pubDate><description>Now that FinalBuilder 5.5 is out, I've posted a short article detailing some of the things to keep in mind when using FB with Windows Vista and User Account Control (UAC.) The article can be found &lt;a href="http://www.finalbuilder.com/Resources/Articles/ID/27/FinalBuilder-and-Windows-Vista.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
On a more techy subject, most developers are probably already well and truly up to speed with Vista integration by now, but here are a few resources that I found invaluable while getting a grip on the concepts of UAC, manifests, elevation, virtualization, and the elevation prompt.&lt;br /&gt;
&lt;p&gt; &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; &lt;a href="http://technet.microsoft.com/en-us/windowsvista/aa906021.aspx"&gt;User Account Control Overview&lt;/a&gt; at Microsoft TechNet. A good semi-technical (code-free) overview of&amp;nbsp; UAC.&lt;/li&gt;
    &lt;li&gt; &lt;a href="http://blogs.msdn.com/cjacks/archive/2006/09/08/exploring-manifests-part-2-default-namespaces-and-uac-manifests-in-windows-vista.aspx"&gt;Evolving the Software Organism: Default Namespaces and UAC Manifests in Windows Vista&lt;/a&gt;. Covers some gotchas when embedding a UAC manifest.&lt;/li&gt;
    &lt;li&gt; &lt;a href="http://weblogs.asp.net/kennykerr/archive/2006/09/29/Windows-Vista-for-Developers-_1320_-Part-4-_1320_-User-Account-Control.aspx"&gt;Kenny Kerr's Windows Vista for Developers (Part 4)&lt;/a&gt;. Great code summary of the two ways to request UAC elevation in Vista. Creating a process with an elevated token, or creating an elevated out-of-process COM object.&lt;/li&gt;
    &lt;li&gt; &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=BA73B169-A648-49AF-BC5E-A2EEBB74C16B&amp;amp;displaylang=en"&gt;Windows Vista Application Development Requirements for User Account Control Compatibility&lt;/a&gt;. 500-pound-gorilla Word document, covers everything you ever wanted to know (and then some.)&lt;/li&gt;
    &lt;p&gt;&amp;nbsp;&lt;/p&gt;
    &lt;p&gt;
    Happy Vista-ing!&lt;/p&gt;
&lt;/ul&gt;</description></item><item><title>What's new in FinalBuilder 5 - FinalBuilder VariableSense™</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/404/Whats-new-in-FinalBuilder-5-FinalBuilder-Variab.aspx</link><category>FinalBuilder</category><pubDate>Wed, 27 Sep 2006 05:00:00 GMT</pubDate><description>As software developers, we've all be spoiled by modern development IDE's like Microsoft Visual Studio, Borland Delphi, JBuilder etc. We've become so accustomed to the Code Completion or Intellisense features that we find it hard to write code in notepad these days! Every day, we deal with class libraries with hundreds or even thousands of classes, methods, variables etc and we couldn't possibly remember the names of every identifier. How many times a day do you find yourself typing a class or type name in the code editor, then typing a dot and waiting for the Intellisense drop down list to appear, and then spend a few minutes exploring what's on offer. Well, why should it be any different when working in text fields in FinalBuilder (the script editor already has a code completion feature)? Enter FinalBuilder VariableSense&amp;trade;.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="/Portals/0/ArticleImages/BlogImages/variablesense.gif" alt="variablesense.gif" height="156" width="480" style="border-width: 0px;border-style: solid;" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Simply Type the Variable delimeter character ( % ) and down pops a list of variables available. As you type the list is filtered. You can use the up/down arrow keys and page up/down keys to scroll the list, hit enter to insert the currently selected entry. &lt;br /&gt;
&lt;br /&gt;
VariableSense&amp;trade; works in all Edit Boxes and Combo Boxes that allow typing. In the future we'll be extending this to other control types such as grids etc.&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Mixing up FinalBuilder with Team System (no more XML files!)</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/656/Mixing-up-FinalBuilder-with-Team-System-no-more-X.aspx</link><category>FinalBuilder,TFS</category><pubDate>Thu, 17 Aug 2006 14:00:00 GMT</pubDate><description>One of the comments that we frequently hear from users is "I couldn't do &lt;em&gt;xyz&lt;/em&gt; with MSBuild, but I can now with FinalBuilder."&lt;br /&gt;
&lt;br /&gt;
This is great, but hardly surprising. FinalBuilder includes out-of-the-box support for many more tools and processes than MSBuild. Not to mention that it has a GUI to set up your build process - no more editing XML files!&lt;br /&gt;
&lt;br /&gt;
Lately, though, an increasing number of our users are moving to Microsoft Team System. One of the cornerstones of the Team System process is the Team Foundation Build engine, which is built on top of MSBuild.&lt;br /&gt;
&lt;br /&gt;
Now, the Team Foundation Build wizard is fine if you only need to create simple build processes. Get some files, build some solutions, deploy some binaries to a file share. If you need to do anything more, though (and who doesn't?), then you're stuck back in XML land... The same applies if you want to edit your build processes after you've created them.&lt;br /&gt;
&lt;br /&gt;
Plain XML editing, with no built-in support for third-party tools, no support for data processing, no support for parallelisation, FTP transfers, Active Scripting, structured exceptions, recursion or Windows system functionality...&lt;br /&gt;
&lt;br /&gt;
FinalBuilder to the rescue!&lt;br /&gt;
&lt;br /&gt;
The Team Foundation Build engine allows you to add custom MSBuild tasks at any stage of your build process. This means that, with just a couple of lines of XML, you can &lt;span style="text-decoration: underline;"&gt;move your entire Team Build process&lt;/span&gt; to FinalBuilder! FinalBuilder can be used in place of MSBuild to provide functionality at &lt;span style="text-decoration: underline;"&gt;every stage&lt;/span&gt; of the Team Foundation build process (fetch, compile, test &amp;amp; deploy.) What's more, it all fits perfectly within the Team System framework!&lt;br /&gt;
&lt;br /&gt;
To see how, take a look at the walkthrough I just wrote: &lt;a href="/articles.aspx?mid=370&amp;amp;ctl=ArticleView&amp;amp;articleId=20"&gt;Integrating FinalBuilder with Microsoft Team Foundation Build&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
... Happy building!</description></item><item><title>File Dependencies</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/654/File-Dependencies.aspx</link><category>FinalBuilder</category><pubDate>Thu, 17 Nov 2005 01:18:00 GMT</pubDate><description>&lt;p&gt;Have you ever wished you can have your build check whether or not files have changed, so you know whether or not to rebuild?&lt;/p&gt;
&lt;p&gt;With &lt;a href="http://www.finalbuilder.com/finalbuilder/FB4Beta.html"&gt;FinalBuilder 4&lt;/a&gt;,&amp;nbsp;you now&amp;nbsp;can! Check out the new File Dependency action (you will need the latest public beta.)&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;img alt="Sample Project" src="http://www.finalbuilder.com/blogimages/angus/filedep/DemoProject.gif" /&gt;&lt;/p&gt;
&lt;p&gt;This is a skeleton action list&amp;nbsp;that does&amp;nbsp;two things:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;It synchronizes&amp;nbsp;a local copy of the source files&amp;nbsp;(via SurroundSCM Get.)
    &lt;/li&gt;
    &lt;li&gt;It&amp;nbsp;checks the file dependencies to see if anything has changed. Lets&amp;nbsp;zoom in on the File Dependency action:&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="Source Files" src="http://www.finalbuilder.com/blogimages/angus/filedep/FilesToCheck.gif" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;In &lt;strong&gt;Files and Folders to check&lt;/strong&gt;, I'm telling FinalBuilder to look at the modification dates of all the main FinalBuilder source and resource&amp;nbsp;files.&amp;nbsp; Because I've chosen &lt;strong&gt;Recurse into subdirectories&lt;/strong&gt;, FinalBuilder&amp;nbsp;will scan&amp;nbsp;the subdirectories of&amp;nbsp;each for all files of&amp;nbsp;those&amp;nbsp;types.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;So, how do we know if the files have changed?&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="Source Files" src="http://www.finalbuilder.com/blogimages/angus/filedep/DateToCompare.gif" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;As you can see, I've told FinalBuilder to&amp;nbsp;check for any files which have changed since the last time the action was run. In the &lt;strong&gt;Options&lt;/strong&gt; section, I've elected to have FinalBuilder ignore any files created within two minutes of the last run, to compensate for jitter in the modification dates.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;You can see in the greyed-out&amp;nbsp;&amp;ldquo;&lt;strong&gt;Use date from file&amp;ldquo;&lt;/strong&gt; section that I could have elected to compare the modification dates of the compiled libraries, in order to be really sure whether or not to rebuild.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;In fact, you can build a&amp;nbsp;simple continous integration tool with just one more action:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="Poor Man's Continous Integration" src="http://www.finalbuilder.com/blogimages/angus/filedep/PoorMansContinuousIntegration.gif" /&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;Example1 re-schedules itself (using the Schedule Add action and the Windows Scheduler) to run 10 minutes after it finishes, but only starts a build if there are files that have changed.&lt;/p&gt;
&lt;p style="text-align: left;"&gt;Example 2 is&amp;nbsp;even simpler - it loops continously checking for changed files (with a short delay in between each loop.) I also put in a separate check so the help file is only rebuilt if it has changed.&lt;/p&gt;</description></item><item><title>FinalBuilder 4 - more on Async Action Groups</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/401/FinalBuilder-4-more-on-Async-Action-Groups.aspx</link><category>FinalBuilder</category><pubDate>Wed, 19 Oct 2005 01:04:00 GMT</pubDate><description>&lt;p&gt;Tate blogged about &lt;a href="http://blogs.finalbuilder.com/tate/archive/2005/10/04/732.aspx"&gt;Async Action Groups&lt;/a&gt; a few weeks ago, however there is a lot of confusion about how they work amongst the beta testers(something we need to address in the documentation!). I'm going to explain here exactly how they work and discuss some of the limitations inherent in threaded builds. &lt;/p&gt;
&lt;p&gt;Lets take a look at an Action List&amp;nbsp;with an async group :&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.finalbuilder.com/blogimages/FinalBuilder4_AsyncGroups1.png" style="border-width: 1px;border-style: solid;" /&gt; &lt;/p&gt;
&lt;p&gt;In the above example, Action 1, Action 2 and Action 3 will be started simultaneously. Each immediate child action of the Async Group is treated like an action inside their own action lists, and this is in fact how it is implemented. The actions are mapped onto a pseudo action list object and then the pseudo action list object is executed in it's own thread with it's own execution engine. &lt;/p&gt;
&lt;p&gt;If we look at the above list, the general execution order will be something like :&lt;/p&gt;
&lt;p&gt;(in thread 1) Action 1, Action 1.1, Action 1.2, Action 1.2.1&lt;br /&gt;
(in thread 2) Action 2, Action 2.1, Action 2.2, Action 2.2.1&lt;br /&gt;
(in thread 3) Action 3, Action 3.1, Action 3.2, Action 3.2.1&lt;/p&gt;
&lt;p&gt;The actual execution order (ie the real time execution order) would probably be completely different depending on which actions are used and how long they take to execute, however Action 1,2 &amp;amp; 3 will always start at pretty much (give or take a few milliseconds) the same time. &lt;/p&gt;
&lt;p&gt;So now we know how Async Groups are supposed to work, lets mull over some of the implications of using Async Groups and look at some of the limitations. Just like threading in your application code, Async Groups are no silver bullet. Having two or more actions running in parallel will not necessarily translate into reduced build times. Your milage will vary, depending on whether your actions are I/O bound, or CPU bound. Running two cpu bound actions in parallel will probably increase the time they take compared to running them in serial. The same applies to i/o bound actions. So the smart thing to do is run a cpu bound&amp;nbsp;action in parallel with an i/o bound action. Of course, if you are running your builds on multi-cpu machines with very fast hard disks and gigabit Ethernet then these rules go out the window.. and trial and error will prevail. &lt;br /&gt;
&lt;br /&gt;
So what limitations are there with Async? Well,&amp;nbsp;some actions need exclusive access to a resource,&amp;nbsp;&amp;nbsp;for example the&amp;nbsp;Visual Source Safe actions change settings in the ss.ini file before running the source safe command line tool. These settings need to be changed for the command line tool to give us the behavior we require. So what happens if we execute two source safe actions together? The results are unreliable at best. In the current beta (build 31), we don't have anything to prevent this from happening. In the next build we upload, we have implemented a generic resource locking scheme in the execution engine, so that when an action is executed, it can indicate whether it needs a resource lock or not. The source safe actions will now provide this indication, and the net effect is that the source safe actions will be serialized, even if they are running in an async group. This applies only to source safe actions using the same srcsafe.ini file (ie vss database). If another source&amp;nbsp;safe action is using a different&amp;nbsp;database then that action would not require serialization.&amp;nbsp;The same applies to the CD Burner and Create ISO actions. In our tests, we found that&amp;nbsp;the cdburner library we use is not thread safe and so requires locking. In the next few weeks we'll be testing all the actions in &lt;a title="Finalbuilder Website" href="http://www.finalbuilder.com/finalbuilder/" target="_blank"&gt;Finalbuilder&lt;/a&gt; for thread safety and implementing resource locking as required. &lt;/p&gt;
&lt;p&gt;Another limitation is that you cannot use the &amp;ldquo;Run Actionlist&amp;ldquo; and &amp;ldquo;Include FinalBuilder Project&amp;ldquo; actions under an Async group. The reasons for this are complicated. If the same actionlist was executed multiple times, it would require multiple instances of the action list to avoid re-entrance issues, and that brings with it a whole host of other related gotchas. While I do plan to spend some more time investigating enabling these actions under Async Groups, I'm not expecting that this will happen before 4.0 is released. &lt;/p&gt;
&lt;p&gt;When we looked at adding the Async Group action during our planning for FinalBuilder 4, we figured people might potentially achieve&amp;nbsp;10-15% faster builds. So far, the feedback from beta testers has proven that to be the case. In our own builds, we achieved around a 5% boost, on a single cpu VMWare virtual machine. We did try the virtual smp support in VMWare 5.5&amp;nbsp; beta, however it actually resulted in slower builds. We'll try again when VMWare 5.5 is released. &lt;/p&gt;
&lt;p&gt;v.&lt;/p&gt;</description></item><item><title>CruiseControl.NET</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/653/CruiseControlNET.aspx</link><category>FinalBuilder</category><pubDate>Wed, 05 Oct 2005 02:46:00 GMT</pubDate><description>&lt;p&gt;I've also been working on a FinalBuilder plugin&amp;nbsp;for the open source continuous integration tool,&amp;nbsp;&lt;a href="http://ccnet.thoughtworks.com/"&gt;CruiseControl.NET&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We're still testing the&amp;nbsp;plugin&amp;nbsp;right now, but it will be released&amp;nbsp;in time for FinalBuilder 4.&amp;nbsp;You can add a FinalBuilder project to CruiseControl.NET with just two XML tags!&lt;/p&gt;
&lt;p&gt;If you would like to beta test,&amp;nbsp;please&amp;nbsp;&lt;a href="mailto:support@finalbuilder.com"&gt;let us know&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>New XML Actions</title><link>http://www.finalbuilder.com/Resources/Blogs/PostId/652/New-XML-Actions.aspx</link><category>FinalBuilder</category><pubDate>Wed, 05 Oct 2005 02:32:00 GMT</pubDate><description>&lt;p&gt;I'm now into my fourth month here at VSoft, so it must be about time for a first blog post!&lt;/p&gt;
&lt;p&gt;I've been working on all kinds of new actions for FinalBuilder 4. I think lots of you who requested features will be very happy with the upcoming release (and everyone else should find something useful, too.)&lt;/p&gt;
&lt;p&gt;Today I just wanted to demonstrate two new XML actions : the XML Iterator&amp;nbsp;and the XML Read from Variable Action. Combined with the already strong XML support in FinalBuilder, you can work with data from almost any XML file. Allow me to demonstrate:&lt;/p&gt;
&lt;p&gt;Here's the project:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://www.finalbuilder.com/blogimages/FB4_XMLIterator_project.gif" /&gt;&lt;/p&gt;
&lt;p&gt;The XML file I'm iterating is a 3Mb chunk of the &lt;a href="http://jv.wikipedia.org/"&gt;Javanese edition of the Wikipedia&lt;/a&gt;, exported as XML. I'm going to catalogue all the users who made edits, and record their usernames as well as any comments they recorded. I don't want to record revisions by the automatic MediaWiki bots.&lt;/p&gt;
&lt;p&gt;So, I iterate through the XPath /mediawiki/page/revision, saving the absolute XPath in to each revision in the 'Page' FinalBuilder variable:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/blogimages/FB4_XMLIterator_xmliterator.gif" /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Once I have the absolute XPath to&amp;nbsp;each node, I can&amp;nbsp;read the 'Comment' and 'Contributor' tags into FinalBuilder variables. Here's the action which reads 'Comment':&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img alt="" src="http://www.finalbuilder.com/blogimages/FB4_XMLIterator_readxmlvalue.gif" /&gt;&lt;/p&gt;
&lt;p&gt;The 'Comment' tag is optional, so I use a Try... Catch block to blank out the comment if there isn't one.&lt;/p&gt;
&lt;p&gt;Together with a 'Write Text File', these&amp;nbsp;actions are&amp;nbsp;all you need to create a list of contributors and their comments.&lt;/p&gt;
&lt;p &gt;This sort of technique can be used to parse any kind of XML file&amp;nbsp;as part of&amp;nbsp;your build process. If you need to, you can even create an XML file which gives instructions to your build process. But &lt;a href="http://nant.sourceforge.net/"&gt;who'd want to do that&lt;/a&gt;?&lt;/p&gt;</description></item></channel></rss>