Below I have put together some of my favorite examples of how to use Join-Path.
One of the primary features it to be able to combine a folder and a filename, without caring if the folder ends with a trailing slash or not. That is the first thing illustrated below (Path1/Path2).
Path3 shows how to incorporate environment variables to get at various system paths, and shows that when you use -Resolve Join-Path can return an array, but in the first examples it returns only a string. The point being that you need to know what is being returned to know how to process it. In Example 4, I show how to loop through the array. The other cool thing about Example 4 is that it can find files in multiple directories (e.g. both “Program Files” and “Program Files X(86)” by using the * mask in the folder’s name.
Example 6 shows that Join-Path works on the Registry as well, i.e. it’s not just limited to disk paths.
Jeffrey Snover, the architect behind PowerShell, also gives a few more Join-Path examples. Some of his examples involve reading a list of files or folders from a file, and prefixing and suffixing them with other folders or filenames.
Code Sample
cls $folder1 = "\\server01\folder01" $folder2 = "\\server01\folder02\" $file = "abc.txt" $path1 = Join-Path $folder1 $file $path2 = Join-Path $folder2 $file Write "path1=$path1" Write "path2=$path2" $path3a = Join-Path -path (get-item env:\windir).value -ChildPath system32 #short way of doing same $path3b = Join-Path -path $env:windir -ChildPath system32 #get "My Documents" of current user $path3c = Join-Path $env:USERPROFILE -ChildPath "My Documents" $path3d = Join-Path $env:USERPROFILE "*" -Resolve Write "path3a=$path3a" Write "path3b=$path3b" Write "path3c=$path3c" Write "path3c.GetType=$($path3c.getType())" #Note it is a string and not an array Write "path3d=$path3d" Write "path3d.GetType=$($path3d.getType())" #Note it is an array of strings # this one is more obtuse = search both Program Files and Program Files x(86) # (and other other c:\Program files* directory) # for any files/folders starting with A. # It returns an array of folders $path4 = join-path -path "c:\Program Files*" A* -resolve Write "`nExample 4" Write "path4=$path4 " Write "path4.GetType=$($path4.getType())" loopCounter = 0 foreach ($folder in $path4) { $loopCounter++ Write-Host "$loopCounter $folder" } Write "`nExample 5 - Find Windows Log Files" $path5 = join-path c:\win* *.log -resolve Write "path5=$path5" Write "`nExample 6 - Registry Path" set-location HKLM: $path6 = join-path System *ControlSet* -resolve Write "path6=$path6" Write "`nExample 7 - xml files in a directory" $path7 = join-path "c:\Program Files (x86)\Notepad++" *.xml -resolve $loopCounter = 0 foreach ($file in $path7) { $loopCounter++ Write-Host "$loopCounter $file" }
Results
path1=\\server01\folder01\abc.txt path2=\\server01\folder02\abc.txt path3a=C:\Windows\system32 path3b=C:\Windows\system32 path3c=C:\Users\NWalters\My Documents path3c.GetType=string path3d=C:\Users\NWalters\.oracle C:\Users\NWalters\.VirtualBox C:\Users\NWalters\Contact s C:\Users\NWalters\Desktop C:\Users\NWalters\Documents C:\Users\NWalters\Downloads C:\U sers\NWalters\EurekaLog C:\Users\NWalters\Favorites C:\Users\NWalters\Links C:\Users\nea l.walters\Music C:\Users\NWalters\Oracle C:\Users\NWalters\Pictures C:\Users\NWalters\Ro aming C:\Users\NWalters\Saved Games C:\Users\NWalters\Searches C:\Users\NWalters\Videos C:\Users\NWalters\VirtualBox VMs path3d.GetType=System.Object[] Example 4 path4=C:\Program Files\Application Verifier C:\Program Files\AuthenTec C:\Program Files (x86)\Adobe C:\Program Files (x86)\AppInsights C:\Program Files (x86)\Application Verifier path4.GetType=System.Object[] 1 C:\Program Files\Application Verifier 2 C:\Program Files\AuthenTec 3 C:\Program Files (x86)\Adobe 4 C:\Program Files (x86)\AppInsights 5 C:\Program Files (x86)\Application Verifier Example 5 - Find Windows Log Files path5=C:\Windows\DirectX.log C:\Windows\DPINST.LOG C:\Windows\DtcInstall.log C:\Windows\ENU-ie90.log C:\Windows\IE11_main.log C:\Windows\IE90-ENU.log C:\Windows\iis7.log C:\Windows\msxml4-KB954430-enu .LOG C:\Windows\msxml4-KB973688-enu.LOG C:\Windows\PFRO.log C:\Windows\setup.log C:\Windows\setupact .log C:\Windows\setuperr.log C:\Windows\TSSysprep.log C:\Windows\WindowsUpdate.log Example 6 - Registry Path path6=HKLM:\System\ControlSet001 HKLM:\System\ControlSet002 HKLM:\System\CurrentControlSet Example 7 - xml files in a directory 1 C:\Program Files (x86)\Notepad++\config.model.xml 2 C:\Program Files (x86)\Notepad++\contextMenu.xml 3 C:\Program Files (x86)\Notepad++\functionList.xml 4 C:\Program Files (x86)\Notepad++\langs.model.xml 5 C:\Program Files (x86)\Notepad++\shortcuts.xml 6 C:\Program Files (x86)\Notepad++\stylers.model.xml