txt tutorial scripts script extension examples example ejemplos crear comandos childitem archivo windows powershell powershell-v2.0

windows - scripts - powershell tutorial



Copie recursivamente un conjunto de archivos de un directorio a otro en PowerShell (5)

Estoy intentando copiar todos los archivos *.csproj.user forma recursiva desde C:/Code/Trunk a C:/Code/F2 .

Por ejemplo:

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

Sería copiado a:

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

Mi intento actual es:

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

Sin embargo me sale:

Qué sucede si: Realizando la operación "Copiar directorio" en el destino "Elemento: C: / Code / Trunk Destino: C: / Code / F2 / Trunk".

Primero, quiere ponerlos a todos en una nueva carpeta llamada F2/Trunk que está mal. En segundo lugar, no enumera ninguno de los archivos. Debe haber alrededor de 10 archivos para ser copiados.

¿Cuál es la sintaxis correcta para el comando? ¡Gracias!

Actualizar:

Bien, parece tener algo que ver con el hecho de que C:/Code/F2 ya existe. Si intento copiar los archivos a un destino que no existe, funciona.

Quiero sobrescribir cualquier archivo .csproj.user existente en el destino.


He visto esto antes, y no sé por qué PowerShell parece que no puede hacerlo bien (IMHO). Lo que haría es más engorroso, pero funciona.

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


Intenté responder a Jaykul y no funcionó para mí. Tuve que cambiarlo como se muestra abajo para que funcione. También creé la carpeta C: / Code / F2 antes de que funcionara.

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


La respuesta 1 se veía bien, y cambié a Move-Item para mis propósitos. Sin embargo, encontré que en cada carpeta que recursivamente pasaba, solo movía el primer archivo. A continuación se encuentra mi script completo que también incluye algunas conversiones de archivos doc a 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 } }


Si bien la respuesta más votada es perfectamente válida para tipos de archivos individuales, si necesita copiar varios tipos de archivos, existe una funcionalidad más útil llamada robocopy exactamente para este propósito con un uso más simple

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


Ustedes están haciendo esto horriblemente complicado, cuando es realmente simple:

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

Copiará el Directorio , creando un directorio "Troncal" en F2. Si desea evitar crear la carpeta Troncal de nivel superior, debe dejar de decirle a PowerShell que la copie:

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