2016-12-28 1 views
2

Ich hoffe, dass dies ein dummer Fehler ist und ich etwas wirklich einfaches übersehe. Ich habe eine Funktion, um ein Netzlaufwerk zuzuordnen und den Inhalt des Netzlaufwerks zu einem Ziel zu kopieren. Am Ende gebe ich den Zielpfad zur späteren Wiederverwendung zurück. Es scheint jedoch verschiedene Objekttypen für den Zielpfad zurückzugeben. Es folgt der Code-Schnipsel:Kopiert-Item Ändere den Typ des Zielparameters in 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 
} 

ich die Funktion aufrufen wie folgt:

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

Die Ausgabe von mit der Funktion (Write-Host $ destinationDirectory) ist:

c:\temp\mycopieddirectory-20161228-1422\ 

jedoch Aus dem Hauptskript, in dem der Aufruf erfolgt, lautet die Ausgabe:

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

Es scheint, als wäre die Variable stageDirectory, die zurückgegeben wird, irgendwie mit Z verknüpft: welches das neue Laufwerk ist, das in der Funktion zugeordnet ist.

Irgendwelche Ideen, wie man tatsächlich nur den Pfad zurückgibt, der oben in der Funktion gedruckt wird?

Antwort

2

PowerShell hat das Konzept von Pipelines. Alles Sie rufen, die einen Wert zurückgeben, die Sie nicht einer Variablen oder Pipe zuweisen e. G. Das Cmdlet Out-Null wird von der Funktion zurückgegeben (auch wenn Sie das Schlüsselwort return nicht explizit verwenden). So sollten Sie die Ausgabe mittels Pipelining in Ihrer Funktionen 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 
} 

Auch könnten Sie Ihre Methode wie folgt Refactoring:

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 
} 

Drei wesentliche Verbesserungen:

  1. Verwendung genehmigtes Verb (Copy-DropyFolder)
  2. Verwendung der Join-Path Cmdlet
  3. Entfernte Write-Host-Ausgaben (Sie finden zahlreiche Artikel, warum Sie Write-Host nicht verwenden sollten).
+0

Das ist sehr interessant zu wissen. Ich werde das versuchen und Ihnen das Ergebnis mitteilen. – sohail

+0

Nein, versuchte oben, aber das Ergebnis ist das gleiche – sohail

+0

Auch ich bin verwirrt, warum würde es die Variable $ Zielverzeichnis auswirken, wenn ich $ stageDirectory als meine Zielvariable verwenden – sohail

Verwandte Themen