2017-11-08 16 views
0

Ich versuche, Dateien aus einem Quellordner in einen Zielordner zu kopieren und die Dateien im Prozess umzubenennen.Powershell Kopieren und Umbenennen von Dateien

$Source = "C:\Source" 

$File01 = Get-ChildItem $Source | Where-Object {$_.name -like "File*"} 

$Destination = "\\Server01\Destination" 

Copy-Item "$Source\$File01" "$Destination\File01.test" -Force - 
Confirm:$False -ErrorAction silentlyContinue 
if(-not $?) {write-warning "Copy Failed"} 
else {write-host "Successfully moved $Source\$File01 to 
$Destination\File01.test"} 

Das Problem ist, dass seit Get-ChildItem keine Fehlermeldung wird ausgelöst, wenn die Datei nicht gefunden wird, sondern gibt Ihnen nur ein leeren, habe ich am Ende mit einem Ordner File01.test in Ziel aufgerufen, wenn keine Datei namens File* existiert in $Source.

Wenn es existiert, führt der Kopiervorgang gut aus. Aber ich möchte nicht, dass ein Ordner erstellt wird, wenn keine übereinstimmenden Dateien in $Source vorhanden sind, sondern nur eine Fehlermeldung, die in einer Protokolldatei protokolliert wird, und keine Dateioperation stattfindet.

Antwort

0

Sie können eine "if" -Anweisung hinzufügen, um sicherzustellen, dass der Code zum Kopieren der Dateien nur ausgeführt wird, wenn die Datei existiert.

$Source = "C:\Source" 
$Destination = "\\Server01\Destination" 
$File01 = Get-ChildItem $Source | Where-Object {$_.name -like "File*"} 
if ($File01) { 
    Copy-Item "$Source\$File01" "$Destination\File01.test" -Force -Confirm:$False -ErrorAction silentlyContinue 
    if(-not $?) {write-warning "Copy Failed"} 
    else {write-host "Successfully moved $Source\$File01 to 
    $Destination\File01.test"} 
} else { 
    Write-Output "File did not exist in $source" | Out-File log.log 
} 

In der "if" Block, wird es prüfen, ob $ FILE01 etwas in ihm hat, und wenn ja, dann wird es den nachfolgenden Code ausführen. Wenn der vorherige Code nicht ausgeführt wurde, sendet er im Block "else" die Ausgabe an die Protokolldatei "log.log".

0

Dies sollte nicht wichtig sein, was der Dateiname ist, aber es wird nicht für Dateien berücksichtigt, die bereits im Ziel vorhanden sind. Wenn also File01.txt bereits vorhanden ist und Sie versuchen, File01.txt erneut zu kopieren, werden Sie Probleme haben.

param 
(
    $Source = "C:\Source", 
    $Destination = "\\Server01\Destination", 
    $Filter = "File*" 
) 

$Files = ` 
    Get-ChildItem -Path $Source ` 
    | Where-Object -Property Name -Like -Value $Filter 

for ($i=0;$i -lt $Files.Count;$i++) 
{ 
    $NewName = '{0}{1:D2}{3}' -f $Files[$i].BaseName,$i,$Files[$i].Extension 
    $NewPath = Join-Path -Path $Destination -ChildPath $NewName 
    try 
    { 
     Write-Host "Moving file from '$($Files[$i].FullName)' to '$NewPath'" 
     Copy-Item -Path $Files[$i] -Destination 
    } 
    catch 
    { 
     throw "Error moving file from '$($Files[$i].FullName)' to '$NewPath'" 
    } 
} 
Verwandte Themen