web-dev-qa-db-fra.com

Copiez récursivement un ensemble de fichiers d'un répertoire à un autre dans PowerShell

J'essaie de copier récursivement tous les fichiers *.csproj.user De C:\Code\Trunk Vers C:\Code\F2.

Par exemple:

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

Serait copié dans:

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

Ma tentative actuelle est:

Copie-élément C:\Code\Trunk -Filter * .csproj.user -Destination C:\Code\F2 -Recurse -WhatIf

Cependant j'obtiens:

Et si: Exécution de l'opération "Copier le répertoire" sur la cible "Élément: C:\Code\Destination du tronc: C:\Code\F2\Trunk".

Tout d'abord, il veut les mettre tous dans un nouveau dossier appelé F2\Trunk, Ce qui est faux. Deuxièmement, il ne répertorie aucun des fichiers. Il devrait y avoir environ 10 fichiers à copier.

Quelle est la syntaxe correcte pour la commande? Merci!

Mise à jour:

D'accord, cela semble avoir quelque chose à voir avec le fait que C:\Code\F2 Existe déjà. Si j'essaie de copier les fichiers vers une destination qui n'existe pas , cela fonctionne.

Je veux écraser tous les fichiers .csproj.user Existants dans la destination.

22
Mike Christensen

Vu cela avant, et je ne sais pas pourquoi PowerShell ne semble pas faire les choses correctement (à mon humble avis). Ce que je ferais est plus lourd mais ça marche.

$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
}
3
TheMadTechnician

Vous rendez les choses horriblement compliquées, quand c'est vraiment simple:

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

Copiera le Répertoire, créant un répertoire "Trunk" dans F2. Si vous voulez éviter de créer le dossier Trunk de niveau supérieur, vous devez arrêter de dire à PowerShell de le copier:

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

Bien que la réponse la plus votée soit parfaitement valable pour les types de fichiers uniques, si vous devez copier plusieurs types de fichiers, il existe une fonctionnalité plus utile appelée robocopy exactement à cette fin avec une utilisation plus simple

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

J'ai essayé la réponse de Jaykul et cela n'a pas fonctionné pour moi. J'ai dû le changer comme ci-dessous pour le faire fonctionner. J'ai également créé le dossier C:\Code\F2 avant qu'il ne fonctionne.

Get-ChildItem C:\Code\Trunk Recurse -filter *.csproj.user | Copy -Destination C:\Code\F2
2
Stuart Smith

La réponse 1 avait l'air bien, et je suis passé à Move-Item à mes fins. Cependant, j'ai trouvé que dans chaque dossier parcouru récursivement, il ne déplaçait que le premier fichier. Ci-dessous est mon script complet qui comprend également une conversion de fichiers doc en pdf:

$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
    }
}
0
Steve