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 用于使用凭据将文件从本地复制到远程服务器