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.
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
}
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
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
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
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
}
}