PowerShell联接路径显示结果为2个DIR,而不是1-意外脚本/功能输出



我正在构建增量目录结构,由于某种原因,Join-Path显示了2个DIR。当我以后将其与文件一起发送到复制项目时,它会导致错误,如下所示。我在$to_loc_finalDT1行的评论中显示了这两个Dirs:

Copy-Item : Cannot find path '\T2DisasterBackupLoc_2019-03-08PrivilegesPrivileges_HH_Bak.csv \T2DisasterBackupLoc_2019-03-08PrivilegesPrivileges_HH_Bak.csv' because it does not exist

所以这是相关的powershell脚本:

$T2 = "\T2DisasterBackupLoc" 
$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 = "\T1DisasterBackupLoc" 
$toLocParentDT1 = CreateDatedFolder $parentDirBaseNameDT1 
$to_loc_finalDT1 = Join-Path -Path $toLocParentDT1 -ChildPath "Privileges" #shows 2 dirs here in debugger: \T2DisasterBackupLoc_2019-03-08Privileges \T2DisasterBackupLoc_2019-03-08Privileges
#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。现在,我认为它被视为一个数组,这是不正确的。

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

更新

这是创建的Folder的代码:

#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 distrivebackup loc上,但是调试器仅在那里显示一个dir,而不是一个单独的字符串的数组或2个dir。

作为t-me在发布 CreateDatedFolder 源之前正确地推断出来,问题是函数无意间输出 2 对象,并且 Join-Path接受每个与儿童路径连接的父路径的 array

具体来说,在您的return $datedDir调用之前,意外创建了附加输出对象的New-Item调用。

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

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

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

在此答案中讨论了抑制输出的其他方法,该答案还讨论了PowerShell隐式输出行为的 Design Arigation

请注意,您永远不需要 return在powershell中以 output a结果 - 但是您可能需要它来 flow Control,过早退出功能:

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的隐式输出行为的更多信息,请参阅此答案。

相关内容

  • 没有找到相关文章

最新更新