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

Posted

技术标签:

【中文标题】Copy-Item 是不是更改 PowerShell 中目标参数的类型【英文标题】:Does Copy-Item Change the type of Destination Parameter in PowerShellCopy-Item 是否更改 PowerShell 中目标参数的类型 【发布时间】:2016-12-28 20:38:14 【问题描述】:

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

  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\

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

关于如何在函数中仅返回上面打印的路径的任何想法?

【问题讨论】:

【参考方案1】:

PowerShell 具有管道的概念一切你调用的返回一个值,你没有分配给变量或管道 e。 G。到Out-Null cmdlet 将从函数返回(即使您没有明确使用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
 

三个主要改进:

    使用批准的动词 (Copy-DropyFolder) 使用 Join-Path cmdlet 删除了 Write-Host 输出(您会发现很多文章为什么不应该使用 Write-Host)。

【讨论】:

这很有趣。我会试试这个,让你知道结果。 另外,我很困惑为什么当我使用 $stageDirectory 作为我的目标变量时它会影响变量 $destinationDirectory 输出可能会欺骗你,例如。 G。 MoutDropFolder 可以使用 Write-Host。你能试试我重构的解决方案吗? 我很抱歉。是的,我试过忘记添加 | output-null 到第一条语句。它有效:) 谢谢@Martin 您重构的代码完美运行。那么,输出到控制台和日志文件的最佳实践是什么?我在一些帖子中读到 Write-Host 不一定是邪恶的 :) 因为我们可以在执行时重定向它的输出。

以上是关于Copy-Item 是不是更改 PowerShell 中目标参数的类型的主要内容,如果未能解决你的问题,请参考以下文章

Copy-Item 用于使用凭据将文件从本地复制到远程服务器

powershell PowerShel便利ツール

Powershell Copy-Item 目标不明确

Powershell 3.0:COPY-ITEM 过滤器或包含选项不起作用

Powershell Copy-Item 退出代码 1

如何修复“value null Copy-Item Powershell”错误