Most of this post is also based on the Microsoft?s Windows PowerShell Quick Reference however despite the sharing scripting runtimes the nature of the both shells differ considerably as described in the previous post: PowerShell for EPiServer – cheat sheet – Part 1. In all cases where it made sense I?ve converted the samples to establish them in EPiServer scenarios.
How to Write Conditional Statements
To write an If statement use code similar to this:
$page = Get-CurrentPage;
$changedBy = $page.ChangedBy;
$me = [EPiServer.Security.PrincipalInfo]::Current;
$myName = $me.Name;
if ($changedBy -eq "")
{ "Unspecified author - a system page?" }
elseif ($changedBy -eq $myName)
{ "The page has been last edited by me!" }
else
{ "The page has been last edited by "+ $changedBy }
Instead of writing a series of If statements you can use a Switch statement, which is equivalent to VBScript?s Select Case statement:
$page = Get-CurrentPage;
switch ($page.PageChildOrderRule) {
0 {"Undefined sort order. "}
1 {"Most recently created page will be first in list"}
2 {"Oldest created page will be first in list"}
3 {"Sorted alphabetical on name"}
4 {"Sorted on page index"}
5 {"Most recently changed page will be first in list"}
6 {"Sort on ranking, only supported by special controls"}
7 {"Oldest published page will be first in list"}
8 {"Most recently published page will be first in list"}
default {"No idea what that means!"}
}
Most of this is based on the Microsoft?s Windows PowerShell Quick Reference however despite the sharing scripting runtimes the nature of the both shells are pretty different (although the differences are not as vast as one might think).
Windows PowerShell
PowerShell Console for EPiServer
Interactive ? command can ask for confirmations and can be aborted. User can be solicited to provide input.
Batch ? all commands are being executed in one go, the script has no chance to ask questions, go or no-go decisions have to be solved within the script.
Supports colouring.
Supports plain text output only.
Supports command line arguments for running scripts.
All arguments are defined directly within the script or derived from context automatically.
Can access any file depending on the rights of the user.
Can only access files the web application identity can write to. Cannot access files on user?s machine but rather operates on the server?s file system. Cannot operate with elevated privileges.
That said, I considered that enough of the Reference document is irrelevant in the EPiServer scenario that it?s beneficial for the users of the console to have a bespoke cheat sheet created especially for the purpose of this plugin.
The content & samples of the original cheat sheet has been adjusted to more closely reflect scenarios usable for an EPiServer admin or developer.
Ok, so I?ve got my shot of endorphins writing about PowerShell last week (damn, it?s nice to be able to code again!), and I got pretty determined on making it usable and achieving all the goals I?ve initially envisioned. and in the process build a usable tool and a library of scripts that people can use either directly or to modify to meet their needs.
The goal for this week: Context Scripts
Context scripts are the first step to break the scripting out of the admin realm and into the editor?s space. Those scripts will still be written by admins and developers but the goal is for them to be usable by the authors. The goal for those scripts can be as trivial as e.g. syndicating all the great functionality little plugins like this Unpublish button by Ted in one place and then mix and match them to your liking.
Some of the important bits:
Context scripts are something that is visible to users on ?Scripts? page.
Scripts can be exposed to everyone or just the groups of your liking? you define it in the script.
Scripts are grouped in collections that are defined in *.psepi files that you drop into your application folder
It?s been a while since I had a chance to do any coding… turns out leading a development division tends to not have much to do with development? who knew?!
But I?ve finally got a moment to sit down and refresh the EPiServer PowerShell console and make it compatible with both CMS versions 5 & 6. You could technically use it before on CMS 6 but the looks of it was broken. (previous version available here)
What triggered it was a talk with Michael Sadler earlier this week. Michael is a technical consultant by day (and a musician by night) in our solutions team in London. We talked how he was doing a content audit for a client in one of the other CMS?es we?re supporting. Which really sounded like a daunting task? The content got exported as XML and then he had to write a bunch of C# code to parse it and create statistics for e.g. how many people edit the content, who created the majority of the content etc? well I couldn?t resist but to brag?
looks through all the pages, and counts how many articles by each author there are in the CMS. Naturally you can also do it on a sub-branch of content as well.
I?m sorry Michael you had to go through this without PowerShell?
Deployment
The plugin will detect the version of EPiServer it?s running under and will skin itself appropriately to match the CMS style.
As far as I can tell, your PowerShell scripts will be interchangeable between the versions, as far as they themselves don?t touch any API that?s undergone a breaking change.
It?s been a while since I had a chance to do any coding… turns out leading a development division tends to not have much to do with development? who knew?!
But I?ve finally got a moment to sit down and refresh the EPiServer PowerShell console and make it compatible with both CMS versions 5 & 6. You could technically use it before on CMS 6 but the looks of it was broken. (previous version available here)
What triggered it was a talk with Michael Sadler earlier this week. Michael is a technical consultant by day (and a musician by night) in our solutions team in London. We talked how he was doing a content audit for a client in one of the other CMS?es we?re supporting. Which really sounded like a daunting task? The content got exported as XML and then he had to write a bunch of C# code to parse it and create statistics for e.g. how many people edit the content, who created the majority of the content etc? well I couldn?t resist but to brag?
looks through all the pages, and counts how many articles by each author there are in the CMS. Naturally you can also do it on a sub-branch of content as well.
I?m sorry Michael you had to go through this without PowerShell?
Deployment
The plugin will detect the version of EPiServer it?s running under and will skin itself appropriately to match the CMS style.
As far as I can tell, your PowerShell scripts will be interchangeable between the versions, as far as they themselves don?t touch any API that?s undergone a breaking change.
It’s been a while since I had a chance to do any coding… turns out leading a development division tends to not have much to do with development… who knew?!
But I’ve finally got a moment to sit down and refresh the EPiServer PowerShell console and make it compatible with both CMS versions 5 & 6. You could technically use it before on CMS 6 but the looks of it was broken. (previous version available here)
What triggered it was a talk with Michael Sadler earlier this week. Michael is a technical consultant by day (and a musician by night) in our solutions team in London. We talked how he was doing a content audit for a client in one of the other CMS’es we’re supporting. Which really sounded like a daunting task… The content got exported as XML and then he had to write a bunch of C# code to parse it and create statistics for e.g. how many people edit the content, who created the majority of the content etc… well I couldn’t resist but to brag…
looks through all the pages, and counts how many articles by each author there are in the CMS. Naturally you can also do it on a sub-branch of content as well.
I’m sorry Michael you had to go through this without PowerShell…
Deployment
The plugin will detect the version of EPiServer it’s running under and will skin itself appropriately to match the CMS style.
As far as I can tell, your PowerShell scripts will be interchangeable between the versions, as far as they themselves don’t touch any API that’s undergone a breaking change.
November 5th, 2010 by Adam Najmanowicz | 54 Comments
I meant to write this a long time ago but somehow that never really got out of the room. Following is a narrative of an EPiServer site that was on and off the net for half a year or longer and what I?ve learned in the process.
<day id=?1? />
We?ve gathered all the data from the client ? we know they have implemented custom ?skins? (basically controls that brand the mini sites based on under which domain the site is being displayed. Quite a cool solution. Also since they were struggling with the speed they have implemented a custom mini taxonomy based on Lucene.net to speed things up. Yet the site is terribly slow and keeps showing the familiar (for a developer) ?Application is busy under initialization? from time to time.
September 22nd, 2010 by Adam Najmanowicz | 81 Comments
This one definitely took more time than I initially expected, and before I devote even more to it I would very much like to hear your opinion. Do you find it useful? Which way should the development be going? But first things first?
Have you ever found yourself:
having to make a mundane change to a large number of pages?
in need of getting statistics on page properties or page type usages?
being curious of e.g. what?s the oldest page on your site?
having to copy or move a large number of files from one folder to another or between versioning and non versioning virtual path providers?
renaming or deleting files in your file store en-masse?
If the answer to any of those (and more) is a ?yes!?, I believe you might find my little plugin useful.
The idea is to create a scripting environment to work with EPiServer on a more granular level than the existing PowerShell SnapIn API enables us currently. Manipulate not just sites, but files and pages on a large scale or perform statistical analysis of your content using a familiar and well documented query language.
The PowerShell console for EPiServer provides you with two abstractions to work with:
Virtual Path Provider Drive
With the console you can browse the VPP and perform a number of file operations just like you were doing it in a regular PowerShell console on a regular disk drive. Especially?
move files between Virtual path providers
move, copy or rename files and folders
Known limitations:
You cannot load files from disk directly onto a VPP and vice versa (this however can be overcome by mapping the path you want to migrate into your CMS as a native path provider and copying from that).
some actions might not respect or might unintentionally force recursive operation.
the console might blow up unexpectedly (What do you mean crippled? I got all five fingers! Three on this hand, two on the other one!)
I think you might find it quite useful offloading files from versioning VPP onto a Native VPP once you decide that you want to access the content of the files outside the CMS. Or pulling your files into the Database VPP (available for download from EPiCode).
Page Store Drives
The console will map all your CMS page roots as drives based on the site name (site name should not have space in it for the current version to work). Now this one? the sky is the limit!
The items that the drive exposes are fully functional PageData?s, additionally ? for your scripting convenience all page properties are mapped so that you can access them like they were regular POCO properties.
By far this is the coolest little toy I?ve recently played with ? I would strongly advised that you look into the samples and put your imagination to work!
You can create statistics, modify pages based on regular expressions, filter, delete, rename, move around?
Naturally the Obligatory disclaimer is that you use the tool at your own responsibility. Make backups, test your script on staging before doing anything. Heck! Don?t use it on production at all yet (!) ? it?s very much an alpha and a technology demo.
December 26th, 2009 by Adam Najmanowicz | 21 Comments
One of the most frequently and eagerly used programming constructs of the Microsoft.Net Framework is Enum. There are several interesting features that make it very compelling to use to for all kinds of dropdowns and checklists:
The bounds factor ? proper use of Enum type guarantee that the selected value will fall within the constraints of the allowed value set.
The ability to treat Enums as flags (and compound them into flag sets) as well as a one-of selector.
The ease of use and potentially complete separation of the ?Enum value? from the underlying machine type representation that ensures the most efficient memory usage.
Surprisingly enough EPiServer as it stands right now does not have an easy facility to turn Enums into properties. To give credit where credit is due, the EPiServer framework provides a nice surrogate that mimic that behaviour to a degree. The relevant property types are:
PropertyAppSettingsMultiple – which ?creates check boxes with options that are defined in the AppSettings section in web.config. The name of the property should match the key for the app setting.?
PropertyAppSettings – which ?creates a drop down list with options that are defined in the AppSettings section in web.config. The name of the property should match the key for the app setting.?
You quickly realize though that the properties have some limitations that makes their use a bit less compelling:
The properties are not strongly typed
The property entry in AppSettings section has to have the name that matches the property name on the page.
It?s rather poorly documented, Other than relating to this blog entry or Erik?s post documenting it I could not find any other examples on how to use them. (but then again, who needs docs really when we have Reflector)
You cannot have the very same property duplicated on the page since you can only have a single property of a given name per page. So you need to have multiple entries in AppSettings that match the name of each of those properties on your pages. I know? semantics but still?
You are working on strings rather than enums (Did i mention it?s not type safe?)
The values in the AppSettings are stored in a somewhat DLS-y manner (consecutive options are separated from each other with the ?|? character, the name and the value are separated with a ?;?, for example: <add key = "RegionId" value="First Option;Option1|Default Option;Option2|Disabled Option;Option3" /> ) and I have had on an occasion entered a string there that caused the server to crash.
The values are not translatable, or at least I could not find how to do it and any Reflector digging rendered no results either.