Powershell连接路径在结果中显示2个dir而不是1个dir-意外脚本/函数输出

Powershell连接路径在结果中显示2个dir而不是1个dir-意外脚本/函数输出,powershell,return,output,return-value,multiple-return-values,Powershell,Return,Output,Return Value,Multiple Return Values,我正在构建增量目录结构,出于某种原因,连接路径显示了2个目录。当我稍后将其与发送到复制项的文件连接时,会导致错误,如下所示。我在$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_

我正在构建增量目录结构,出于某种原因,
连接路径
显示了2个目录。当我稍后将其与发送到复制项的文件连接时,会导致错误,如下所示。我在
$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 
}
   
我不知道如何让
连接路径
只拥有一个目录,这是应该的。现在,我认为它被视为一个数组,这是不正确的

我尝试搜索相关问题,但没有发现任何类似的问题

更新

以下是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上,但调试器在那里只显示一个dir,而不是一个数组或两个作为独立字符串的dir。

正如在发布
CreateDatedFolder
源代码之前正确推断的那样,问题在于函数无意中输出了两个对象,并且,
Join Path
接受一个父路径数组,该数组指向与子路径的每个连接

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

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

要防止出现这种情况,请抑制输出:

$null = New-Item -ItemType Directory -Path $datedDir -force
中讨论了抑制输出的其他方法,其中还讨论了PowerShell隐式输出行为的设计原理

请注意,您永远不需要在PowerShell中使用
返回
来输出结果
——但您可能需要它来进行流量控制,以便提前退出函数:

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隐式输出行为的详细信息,请参阅。

是否为
CreateDatedFolder
a函数?它有什么作用?在我看来,
CreateDatedFolder
创建了两个存储在
$toLocParentDT1
中的输出,
Join Path
处理这两个输出。@T-me-我将CreateDatedFolder添加到问题的更新中。它将日期附加到给定的文件夹。输出仅正确显示一个文件夹,而不是两个。