# Carbon

### Functions/Install-Junction.ps1

 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. function Install-CJunction {     <#     .SYNOPSIS     Creates a junction, or updates an existing junction if its target is different.           .DESCRIPTION     Creates a junction given by -Link which points to the path given by -Target. If Link exists, deletes it and re-creates it if it doesn't point to Target.           Both -Link and -Target parameters accept relative paths for values. Any non-rooted paths are converted to full paths using the current location, i.e. the path returned by Get-Location.       Beginning with Carbon 2.0, returns a System.IO.DirectoryInfo object for the target path, if one is created. Returns a System.IO.DirectoryInfo object for the junction, if it is created and/or updated.       .OUTPUTS     System.IO.DirectoryInfo. To return a DirectoryInfo object for installed junction, use the PassThru switch.           .LINK     New-CJunction       .LINK     Remove-CJunction       .EXAMPLE     Install-CJunction -Link 'C:\Windows\system32Link' -Target 'C:\Windows\system32'           Creates the C:\Windows\system32Link directory, which points to C:\Windows\system32.       .EXAMPLE     Install-CJunction -Link C:\Projects\Foobar -Target 'C:\Foo\bar' -Force       This example demonstrates how to create the target directory if it doesn't exist. After this example runs, the directory C:\Foo\bar and junction C:\Projects\Foobar will be created.     #>     [CmdletBinding(SupportsShouldProcess=$true)] [OutputType([IO.DirectoryInfo])] param( [Parameter(Mandatory=$true)]         [Alias("Junction")]         [string]         # The junction to create/update. Relative paths are converted to absolute paths using the current location.         $Link, [Parameter(Mandatory=$true)]         [string]         # The target of the junction, i.e. where the junction will point to. Relative paths are converted to absolute paths using the curent location.         $Target, [Switch] # Return a DirectoryInfo object for the installed junction. Returns nothing if WhatIf switch is used. This switch is new in Carbon 2.0.$PassThru,         [Switch]         # Create the target directory if it does not exist.         $Force ) Set-StrictMode -Version 'Latest' Use-CallerPreference -Cmdlet$PSCmdlet -Session $ExecutionContext.SessionState$Link = Resolve-CFullPath -Path $Link$Target = Resolve-CFullPath -Path $Target if( Test-Path -LiteralPath$Target -PathType Leaf )     {         Write-Error ('Unable to create junction {0}: target {1} exists and is a file.' -f $Link,$Target)         return     }     if( -not (Test-Path -LiteralPath $Target -PathType Container) ) { if($Force )         {             New-Item -Path $Target -ItemType Directory -Force | Out-String | Write-Verbose } else { Write-Error ('Unable to create junction {0}: target {1} not found. Use the -Force switch to create target paths that don''t exist.' -f$Link,$Target) return } } if( Test-Path -LiteralPath$Link -PathType Container )     {         $junction = Get-Item -LiteralPath$Link -Force         if( -not $junction.IsJunction ) { Write-Error ('Failed to create junction ''{0}'': a directory exists with that path and it is not a junction.' -f$Link)             return         }         if( $junction.TargetPath -eq$Target )         {             return         }         Remove-CJunction -LiteralPath $Link } if($PSCmdlet.ShouldProcess( $Target, ("creating '{0}' junction" -f$Link) ) )     {         $result = New-CJunction -Link$Link -Target $target -Verbose:$false         if( $PassThru ) { return$result         }     } }