PSDropNew/Copy-Item.ps1
Function Copy-Item { [CmdletBinding(DefaultParameterSetName='Path', SupportsShouldProcess=$true, ConfirmImpact='Medium', SupportsTransactions=$true, HelpUri='http://go.microsoft.com/fwlink/?LinkID=113292')] param( [Parameter(ParameterSetName='Path', Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] [string[]] ${Path}, [Parameter(ParameterSetName='LiteralPath', Mandatory=$true, ValueFromPipelineByPropertyName=$true)] [Alias('PSPath')] [string[]] ${LiteralPath}, [Parameter(Position=1, ValueFromPipelineByPropertyName=$true)] [string] ${Destination}, [switch] ${Container}, [switch] ${Force}, [string] ${Filter}, [string[]] ${Include}, [string[]] ${Exclude}, [switch] ${Recurse}, [switch] ${PassThru}, [Parameter(ValueFromPipelineByPropertyName=$true)] [pscredential] [System.Management.Automation.CredentialAttribute()] ${Credential}) begin { Function Get-PathProvider { (get-psdrive -name ((Force-Resolve-Path($args[0])) | split-path -Qualifier).Replace(":","")).Provider.Name } Function Force-Resolve-Path { <# .SYNOPSIS Calls Resolve-Path but works for files that don't exist. .REMARKS From http://devhawk.net/2010/01/21/fixing-powershells-busted-resolve-path-cmdlet/ #> param ( [string] $FileName ) $FileName = Resolve-Path $FileName -ErrorAction SilentlyContinue ` -ErrorVariable _frperror if (-not($FileName)) { $FileName = $_frperror[0].TargetObject } return $FileName } try { $outBuffer = $null if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) { $PSBoundParameters['OutBuffer'] = 1 } $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Management\Copy-Item', [System.Management.Automation.CommandTypes]::Cmdlet) $scriptCmd = {& $wrappedCmd @PSBoundParameters } # we require these two parameters if ($PSBoundParameters['Path'] -and $PSBoundParameters['Destination']) { $incoming = $PSBoundParameters['Path'] $outgoing = $PSBoundParameters['Destination'] $incomingLocal = $TRUE $incomingDropbox = $TRUE $outgoingLocal = $TRUE $outgoingDropbox = $TRUE # determine the provider of each parameter $incoming | % { $tempProvider = Get-PathProvider $_ if ($tempProvider -ne "FileSystem") { $incomingLocal = $FALSE } if ($tempProvider -ne "Dropbox") { $incomingDropbox = $FALSE } } $outgoing | % { $tempProvider = Get-PathProvider $_ if ($tempProvider -ne "FileSystem") { $outgoingLocal = $FALSE } if ($tempProvider -ne "Dropbox") { $outgoingDropbox = $FALSE } } # invoke a custom command, if appropriate if ($incomingLocal -and $outgoingDropbox) { $scriptCmd = {& Copy-LocalToDropbox (Force-Resolve-Path($incoming)) (Force-Resolve-Path($outgoing)) } } if ($incomingDropbox -and $outgoingLocal) { $scriptCmd = {& Copy-DropboxToLocal (Force-Resolve-Path($incoming)) (Force-Resolve-Path($outgoing)) } } } $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) $steppablePipeline.Begin($PSCmdlet) } catch { throw } } process { try { $steppablePipeline.Process($_) } catch { throw } } end { try { $steppablePipeline.End() } catch { throw } } <# .ForwardHelpTargetName Copy-Item .ForwardHelpCategory Cmdlet #> } |