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