2014-09-12 8 views
11

Ich versuche, alle *.csproj.user Dateien rekursiv von C:\Code\Trunk zu C:\Code\F2 zu kopieren.Rekursiv kopieren Sie eine Reihe von Dateien von einem Verzeichnis in ein anderes in PowerShell

Zum Beispiel:

C:\Code\Trunk\SomeProject\Blah\Blah.csproj.user

erhalten kopiert würde:

C:\Code\F2\SomeProject\Blah\Blah.csproj.user

Mein aktueller Versuch ist:

Copy-Item C: \-Code \ Trunk -Filter * .csproj.user -Destination C: \-Code \ F2 -Recurse -WhatIf

Allerdings erhalte ich:

Was: Der Vorgang "Copy Directory" für das Ziel „Item: C: \-Code \ Trunk Ziel: C : \ Code \ F2 \ Trunk ".

Zuerst möchte es alle in einen neuen Ordner namens F2\Trunk, der falsch ist. Zweitens listet es keine der Dateien auf. Es sollte ungefähr 10 Dateien geben, die kopiert werden können.

Wie lautet die richtige Syntax für den Befehl? Vielen Dank!

Update:

Okay, scheint es etwas mit der Tatsache zu tun, dass C:\Code\F2 bereits vorhanden ist. Wenn ich versuche, die Dateien zu einem Ziel zu kopieren, das nicht existiert, funktioniert es.

Ich möchte überschreiben alle vorhandenen .csproj.user Dateien im Ziel.

+0

Der Teil über es einen neuen Ordner zu erstellen ist ein Fehler, der [hier] dokumentiert wurde (https://connect.microsoft.com/PowerShell/feedback/details/809855/subfolder-bug-with-command -copy-item-c-ordner-c-ordner2-recurse-wenn-getan-mehrmals. –

Antwort

2

Das vorher gesehen, und ich weiß nicht, warum PowerShell nicht scheinen kann, es richtig zu machen (IMHO). Was ich tun würde, ist umständlicher, aber es funktioniert.

$Source = 'C:\Code\Trunk' 
$Files = '*.csproj.user' 
$Dest = 'C:\Code\F2' 
Get-ChildItem $Source -Filter $Files -Recurse | ForEach{ 
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest 
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null 
    Copy-Item $_.FullName -Destination $Path -Force 
} 
+0

Ich denke, Sie können die gesamte Regex-Sache entfernen, wenn Sie den Parameter '-LiteralPath' für den Befehl 'Copy-Item' verwenden. – bitbonk

0

Antwort 1 sah gut aus, und ich wechselte für meine Zwecke zu Move-Item. Ich fand jedoch, dass es in jedem Ordner rekursiv durchging, es bewegte nur die erste Datei. Im Folgenden meine komplette Skript ist, die auch eine gewisse Umwandlung von doc-Dateien in PDF-Dateien enthält:

$Source = 'C:\Users\sgrody\Desktop\NSPM-Vol1' 
$MoveFiles = '*.PDF' 
$Dest = 'C:\Users\sgrody\Desktop\MedPassPDF' 
$Folders = Get-ChildItem $Source -Directory -Recurse 


ForEach ($Folder in $Folders) 
{ 
    $wdFormatPDF = 17 
    $word = New-Object -ComObject word.application 
    $word.visible = $false 
    $folderpath = "$($Folder.FullName)\*" 
    $fileTypes = "*.docx","*doc" 
    Get-ChildItem -path $folderpath -include $fileTypes | 
    foreach-object 
    { 
    $path = ($_.fullname).substring(0,($_.FullName).lastindexOf(".")) 
    "Converting $path to pdf ..." 
    $doc = $word.documents.open($_.fullname) 
    $doc.saveas([ref] $path, [ref]$wdFormatPDF) 
    $doc.close() 
    } 
    $word.Quit() 
} 

Get-ChildItem $Source -Filter $MoveFiles -Recurse | ForEach{ 
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest 
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null 
    Move-Item $_.FullName -Destination $Path -Force 
    } 
} 
15

Ihr Jungs diese hideously kompliziert machen, wenn es wirklich einfach:

Copy-Item C:\Code\Trunk -Filter *.csproj.user -Destination C:\Code\F2 -Recurse 

Wird das Verzeichnis kopieren, Erstellen eines "Trunk" -Verzeichnisses in F2.Wenn Sie die Top-Level-Trunk Ordner anlegen vermeiden wollen, müssen Sie Powershell aufhören zu sagen, es zu kopieren:

Get-ChildItem C:\Code\Trunk | Copy -Destination C:\Code\F2 -Recurse -filter *.csproj.user 
+0

Der erste Befehl funktionierte, und es wurde kein' Trunk' erzeugt. – CodeMed

+0

Niemand hätte geträumt, dass der erste Weg darin bestand, es zu "sagen", den Ordner zu kopieren, da "copy" ein Alias ​​für "copy-item" ist und "copy" in DOS nicht so funktionierte, wenn ich bin nicht falsch. Daher die Verwirrung und Komplikation, die viele damit hatten. – as9876

1

Während die meisten Stimmen Antwort perfekt gültig für einzelne Dateitypen ist, wenn Sie mehrere Dateien kopieren müssen Typen gibt es eine nützliche Funktionalität robocopy genau zu diesem Zweck mit einfacher Nutzung

robocopy C:\Code\Trunk C:\Code\F2 *.cs *.xaml *.csproj *.appxmanifest /s 
0

ich versuchte Jaykul Antwort und es hat nicht funktioniert für mich angerufen. Ich musste es wie unten ändern, um es zur Arbeit zu bringen. Ich habe auch den Ordner C: \ Code \ F2 erstellt, bevor es funktionierte.

Get-ChildItem C:\Code\Trunk Recurse -filter *.csproj.user | Copy -Destination C:\Code\F2 
Verwandte Themen