Use PowerShell to find all instances of a DLL

Eventually, if you do enough .NET development, you will find yourself in a situation where your application is complaining because it cannot find the right version of a DLL. You could always try to do a search of your hard drive and find these DLLs, but why do it the hard way? Easily enough, you can just use PowerShell to find all instances of a DLL on your computer, which can help you try to track down issues like this.

Here is the PowerShell command that will show you all of the folders, dates, and versions of a DLL that starts with “newtonsoft”. Make sure to substitute in the name of the DLL you are searching for, that you start in the folder that you want to execute the search from (or in other words, if you want to search your entire hard drive, make sure to change directory to the root of your C: drive first), and it can help if you run the PowerShell application as an administrator if you can.

Get-Childitem -Recurse newtonsoft*.dll | Format-Table directory,creationtime,lastwritetime,@{label="ProductVersion";expression={$_.versioninfo.productversion}},@{label="FileVersion";expression={$_.versioninfo.fileversion}}

Or, if you want a listing with fewer columns, try this one:

Get-ChildItem -Recurse newtonsoft*.dll | Format-Table directory,@{label="FileVersion";expression={$_.versioninfo.fileversion}},lastwritetime

BTW, a posthumous Happy Birthday to Dennis Ritchie, a legend in the software development community.

Use ExecuteScalar to insert a database row and return the primary key

I suspect that just about every developer who has had to work with SQL Server has faced this issue. You need to insert a bunch of related records, some of which depend on other records being in the database first. I stumbled on a way to use ExecuteScalar to insert a database row and return the primary key with one call.

To do this, you just add this to the end of your INSERT statement:

SELECT Scope_Identity();

This SQL Server function returns the primary key of the last row that was added to the database with a primary key column. For my instance, I have a SqlText class that encapsulates a lot of the System.Data.Client functionality, so my code looks like this. (I have omitted most of the fields so that this code would be shorter.)

// table 'BillingAddresses' has an integer primary key, auto generated, identity
// 'addressLine1' below refers to a string variable containing line 1 of the address
var sqlString = "insert into BillingAddresses (Line1) values (@Line1); SELECT Scope_Identity();";
var newBillingAddressID = SqlText.ExecuteScalar(sqlString, new { Line1 = addressLine1 });

However, if you are using the standard System.Data.Client namespace, your code would then look like this:

// table 'BillingAddresses' has an integer primary key, auto generated, identity
// 'conn' below refers to an opened instance of a SqlConnection
// 'addressLine1' below refers to a string variable containing line 1 of the address
var sqlString = "insert into BillingAddresses (Line1) values (@Line1); SELECT Scope_Identity();";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Line1", SqlDbType.VarChar);
cmd.Parameters["@Line1"].Value = addressLine1;
var newBillingAddressID = cmd.ExecuteScalar();

Another plug for guidebook.me

I don’t really have anything new to put out there this month, so let me just put in another plug for guidebook.me, the site that I have been developing that lets you track your travel so that you can see where you have been, and plan out where you want to go next.

ASP.NET MVC select tag does not work unless specifically closed

I found out after a bit of pulling my hair out today that if you want to display a dropdown menu via a select tag inside a .cshtml page in your ASP.NET MVC project, you had better close the tag with </select>, because if you rely on the self closing tag (think <select />), then your asp-items will get eaten, along with other miscellaneous things.

Guidebook.me

Please check out my new travel tracking site, Guidebook.me. I have put a lot of time and effort into it, and while it is not done yet, I do have some big plans for it going forward. Let me know if you have any questions or comments.

Organizing a family photo collection using PowerShell, part 2

Just to recap from last month’s post, I have been given the chore of… Organizing a photo collection.

The files were on several computers and backups, so PowerShell on Windows 10 became the main vehicle with which I would try to bring this beast under control.

Plan for organizing a photo collection

  1. Bring photos together from all sources into one place
  2. Remove duplicate photos
  3. Organize photos by month and year

Step 3

Here is the PowerShell script that I used to organize the photos into folders by month and year. (WARNING: Any time you set up any kind of automated file process, make sure that you have backups.)

function fmove($SourceDir,$DestinationDir)
{
	$files = Get-ChildItem $SourceDir
	foreach ($file in $files) 
	{
		$Directory = $DestinationDir + "" + $file.LastWriteTime.Date.ToString('yyyy') + " " + $file.LastWriteTime.Date.ToString('MM')
		if (!(Test-Path $Directory))
		{
			New-Item $directory -type directory -Verbose
		}
		Move-Item $file.fullname $Directory -Verbose
	}
}
 
fmove -SourceDir "C:\Users\Me\Desktop\IntermediateDestination\" -DestinationDir "C:\Users\Me\Desktop\FinalDestination\"

There is not much going on here. The scripts iterates through all files in the source directory. For each individual file, there is a check to see if a folder exists with the last write year and month, creating it if necessary. And finally, the individual file is moved to that folder.

Once this script finishes, you will have a bunch of folders with files in them corresponding (roughly) to their date. However, please keep in mind that this might not be accurate if the files have been processed by other software.

BTW, Happy Birthday to the two dollar bill, issued on this date in 1976 to correspond with Thomas Jefferson’s birthday.

Organizing a family photo collection using PowerShell, part 1

If you are the only able bodied IT professional in a family, it means that you will be tasked with all sorts of demeaning and inane computer software and hardware questions, recommendations, and maintenance duties. Eventually, if you remain the solo IT person in a family long enough, you will be asked to perform one of the most daunting and thankless chores known to man… Organizing a photo collection.

You may be the only IT person in the family, but everyone else in the family has computers, digital cameras, and cell phones. All of these devices are capable of taking, storing, and more to the point, hiding digital imagery. And all of which have done so with varying degrees of success, which makes the job seem even more challenging.

Well friends, I am here to help. Recently I had to go through this very process with the myriad devices in use by my family. Instead of putting it off and grumbling about it, I decided to think this through and conquer the photo collection once and for all.

They had several different machines that were used to hold pictures, along with some backups of older machines that also had pictures on them. On the surface it seems like you would never be able to untangle the mess, but I thought about it for a few minutes and decided to apply the “divide and conquer” method to this conundrum. At my job, I have gained a newfound appreciation of PowerShell on Windows 10, so I decided to use PowerShell as a key component to my evil plans.

Plan for organizing a photo collection

  1. Bring photos together from all sources into one place
  2. Remove duplicate photos
  3. Organize photos by month and year

Now item #1 above sounds a bit easy at first glance. However, you have to keep in mind that cameras use names such as IMG_2209.JPG as the file names created. As a result, if you have taken a lot of photos with a lot of different cameras, you can get name collisions on files.

So first I needed to do was to get all of the backups and files from the disparate sources into one folder on my Windows 10 computer. Then, I would go through and find all the JPG files in the source location recursively one at a time, check to see if the file name exists in the destination, and if it does, add a number to it until it is unique, then copy the file to the destination. This would of course leave some duplicates in the destination that will be handled later.

Step 1

Here is the PowerShell script that I used to perform this task. (WARNING: Any time you set up any kind of automated file process, make sure that you have backups.)

function fcopy ($SourceDir,$DestinationDir)
{
	Get-ChildItem $SourceDir -Recurse | Where-Object { $_.PSIsContainer -eq $false } | ForEach-Object ($_) {
		$SourceFile = $_.FullName
		$DestinationFile = $DestinationDir + $_
		if (Test-Path $DestinationFile) {
			$i = 0
			while (Test-Path $DestinationFile) {
				$i += 1
				$DestinationFile = $DestinationDir + $_.basename + " " + $i + $_.extension
			}
		}
		Copy-Item -Path $SourceFile -Destination $DestinationFile -Verbose -Force
	}
}
 
fcopy -SourceDir "C:\Users\Me\Desktop\Source\" -DestinationDir "C:\Users\Me\Desktop\IntermediateDestination\"

In the last line of this script, you would fill in your source and destination directory. In my case, I had already pruned all of the files that were not JPG files out of all the source directories. If you do not do that, you would end up with file types you could then delete from the destination.

Step 2

Eventually the PowerShell script will finish, and you will have all your files in one folder. I then used a freeware Windows application that can go into a specified folder and find duplicate files. It then shows you which files it found as duplicates, and you can quickly delete all the unneeded duplicates. You should be able to find something workable with an internet search for duplicate file finder.

And finally, I highly recommend using the PowerShell ISE to work on and run your PowerShell script. It makes things go much smoother and can help you with any kind of questions or issues.

Please make sure to check back for my next installment of organizing a photo collection. I will cover how I massaged this massive file list into a more manageable structure. The folders wlll be organized by month and year that the picture was taken.

BTW, sort of in keeping the theme of today’s post, I hope everyone has a happy World Backup Day. In addition to being April Fool’s Day, tomorrow is also a good candidate for World Restore Day.

Mac Visual Studio Error: Address already in use

I have started to use the Mac version of Visual Studio more and more, and I must say I like it very much. But that does not mean it is not without its sharper edges.

Once in a while, when I am working on .NET web applications, something funky happens and when I try to run the project locally, I get the message:

Error: Address already in use

Here is how to fix this issue without having to go through some kind of insane reboot and/or ritual sacrifice.

First, find the process ID of the offending application in the terminal with this command, where you will replace 3306 with the port number that your local application runs on:

sudo lsof -iTCP -sTCP:LISTEN -P | grep :3306

This should give you the application and process ID (the first two items on the line) of the offender. Then, you enter this command, replacing 1234 with the second item from the data that the lsof command spit out:

kill -9 1234

BTW, Happy Belated 100th Birthday to the Grand Canyon. OK, not the actual canyon, but the National Park, which was designated such 100 years and 1 day ago. My advice to everyone is to stay at the El Tovar and eat breakfast at the restaurant, the sunrise is pretty astounding.

What are the odds?

So when I get into the office this morning, one of my Windows machines has rebooted and is happily waiting for me to log in, which interrupted a long running task that I had it working on when I left yesterday evening.

In my investigation to find out if this machine rebooted due to a power outage or due to a Windows Update, I filtered the system event log and found this entry:

I find it interesting that the computer picked that exact second to stop the event log service.

BTW, a posthumous Happy Birthday to John Belushi, who left us far too soon.

BingDebug

So I update my iOS apps on my iPhone this morning, and what do we have here…

If you fellers out there in Redmond need someone to help you get the reins on this iOS stuff, drop me a line.

BTW, Happy Human Rights Day. Sorry, I don’t feel like coming up with something better after the egg laid by the Steelers yesterday against Oakland.