2016-12-28 9 views
2

Надеюсь, что это глупая ошибка, и я пропускаю что-то очень простое. У меня есть функция для сопоставления сетевого диска и копирования содержимого сетевого диска в пункт назначения. В конце концов, я возвращаю путь назначения для повторного использования позже. Однако, похоже, он возвращает тип объекта другого типа для пути назначения. Ниже приведен фрагмент кода:Does Copy-Item Изменение типа целевого параметра в PowerShell

function CopyDropFolder { 
param(
    [string] $dropFolder, 
    [string] $releaseName, 
    [string] $mapDrive 
) 

$stageDirectory= $('c:\temp\' + $releaseName + '-' + (Get-Date -Uformat %Y%m%d-%H%M).ToString() + '\') 
[string]$destinationDirectory = $stageDirectory 
Write-Host 'Mapping Folder ' $dropFolder ' as ' $mapDrive 
MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive 

$sourceDir = $mapDrive + ':' + '\' 
Write-Host 'Copying from mapped drive (' $sourceDir ') to ' $stageDirectory 
Copy-Item $sourceDir -Destination $stageDirectory -Recurse 
Write-Host $destinationDirectory 
return $destinationDirectory 
} 

я вызываю функцию следующим образом:

$stageDirectory = CopyDropFolder -dropFolder $mapFolder -releaseName $releaseName -mapDrive $newDrive 
Write-Host 'Staged to ' $stageDirectory 

Выход с функцией (Write-Host $ destinationDirectory) является:

c:\temp\mycopieddirectory-20161228-1422\ 

Однако из основного сценария, где выполняется вызов, вывод:

Staged to Z c:\temp\mycopieddirectory-20161228-1422\ 

Кажется, что возвращаемая переменная stageDirectory каким-то образом отображается с Z: это новый диск, который отображается в функции.

Любые идеи о том, как фактически вернуть только путь, который напечатан выше внутри функции?

ответ

2

PowerShell имеет концепцию трубопроводов . Все вы вызываете это, возвращаете значение, которое вы не присваиваете переменной или трубе e. г. командлету Out-Null будет возвращен из функции (даже если вы явно не используете ключевое слово return). Таким образом, вы должны перенаправить вывод в ваших функциях Out-Null:

function CopyDropFolder { 
param(
    [string] $dropFolder, 
    [string] $releaseName, 
    [string] $mapDrive 
) 

$stageDirectory= $('c:\temp\' + $releaseName + '-' + (Get-Date -Uformat %Y%m%d-%H%M).ToString() + '\') 
[string]$destinationDirectory = $stageDirectory 
Write-Host 'Mapping Folder ' $dropFolder ' as ' $mapDrive 
MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive | Out-Null 

$sourceDir = $mapDrive + ':' + '\' 
Write-Host 'Copying from mapped drive (' $sourceDir ') to ' $stageDirectory 
Copy-Item $sourceDir -Destination $stageDirectory -Recurse | Out-Null 
Write-Host $destinationDirectory 
return $destinationDirectory 
} 

Кроме того, вы можете реорганизовать свой метод так:

function Copy-DropFolder 
{ 
    [CmdletBinding()] 
    param 
    (
     [string] $dropFolder, 
     [string] $releaseName, 
     [string] $mapDrive 
    ) 

    $stageDirectory = Join-Path 'c:\temp\' ('{0}-{1}' -f $releaseName, (Get-Date -Uformat %Y%m%d-%H%M).ToString()) 

    MountDropFolder -mapfolder $dropFolder -mapDrive $mapDrive | Out-Null 
    Copy-Item "$($mapDrive):\" -Destination $stageDirectory -Recurse | Out-Null 

    $stageDirectory 
} 

Три основных улучшений:

  1. Использования одобренный глагол (Copy-DropyFolder)
  2. Использование Командлет Join-Path
  3. Удаленные выходы Host-Host (вы найдете много статей, почему вы не должны использовать Write-Host).
+0

Это очень интересно знать. Я попробую это и дам вам знать результат. – sohail

+0

Нет, попробовал, но результат такой же – sohail

+0

Кроме того, я смущен относительно того, почему он будет влиять на переменную $ destinationDirectory, когда я использую $ stageDirectory в качестве переменной назначения – sohail