I’ve been tooling around with powershell recently, trying to teach myself some basics, and a recent support request which would have previously been done manually looked like a perfect opportunity for a little ps1 script.
The request was to disable a feature on the website which is configured from a setting in the web.config file on each server. Since web.configs are xml files, I thought I could treat it as such, traversing and editing values as needed.
So here it is; pretty lengthy for what it’s doing since I don’t know the nicer ways of doing some things (e.g., var foo = (bar == baz ? 0 : 1), and var sna = !sna), and as such any comments to help out would be appreciated:
function ValueToText([string] $val){ if ($val -eq "1"){return "enabled"} else {return "disabled"} } [System.Xml.XmlDocument] $xd = new-object System.Xml.XmlDocument # pipe-delimited servers to work against $servers = "192.168.0.1|192.168.0.2|192.168.0.3" foreach ($server in $servers.Split("|")) { write-host "Now configuring " $server $file = "\\" + $server + "\d$\Web\web.config" $xd.load($file) # save a backup, just in case I snafu the site $xd.save($file + ".bak") # keys to edit $nodelist = $xd.selectnodes("/configuration/appSettings/add[contains(@key,'Chat')]") foreach ($node in $nodelist) { $key = $node.getAttribute("key") $val = $node.getAttribute("value") $setting = ValueToText($val) $prompt = $key + " is currently " + $setting + ": toggle this? Y/N" $toggle = read-host $prompt if ($toggle -eq "Y" -or $toggle -eq "y"){ if ($val -eq "1") {$newbool = "0"} else {$newbool = "1"} $node.setAttribute("value", $newbool) $newsetting = ValueToText($newbool) $prompt = $key + " is now " + $newsetting write-host $prompt } } $xd.save($file) } write-host * done *
It’s probably not much more than a “hello world”, but it certainly helped me out recently 🙂