Powershell: Copia datos incrementales a USB
Hoy os traigo un script de Powershell que nos va a permitir:
- Realizar una copia de %userdata%
- Se realiza sobre una unidad USB
- Permite realizar copias de PST´s
- Sólo realizará copia de los ficheros desde una determinada fecha
- En mi caso genera una estructura concreta en el USB NombreUsuario\Perfil
- Nos deja LOG del proceso
- Se debe lanzar desde el propio USB, para no instalar nada en local
- GITHUB: https://gist.github.com/raulunzue/47d85dc6e91473825cf0f4eef5607142
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
####################################### ## RAUL UNZUE - ELBLOGDENEGU ## 02/12/2020 ## SCRIPT COPIADO INCREMENTAL PERFIL ####################################### #CERRAR OUTLOOK #Bucle que solicita cerrar Outlook hasta que no detecta ningun proceso outlook corriendo #Para que deje copiar PSTs Outlook tiene que estar cerrado Do { Write-Host "" Write-Host "Por favor, es necesario cerrar Outlook antes de ejecutar el script." pause $outlookproc=Get-Process | Where-Object { $_.Name -eq "outlook" } }Until ($outlookproc.count -eq 0) ## SABER RUTA $ruta=pwd ## SABER EL USUARIO $u=C:\windows\system32\whoami.exe ## ELIMINAR DOMINIO $posicion = $u.IndexOf("\") $posicion = $posicion+1 $usuario = $u.substring($posicion, $u.Length - $posicion) ## CARGAMOS ORIGEN Y DESTINO $origen="c:\Users\$usuario" $destino="$ruta$usuario\Perfil" Start-Transcript -Path "$ruta\copia-$usuario.log" ## GENERAMOS RUTA EN EL DISCO USB PARA EL USUARIO New-Item -Path $destino -ItemType Directory -Force ## SABER DIRECTORIOS Y FICHEROS LOCALES MODIFICADOS A PARTIR DE UNA FECHA # DIRECTORIOS #Últimos directorios modificados $dir= Get-ChildItem -Path $origen -Recurse -Directory | Where-Object {$_.LastWriteTime -gt "12/02/2020" -OR $_.LastAccessTime -gt "12/02/2020"} #Contar los directorios $dircount = $dir.fullname.count # FICHEROS #Últimos ficheros modificados $file = Get-ChildItem -Path $origen -Recurse -File | Where-Object {$_.LastWriteTime -gt "12/02/2020" -OR $_.LastAccessTime -gt "12/02/2020"} #Contar los ficheros $filecount = $file.fullname.count ## GENERAR DIRECTORIOS Y COPIAR DATOS for ($i = 0; $i -le $dircount; $i++){ # Extraemos cada directorio del listado $dr=$dir.Item($i).FullName Write-Output "Directorio que se va a generar $dr" # Tratamos el dato $dr > "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ($usuario, "") -replace ("c:", "") -replace ("Users", "") | Set-Content -Path "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ('\\\\\\', "") | Set-Content -Path "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") | ? {$_.trim() -ne "" } | Set-Content -Path "$destino\dr-$usuario-$i.txt" [string]$d=(Get-Content -Path "$destino\dr-$usuario-$i.txt") # Validación que existe $testd= Test-Path -Path $destino\$d # Si no existe generamos la copia if ($testd -eq $False){ # Generamos los directorios Write-Output "Se genera el directorio en la ruta $destino\$d" New-Item -Path $destino\$d -ItemType Directory -Force for ($x = 0; $x -le $filecount; $x++){ # Extraemos la ruta del fichero a copiar [string]$fi=$file.Item($x).FullName [string]$f=$file.Item($x).Name # Validamos que existe el fichero Write-Output "Fichero que podemos copiar $fi" $existe=("$fi" | sls -Pattern "$d\$f" -CaseSensitive -SimpleMatch) # Si la ruta del fichero contiene la que contienen los directorios, se copia el fichero if ($existe -ne $null){ Write-Output "Existe la ruta, se copia fichero $file.Item($x).Name en el directorio $destino\$d" Copy-Item -Path "$fi" -Destination "$destino\$d" -Filter *.txt -Recurse -Force -PassThru } # Sino, no se copia else{ Write-Output "No hay más ficheros que copiar en el directorio $destino\$d" } } } # Si existe no realizamos la copia else{ Write-Output "No existen más directorios que generar" } #BORRAMOS FICHERO TXT DE PRECARGA Remove-Item -Path "$destino\dr-$usuario-$i.txt" } Stop-Transcript |
https://gist.github.com/raulunzue/28e10961288430752d0e09e96e3a4fce
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
####################################### ## RAUL UNZUE ## 02/12/2020 ## SCRIPT COPIADO INCREMENTAL PERFIL ####################################### #CERRAR OUTLOOK #Bucle que solicita cerrar Outlook hasta que no detecta ningun proceso outlook corriendo #Para que deje copiar PSTs Outlook tiene que estar cerrado Do { Write-Host "" Write-Host "Por favor, es necesario cerrar Outlook antes de ejecutar el script." pause $outlookproc=Get-Process | Where-Object { $_.Name -eq "outlook" } }Until ($outlookproc.count -eq 0) ## SABER RUTA $ruta=pwd ## SABER EL USUARIO $u=C:\windows\system32\whoami.exe ## ELIMINAR DOMINIO $posicion = $u.IndexOf("\") $posicion = $posicion+1 $usuario = $u.substring($posicion, $u.Length - $posicion) ## CARGAMOS ORIGEN Y DESTINO $origen="c:\Users\$usuario" $origenM="M:\" $destino="$ruta$usuario\Perfil" $destinoM="$ruta$usuario\M" ## COMIENZA EL LOG Start-Transcript -Path "$ruta$usuario-copia.log" ## GENERAMOS RUTA EN EL DISCO USB PARA EL USUARIO New-Item -Path $destino -ItemType Directory -Force New-Item -Path $destinoM -ItemType Directory -Force ## SABER DIRECTORIOS Y FICHEROS LOCALES/M MODIFICADOS A PARTIR DE UNA FECHA # DIRECTORIOS #Últimos directorios modificados en local $dir= Get-ChildItem -Path $origen -Recurse -Directory | Where-Object {$_.LastWriteTime -gt "12/09/2020" -OR $_.LastAccessTime -gt "12/09/2020"} #Contar los directorios en local $dircount = $dir.fullname.count #Últimos directorios modificados en M $dirM= Get-ChildItem -Path $origenM -Recurse -Directory | Where-Object {$_.LastWriteTime -gt "12/09/2020" -OR $_.LastAccessTime -gt "12/09/2020"} #Contar los directorios en M $dircountM = $dirM.fullname.count # FICHEROS #Últimos ficheros modificados en local $file = Get-ChildItem -Path $origen -Recurse -File | Where-Object {$_.LastWriteTime -gt "12/09/2020" -OR $_.LastAccessTime -gt "12/09/2020"} #Contar los ficheros en local $filecount = $file.fullname.count #Últimos ficheros modificados en M $fileM = Get-ChildItem -Path $origenM -Recurse -File | Where-Object {$_.LastWriteTime -gt "12/09/2020" -OR $_.LastAccessTime -gt "12/09/2020"} #Contar los ficheros en M $filecountM = $fileM.fullname.count #Últimos ficheros modificados en M $fileMraiz = Get-ChildItem -Path $origenM -File | Where-Object {$_.LastWriteTime -gt "12/09/2020" -OR $_.LastAccessTime -gt "12/09/2020"} #Contar los ficheros en M $filecountMraiz = $fileMraiz.fullname.count ## GENERAR DIRECTORIOS Y COPIAR DATOS DISCO LOCAL for ($i = 0; $i -le $dircount; $i++){ # Extraemos cada directorio del listado $dr=$dir.Item($i).FullName Write-Output "Directorio que se va a generar $dr" # Tratamos el dato $dr > "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ($usuario, "") -replace ("c:", "") -replace ("Users", "") | Set-Content -Path "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") -replace ('\\\\\\', "") | Set-Content -Path "$destino\dr-$usuario-$i.txt" (Get-Content -Path "$destino\dr-$usuario-$i.txt") | ? {$_.trim() -ne "" } | Set-Content -Path "$destino\dr-$usuario-$i.txt" [string]$d=(Get-Content -Path "$destino\dr-$usuario-$i.txt") # Validación que existe $testd= Test-Path -Path $destino\$d # Si no existe generamos la copia if ($testd -eq $False){ # Generamos los directorios Write-Output "Se genera el directorio en la ruta $destino\$d" New-Item -Path $destino\$d -ItemType Directory -Force for ($x = 0; $x -le $filecount; $x++){ # Extraemos la ruta del fichero a copiar [string]$fi=$file.Item($x).FullName [string]$f=$file.Item($x).Name # Validamos que existe el fichero Write-Output "Fichero que podemos copiar $fi" $existe=("$fi" | sls -Pattern "$d\$f" -CaseSensitive -SimpleMatch) # Si la ruta del fichero contiene la que contienen los directorios, se copia el fichero if ($existe -ne $null){ Write-Output "Existe la ruta, se copia fichero $file.Item($x).Name en el directorio $destino\$d" Copy-Item -Path "$fi" -Destination "$destino\$d" -Recurse -Force -PassThru } # Sino, no se copia else{ Write-Output "No hay más ficheros que copiar en el directorio $destino\$d" } } } # Si existe no realizamos la copia else{ Write-Output "No existen más directorios que generar" } #BORRAMOS FICHERO TXT DE PRECARGA Remove-Item -Path "$destino\dr-$usuario-$i.txt" } ## GENERAR DIRECTORIOS Y COPIAR DATOS DE M $m= Test-Path M: if ($m -eq $False) { Write-Output "La unidad M no existe" } else { for ($y = 0; $y -le $dircountM; $y++){ # Extraemos cada directorio del listado $drM=$dirM.Item($y).FullName Write-Output "Directorio que se va a generar $drM" # Tratamos el dato $drM > "$destinoM\dr-$usuario-$y.txt" (Get-Content -Path "$destinoM\dr-$usuario-$y.txt") -replace ('M:\\', "") | Set-Content -Path "$destinoM\dr-$usuario-$y.txt" (Get-Content -Path "$destinoM\dr-$usuario-$y.txt") | ? {$_.trim() -ne "" } | Set-Content -Path "$destinoM\dr-$usuario-$y.txt" [string]$dM=(Get-Content -Path "$destinoM\dr-$usuario-$y.txt") # Validación que existe $testdM= Test-Path -Path "$destinoM\$dM" # Si no existe generamos la copia if ($testdM -eq $False){ # Generamos los directorios Write-Output "Se genera el directorio en la ruta $destinoM\$d" New-Item -Path "$destinoM\$dM" -ItemType Directory -Force for ($z = 0; $z -le $filecountM; $z++){ # Extraemos la ruta del fichero a copiar [string]$fiM=$fileM.Item($z).FullName [string]$fM=$fileM.Item($z).Name # Validamos que existe el fichero Write-Output "Fichero que podemos copiar $fiM" $existeM=("$fiM" | sls -Pattern "$dM\$fM" -CaseSensitive -SimpleMatch) # Si la ruta del fichero contiene la que contienen los directorios, se copia el fichero if ($existeM -ne $null){ Write-Output "Existe la ruta, se copia fichero $fileM.Item($z).Name en el directorio $destinoM\$dM" Copy-Item -Path "$fiM" -Destination "$destinoM\$dM" -Recurse -Force -PassThru } # Sino, no se copia else{ Write-Output "No hay más ficheros que copiar en el directorio $destinoM\$dM" } } } # Si existe no realizamos la copia else{ Write-Output "No existen más directorios que generar" } #BORRAMOS FICHERO TXT DE PRECARGA Remove-Item -Path "$destinoM\dr-$usuario-$y.txt" } for ($t = 0; $t -le $filecountMraiz; $t++){ if ($filecountMraiz -gt 1){ #Copiar cada fichero. [string]$fiMraiz=$fileMraiz.Item($t).FullName #Aqui se copia Copy-Item -Path "$fiMraiz" -Destination "$destinoM" -Force -PassThru } else{ Copy-Item -Path $fileMraiz.Fullname -Destination "$destinoM" -Force -PassThru } } } ## PARA EL LOG Stop-Transcript |
Espero os parezca interesante…
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?