Copy-Item 是否会更改 PowerShell 中目标参数的类型

Does Copy-Item Change the type of Destination Parameter in PowerShell

我希望这是一个愚蠢的错误,我忽略了一些非常简单的事情。我有一个映射网络驱动器并将网络驱动器的内容复制到目的地的功能。最后,我return目的路径供以后再用。但是,目标路径似乎是 returning 不同类型的对象。以下是代码片段:

  function CopyDropFolder {
 param(
    [string] $dropFolder,
    [string] $releaseName,
    [string] $mapDrive
 )

 $stageDirectory= $('c:\temp\' + $releaseName + '-' + (Get-Date -Uformat %Y%m%d-%H%M).ToString() + '\')
 [string]$destinationDirectory = $stageDirectory
 Write-Host 'Mapping Folder ' $dropFolder ' as '  $mapDrive 
 MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive

 $sourceDir = $mapDrive + ':' + '\'  
 Write-Host 'Copying from mapped drive (' $sourceDir ') to ' $stageDirectory
 Copy-Item  $sourceDir -Destination $stageDirectory -Recurse
 Write-Host $destinationDirectory
 return $destinationDirectory  
 }

我调用函数如下:

$stageDirectory = CopyDropFolder -dropFolder $mapFolder -releaseName $releaseName -mapDrive $newDrive
Write-Host 'Staged to ' $stageDirectory 

函数 (Write-Host $destinationDirectory) 的输出是:

c:\temp\mycopieddirectory-20161228-1422\

但是从进行调用的主脚本中,输出是:

Staged to  Z c:\temp\mycopieddirectory-20161228-1422\

似乎 returned 的 stageDirectory 变量以某种方式映射到 Z:,这是函数内映射的新驱动器。

关于如何实际 return 只有上面打印在函数中的路径的任何想法?

PowerShell 具有管道的概念所有东西 你称之为 return 一个值,你没有分配给变量或管道 e。 G。 Out-Null cmdlet 将从函数 得到returned(即使你没有明确使用return 关键字)。因此,您应该将函数中的输出通过管道传输到 Out-Null:

 function CopyDropFolder {
 param(
    [string] $dropFolder,
    [string] $releaseName,
    [string] $mapDrive
 )

 $stageDirectory= $('c:\temp\' + $releaseName + '-' + (Get-Date -Uformat %Y%m%d-%H%M).ToString() + '\')
 [string]$destinationDirectory = $stageDirectory
 Write-Host 'Mapping Folder ' $dropFolder ' as '  $mapDrive 
 MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive | Out-Null

 $sourceDir = $mapDrive + ':' + '\'  
 Write-Host 'Copying from mapped drive (' $sourceDir ') to ' $stageDirectory
 Copy-Item  $sourceDir -Destination $stageDirectory -Recurse | Out-Null
 Write-Host $destinationDirectory
 return $destinationDirectory  
 }

此外,您可以像这样重构您的方法:

function Copy-DropFolder 
 {
     [CmdletBinding()]
     param
     (
        [string] $dropFolder,
        [string] $releaseName,
        [string] $mapDrive
     )

     $stageDirectory = Join-Path 'c:\temp\' ('{0}-{1}' -f $releaseName, (Get-Date -Uformat %Y%m%d-%H%M).ToString())

     MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive | Out-Null
     Copy-Item "$($mapDrive):\"  -Destination $stageDirectory -Recurse | Out-Null

     $stageDirectory
 }

三个主要改进:

  1. 使用批准的动词(Copy-DropyFolder)
  2. 使用加入路径 cmdlet
  3. 删除了 Write-Host 输出(您会发现很多文章为什么不应该使用 Write-Host)。