Powershell Join-Path 在结果中显示 2 个目录而不是 1 个目录 - 意外 script/function 输出
Powershell Join-Path showing 2 dirs in result instead of 1 - accidental script/function output
我正在构建增量目录结构,出于某种原因 Join-Path
显示了 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
}
我不确定如何让 Join-Path
只拥有一个目录,就像它应该的那样。现在,我认为它被视为一个数组,这是不正确的。
我尝试搜索相关问题,但没有看到任何类似的内容。
更新
这是 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 个独立字符串的目录。
正如 T-Me 在您发布 CreateDatedFolder
来源之前正确推断的那样,问题是函数 无意中输出了 2 objects,并且 Join-Path
接受一个 array 父路径,每个都与子路径连接。
具体来说,是 New-Item
调用意外创建了一个 额外的 输出对象,就在您的 return $datedDir
调用之前。
New-Item
输出代表新创建目录的 [System.IO.DirectoryInfo]
实例,并且由于 PowerShell 的 隐式 输出行为 ,该实例成为函数输出的一部分 too - 脚本/函数内的任何命令或表达式 returns 未捕获的值或重定向成为输出的一部分.
为了防止这种情况,抑制输出:
$null = New-Item -ItemType Directory -Path $datedDir -force
中讨论了抑制输出的其他方法,其中还讨论了 PowerShell 隐式输出行为的设计原理。
请注意,您永远不需要 return
在 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 的隐式输出 行为的详细信息,请参阅。
我正在构建增量目录结构,出于某种原因 Join-Path
显示了 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
}
我不确定如何让 Join-Path
只拥有一个目录,就像它应该的那样。现在,我认为它被视为一个数组,这是不正确的。
我尝试搜索相关问题,但没有看到任何类似的内容。
更新
这是 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 个独立字符串的目录。
正如 T-Me 在您发布 CreateDatedFolder
来源之前正确推断的那样,问题是函数 无意中输出了 2 objects,并且 Join-Path
接受一个 array 父路径,每个都与子路径连接。
具体来说,是 New-Item
调用意外创建了一个 额外的 输出对象,就在您的 return $datedDir
调用之前。
New-Item
输出代表新创建目录的 [System.IO.DirectoryInfo]
实例,并且由于 PowerShell 的 隐式 输出行为 ,该实例成为函数输出的一部分 too - 脚本/函数内的任何命令或表达式 returns 未捕获的值或重定向成为输出的一部分.
为了防止这种情况,抑制输出:
$null = New-Item -ItemType Directory -Path $datedDir -force
请注意,您永远不需要 return
在 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 的隐式输出 行为的详细信息,请参阅