Powershell Join-Path显示结果中的2个dirs而不是1 - 意外脚本/功能输出

问题描述 投票:1回答:1

我正在构建增量目录结构,由于某种原因,Join-Path显示2个目录。当我稍后将其与我要发送到copy-item的文件连接时,会导致错误,如下所示。我在评论中显示了$ to_loc_finalDT1行,我首先看到这两个目录:

Copy-Item : Cannot find path '\\T2\DisasterBackup\Loc_2019-03-08\Privileges\Privileges_HH_Bak.csv \\T2\DisasterBackup\Loc_2019-03-08\Privileges\Privileges_HH_Bak.csv' because it does not exist

所以这是相关的powershell脚本:

$T2 = "\\T2\DisasterBackup\Loc" 
$toLocParentDT2 = CreateDatedFolder $parentDirBaseNameDT2 
$to_loc_finalDT2 = Join-Path -Path $toLocParentDT2 -ChildPath "Privileges" 
#create sub-folder location 
if(-Not (Test-Path $to_loc_finalDT2 )) 
{
   write-output  " Creating folder $to_loc_finalDT2 because it does not exist " 
   New-Item -ItemType directory -Path $to_loc_finalDT2 -force 
}


#second dir save files to
$parentDirBaseNameDT1 = "\\T1\DisasterBackup\Loc" 
$toLocParentDT1 = CreateDatedFolder $parentDirBaseNameDT1 
$to_loc_finalDT1 = Join-Path -Path $toLocParentDT1 -ChildPath "Privileges" #shows 2 dirs here in debugger: \\T2\DisasterBackup\Loc_2019-03-08\Privileges \\T2\DisasterBackup\Loc_2019-03-08\Privileges
#create sub-folder location 
if(-Not (Test-Path $to_loc_finalDT1 )) 
{
   write-output  " Creating folder $to_loc_finalDT1 because it does not exist " 
   New-Item -ItemType directory -Path $to_loc_finalDT1 -force 
}

我不确定如何让Join_path只有一个dir,就像它应该的那样。现在,我认为它被视为一个数组,这是不正确的。

我试着搜索相关问题,但没有看到类似的东西。

更新

这是CreateDatedFolder的代码:

#create dated folder to put backup files in 
function CreateDatedFolder([string]$name){
   $datedDir = ""
   $datedDir = "$name" + "_" + "$((Get-Date).ToString('yyyy-MM-dd'))"
   New-Item -ItemType Directory -Path $datedDir -force
   return $datedDir
}

它的输出在返回时看起来很好。它将日期附加到\ T2 \ DisasterBackup \ Loc,但调试器只在那里显示一个目录,而不是一个数组或2个dirs是单独的字符串。

powershell return output return-value multiple-return-values
1个回答
2
投票

正如T-Me在发布CreateDatedFolder源之前正确推断的那样,问题是函数无意中输出了2个对象,而Join-Path接受了每个与子路径连接的父路径数组。

具体来说,就是在New-Item调用之前,return $datedDir调用意外地创建了一个额外的输出对象。

New-Item输出一个[System.IO.DirectoryInfo]实例,表示新创建的目录,并且由于PowerShell的隐式输出行为,该实例也成为函数输出的一部分 - 脚本/函数内的任何命令或表达式返回未捕获或重定向的值成为输出的一部分。

为了防止这种情况,请抑制输出:

$null = New-Item -ItemType Directory -Path $datedDir -force

请注意,在PowerShell中永远不需要return来输出结果 - 但是您可能需要它来进行流控制,以便过早地退出函数:

return $datedDir 

语法糖是:

$datedDir # Implicitly output the value of $datedDir.
          # While you could also use `Write-Output $datedDir`,
          # that is rarely needed and actually slows things down.
return    # return from the function - flow control only

有关PowerShell的隐式输出行为的更多信息,请参阅this answer

© www.soinside.com 2019 - 2024. All rights reserved.