Best Examples of Join-Path in PowerShell

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
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
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