windelterrorist
Goto Top

Powershell Dateien mit Pfad in ein Ordner kopieren

Hallööchen face-smile

Beschäftige mich gerade mit Powershell...


Ich möchte Dateien mit dem Archivbit = 1 in ein Testordner kopieren...

Mein Problem... Ich gebe den Pfad an, ab dem er die Dateien Kopieren soll, zB path = C:\Users\Admin\Documents" ...
Danach lese ich das Archivbit der jeweiligen files aus und speichere den Dateinamen dieser Files (mit Archivbit = 1) in $files
Nun möchte ich das ganze mit Copy-Item noch kopieren, jedoch fehlt die Ordnerstruktur der jeweiligen Files mit Archivbit = 1 ... (Der Pfad der Dateien mit gesetztem Archivbit wird nicht mitkopiert, die Files werden einfach in den Zielordner geknallt face-sad( ... )


Mein Code:

mkdir D:\test #zielpfad
$path = "C:\Users\Admin\Documents" #sourcepfad
$files = (Get-ChildItem -path "C:\Users\Admin\Documents" -Recurse -File | where {$_.Attributes -contains "Archive"})
$files | foreach {Copy-Item -Path $_.fullname -Destination "D:\test$($_.path)\$($_.name)" -Force}


Mir ist schon klar wo man herumbasteln muss, nur wie könnte man dies lösen, dass zB der Zwischenpfad noch in eine Variable gespeichert wird? ... oder sonst irgendwie...


Cheeeers,
Windelterrorist

Content-Key: 290371

Url: https://administrator.de/contentid/290371

Printed on: April 25, 2024 at 03:04 o'clock

Mitglied: 114757
Solution 114757 Dec 08, 2015 updated at 10:37:30 (UTC)
Goto Top
$target = 'D:\test'  
$source = "C:\Users\Admin\Documents"  
Get-ChildItem $source -Recurse -File | ?{$_.Attributes -band [System.IO.FileAttributes]::Archive} | %{
    $targetpath = $_.Directoryname.replace($source,$target)
    if (!(Test-Path $targetpath)){md $targetpath -Force}
    Copy-Item -Path $_.fullname -Destination $targetpath -Force
}
Hatten wir hier aber schon ein paar mal. Suchfunktion ist dein Freund face-wink

Gruß jodel32
Member: windelterrorist
windelterrorist Dec 08, 2015 at 10:40:01 (UTC)
Goto Top
Hallo jodel32

Vielen Dank für die schnelle Antwort!
Hat prima funktioniert, danke dir! face-smile

Kann ich die Archivbits danach auch zurücksetzen? Ich guck sonst selbst mal im Forum, wurde ja bestimmt schonma erwähnt ;)


Gruss
windelterrorist
Mitglied: 114757
Solution 114757 Dec 08, 2015, updated at Dec 10, 2015 at 11:14:34 (UTC)
Goto Top
Zitat von @windelterrorist:
Kann ich die Archivbits danach auch zurücksetzen? Ich guck sonst selbst mal im Forum, wurde ja bestimmt schonma erwähnt ;)
Einfach mit in die Schleife rein packen
Set-ItemProperty $_.Fullname -Name attributes -Value ($_.Attributes -bxor [System.IO.FileAttributes]::Archive) -Force
Member: windelterrorist
windelterrorist Dec 10, 2015 updated at 12:00:51 (UTC)
Goto Top
Vielen Dank @114757, klappt alles perfekt!

Hätte noch ein Schönheitsproblem... Möchte die ganzen Dateien mit Archivbit = 1 in einen Ordner test_$date im $target kopieren... wo würdest du das einbauen?


$source = "C:\Users\Admin\Documents"
$target = 'D:\test'

$date = Get-Date -Format d.MMMM.yyyy
$destfoldername = md "$target\test_$date"
$destfolderpath = "$target\$destfoldername"


Get-ChildItem $source -Recurse -File | ?{$_.Attributes -band [System.IO.FileAttributes]::Archive} | %{
$targetpath = $_.Directoryname.replace($source,$destfolderpath) #vorher war $destfolderpath einfach $target
if (!(Test-Path $targetpath)){md $targetpath -Force}
Copy-Item -Path $_.fullname -Destination $targetpath -Force
}


Schlussendlich sollten die Dateien also im Ordner E:\test\test_$date gespeichert werden...


Gruss
windelterrorist
Mitglied: 114757
114757 Dec 10, 2015 updated at 12:14:08 (UTC)
Goto Top
Versteh dein Problem nicht, Variablen kannst du doch anpassen ?! Mal ein bißchen das Hirn anstrengen my friend ... sollte man eigentlich erwarten können face-sad
Member: windelterrorist
windelterrorist Dec 10, 2015 updated at 12:25:19 (UTC)
Goto Top
Ups sry, war doch zu einfach hier die Lösung:


$source = "C:\Users\Admin\Documents"
$target = 'D:\test'

$date = Get-Date -Format d.MMMM.yyyy
$destfoldername = md "$target\test_$date"

Get-ChildItem $source -Recurse -File | ?{$_.Attributes -band [System.IO.FileAttributes]::Archive} | %{
$targetpath = $_.Directoryname.replace($source,$destfoldername.FullName) #Einfach .FullName anhängen damit er den neuen Pfad nimmt
if (!(Test-Path $targetpath)){md $targetpath -Force}
Copy-Item -Path $_.fullname -Destination $targetpath -Force

Set-ItemProperty $_.Fullname -Name attributes -Value ($_.Attributes -bxor [System.IO.FileAttributes]::Archive) -Force #Archivbit zurücksetzen
}


Aber nochmals danke für deine Hilfe jodel32, super Forum !!!


Gruss
windelterrorist