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-ID: 290371

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

Ausgedruckt am: 22.11.2024 um 16:11 Uhr

114757
Lösung 114757 08.12.2015 aktualisiert um 11:37:30 Uhr
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
windelterrorist
windelterrorist 08.12.2015 um 11:40:01 Uhr
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
114757
Lösung 114757 08.12.2015, aktualisiert am 10.12.2015 um 12:14:34 Uhr
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
windelterrorist
windelterrorist 10.12.2015 aktualisiert um 13:00:51 Uhr
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
114757
114757 10.12.2015 aktualisiert um 13:14:08 Uhr
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
windelterrorist
windelterrorist 10.12.2015 aktualisiert um 13:25:19 Uhr
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