Powershell Join-Path показывает 2 dirs в результате вместо 1 - случайный вывод скрипта / функции - PullRequest
1 голос
/ 08 марта 2019

Я создаю инкрементные структуры каталогов, и по какой-то причине Join-Path показывает 2 dirs. Когда я позже соединяю это с файлом, который отправляю в 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 иметь только один каталог, как и должно быть. Прямо сейчас, я думаю, что это рассматривается как массив, что не правильно.

Я пытался найти похожие проблемы, но ничего подобного не видел.

Обновление

Вот код для 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 каталога, которые являются отдельными строками.

1 Ответ

2 голосов
/ 08 марта 2019

Поскольку T-Me правильно выведен до публикации источника CreateDatedFolder, проблема заключается в том, что функция непреднамеренно выводит 2 объекты , а Join-Path принимает массив родительских путей к каждому соединению с дочерним путем.

В частности, именно вызов New-Item случайно создает дополнительный выходной объект непосредственно перед вашим вызовом return $datedDir.

New-Item выводит экземпляр [System.IO.DirectoryInfo], представляющий вновь созданный каталог, и из-за неявного поведения PowerShell , этот экземпляр становится частью того, что функция выводит тоже - любая команда или выражение внутри скрипта / функции, которая возвращает значение, которое не захвачено или не перенаправлено, становится частью вывода .

Чтобы предотвратить это, подавить вывод:

$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 см. этот ответ .

...