In another installment of “handy PowerShell snippets“, I offer a few more I’ve used on occasion:
Comparing documents in PowerShell
WinMerge is a great tool for identifying differences between files, but if you want to automate such a process, PowerShell’s Compare-Object is an excellent choice.
Step 1: Load the documents you wish to compare
1
2 $first_doc = cat "c:\somepath\file1.txt"
$second_doc = cat "c:\somepath\file2.txt"
Step 2: Perform your comparison.
Note that Compare-Object will return a “<=” indicating that a given value was found in the first file but not the second, a “=>” indicating a given value was found in the second file but not the first, or a “==” indicating that a given value was found in both files.
Step 3: Analyze your results and profit!
One note of warning: In my experience, Compare-Object doesn’t do well comparing nulls. To avoid these circumstances, when I import the files I wish to compare, I’ll explicitly remove such troublesome values.
Join a list of items into a single, comma-delimited line
Sometimes I’ll have a list of items in a file that I’ll need to collapse into a single, delimited line. Here’s a one-liner that will do that:
1 (cat "c:\somepath\somefile.csv") -join ","
Use a configuration file with a PowerShell script
A lot of times, PowerShell devs will either declare all their variables at the top of their scripts or in some sort of a custom configuration file that they load into their scripts. Here’s another option: how about leveraging the .NET framework’s configuration system?
If you’ve ever developed a .NET application, you’re already well aware of how to use configuration files. You can actually use that same strategy with PowerShell. For example, suppose you’ve built up a configuration file like so:
1
2
3
4
5
6 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="test_key" value="dadoverflow.com is awesome and i'm going to tell my friends all about it"/>
</appSettings>
</configuration>
You can then load that config file into your PowerShell script with the following:
1
2
3
4 $script_path =$MyInvocation.MyCommand.Path
$my_config =[System.Configuration.ConfigurationManager]::OpenExeConfiguration($script_path)
$my_config_val = $my_config.AppSettings.Settings.Item("test_key").Value
One note: your PowerShell script and config file will need to share the same name. If your PowerShell script is called dadoverflow_is_awesome.ps1, then you’ll want to name your config file dadoverflow_is_awesome.ps1.config.
Here’s a bonus: Yes, it might be easier to just declare your variables at the top of your file and forgo the extra work of crafting such a config file. However, what if one of your configuration values is a password? By leveraging .NET’s configuration system you also get the power to encrypt values in your config file and hide them from prying eyes…but that’s a discussion that merits its own blog post, so stay tuned.
Recent Comments