Posts

Showing posts from August, 2010

Powershell: Returning ScriptBlocks and Closures

Powershell lets you return scriptblocks (aka anonymous functions) from functions, for example: function generateAdder ($n) { { param ($x) $n+$x } } PS C:\> $add4 = generateAdder 4 PS C:\> & $add4 7 7 If you've used languages with closures you'd have expected to get back a function that adds 4 to a passed in value. You'd expect that because $n=4 was in lexical scope when we created the scriptblock to be returned. Recall powershell is dynamically scoped so we don't need to bind ($n) to a lexcial location, instead we can pick up $n from our current environment: PS C:\> $n = "Hello" PS C:\> & $add4 7 Hello7 What if you want to instantiate a closure with powershell instead? Luckily someone thought of that and you can do: function generateAdder2 ($n) { { param ($x) $n+$x }.GetNewClosure() } PS C:\> $add4 = generateAdder2 4 PS C:\> & $add4 7 11 Leave a comment if you use th

Batch to Powershell: dir /s

I often go looking for a file in batch, aka c:\Program Files (x86)>dir /s fsi* Volume in drive C has no label. Volume Serial Number is 8EDE-D64E Directory of c:\Program Files (x86)\Microsoft F#\v4.0 03/19/2010 02:02 PM 230,216 Fsi.exe 09/30/2009 08:08 PM 158 Fsi.exe.config 2 File(s) 230,374 bytes Unfortunately this doesn't 'just work' in powershell. A quick search on the internet shows in powershell 'dir /s' becomes 'dir -r', but the following doesn't work either: PS C:\Program Files (x86)> dir -r fsi* PS C:\Program Files (x86)> What's going on? Let's check the help: PS C:\Program Files (x86)> help dir NAME Get-ChildItem SYNOPSIS Gets the items and child items in one or more specified locations. SYNTAX Get-ChildItem [[-Path] ] [[-Filter] ] [-Exclude ] [-For ce] [-Include ] [-Name] [-Recurse] [-UseTransaction] [ ] Get-ChildItem