la création de script PowerShell pour sauvegarder un fichier et ajoutez la date

StackOverflow https://stackoverflow.com/questions/3671657

  •  01-10-2019
  •  | 
  •  

Question

Actuellement, je dispose d'un fichier de traitement par lots d'une ligne pour sauvegarder un fichier. Je lance manuellement quand j'ai besoin de sauvegarder un fichier. La seule chose que je voudrais ajouter est la date actuelle. Voici ce que j'ai:

xcopy / W / Y ACTIVE.DB ACTIVE.DB.BACKUP

le fichier de destination doit être simplement ACTIVE.DB.BACKUP.YYYYMMDD. Comment pourrais-je aller sur la création d'un script qui me permettra de double-cliquez dessus à partir de Windows Explorer et faire le XCOPY arriver?

Était-ce utile?

La solution

Vous pouvez personnaliser votre nom de fichier en intégrant une [datetime]::now formatée dans le nom de fichier dans PowerShell comme ceci:

xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$([datetime]::now.ToString('yyyy-MM-dd'))"

Si la ligne se sent occupé et ingérable, vous pouvez factoriser à plusieurs lignes:

$now = [datetime]::now.ToString('yyyy-MM-dd')
xcopy /W /Y ACTIVE.DB "ACTIVE.DB.BACKUP.$now"

Pour obtenir l'exécution du double-clic, je fais généralement un fichier batch qui exécute la commande PowerShell comme décrit ici:

Mise en place PowerShell script pour l'exécution automatique

Autres conseils

Juste pour vous signaler que vous pouvez faire avec Copy-Item par exemple:.

Set-Location $path
Copy-Item ACTIVE.DB "ACTIVE.DB.$(get-date -f yyyyMMdd)" -Force -Confirm

Si vous allez pour robuste que j'utiliser robocopy.exe.

Je viens de faire un script quotidien / hebdomadaire / mensuel / trimestriel / backup annuel en Powershell ce mois-ci, et espère que cela aide.

Ce scénario de sauvegarde DWMQY est zip un dossier source dans un fichier zip date du nom, puis garder les fermetures éclair de:

  • 7 derniers jours
  • 4 semaines (de chaque vendredi)
  • 6 mois (le dernier vendredi de chaque mois)
  • 4 trimestres (le dernier mois est du quartier)
  • 2 ans (le dernier trimestre est de l'année).

L'exécution comme tâche planifiée sur une base quotidienne, il met les fermetures à glissière dans un dossier cible qui est aussi un dossier local de Microsoft onedrive, de sorte que les fermetures éclair également à distance au serveur onedrive synchronisés. Les fermetures éclair pas à jour (non vendredi par jour ou non la dernière DWMQY) seront déplacés vers un dossier non à distance synchronisés.

Il est à 5 Mars, 2016 aujourd'hui, les fermetures éclair suivantes doivent être dans le dossier cible:

  • 7 jours: 160304-160229-160227
  • 4 semaines: 160304, 160226, 160219,160212
  • 6 mois: 160226, 160129, 161225, 151127, 151025, 150925
  • 4 trimestres: 151225, 150925,150626,150327
  • 2 ans: 151225, 141226

Donc, il y aura 23 fermetures éclair (en fait moins depuis les dups entre DWMQY), nos fichiers sont 250 documents de texte qui est de 0,4 Go après zipper, il est donc 23 * 0,4 = 9,2 Go au total, ce qui est inférieur à onedrive libre 15 quota GB.

Pour les grandes données de base, on peut utiliser 7-zip, qui fournit la taille de la fermeture éclair de la tuberculose maximale de 16 mil. Pour les dossiers de sauvegarde directement au lieu de fermetures éclair, ne l'ont pas essayé. Deviner c'est une procédure transférable de la façon zip actuelle.

# Note: there are following paths:
# 1. source path: path to be backed up. 
# 2. target path: current zips stored at, which is also a remote-sync pair's local path.
# 3. moved-to path: outdated zips to be moved in this non-sync'able location.
# 4. temp path: to copy the source file in to avoid zip.exe failing of compressing them if they are occupied by some other process.
# Function declaration
. C:\Source\zipSaveDated\Functions.ps1 
# <1> Zip data
$sourcePath = '\\remoteMachine1\c$\SourceDocs\*'
$TempStorage = 'C:\Source\TempStorage'
$enddate = (Get-Date).tostring("yyyyMMdd")
$zipFilename = '\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive\' + $enddate + '_CompanyDoc.zip'
Remove-Item ($TempStorage + '\*') -recurse -Force
Copy-Item $sourcePath $TempStorage -recurse -Force

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory($TempStorage, $zipFilename) 

# <2> Move old files
$SourceDir = "\\remoteMachine2\d$\DailyBackupRemote\OneDrive\DailyBackupRemote_OneDrive"
$DestinationDir = "\\remoteMachine2\d$\DailyBackupRemote\bak" # to store files moved out of the working folder (OneDrive)
$KeepDays = 7
$KeepWeeks = 4
$KeepMonths = 6
$KeepQuarters = 4
$KeepYears = 2
# <2.1>: Loop files
$Directory = $DestinationDir
if (!(Test-Path $Directory))
{
    New-Item $directory -type directory -Force
}
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # daily removal will not remove weekly copy, 7 
    If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepDays).date  `
        -and $file.LastWriteTime.DayOfWeek -NotMatch "Friday"  `
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # weekly removal will not remove monthly copy, 4
    If($file.LastWriteTime -lt (Get-Date).adddays(-$KeepWeeks * 7).date  `
        -and (Get-LastFridayOfMonth ($file.LastWriteTime)).Date.ToString("yyyyMMdd") -NotMatch $file.LastWriteTime.Date.ToString("yyyyMMdd")
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # monthly removal will not remove quarterly copy, 6
    If($file.LastWriteTime.Month -lt ((Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepMonths `
        -and $file.LastWriteTime.Month -NotIn 3, 6, 9, 12
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # quarterly removal will not remove yearly copy, 4
    If($file.LastWriteTime.Month -lt ( (Get-Date).Year - $file.LastWriteTime.Year) * 12 + (Get-Date).Month - $KeepQuarters * 3 `
        -and $file.LastWriteTime.Month -NotIn 12
        )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>
$files = get-childitem $SourceDir *.*
foreach ($file in $files) 
{ # L1
    # yearly removal will just go straight ahead. 2
    If($file.LastWriteTime.Year -lt (Get-Date).Year - $KeepYears )
        {
        Move-Item $file.fullname $Directory -force
        }
} # L1 >>


<Functions.ps1>
function Get-TimesResult3 
    {
    Param ([int]$a,[int]$b)
    $c = $a * $b
    Write-Output $c
    }

function Get-Weekday {
    param(
        $Month = $(Get-Date -format 'MM'),
        $Year = $(Get-Date -format 'yyyy'),
        $Days = 1..5
    )
$MaxDays = [System.DateTime]::DaysInMonth($Year, $Month)
1..$MaxDays | ForEach-Object {
        Get-Date -day $_ -Month $Month -Year $Year |
          Where-Object { $Days -contains $_.DayOfWeek }  
    }
}

function Get-LastFridayOfMonth([DateTime] $d) {    
    $lastDay = new-object DateTime($d.Year, $d.Month, [DateTime]::DaysInMonth($d.Year, $d.Month))
    $diff = ([int] [DayOfWeek]::Friday) - ([int] $lastDay.DayOfWeek)

    if ($diff -ge 0) {
        return $lastDay.AddDays(- (7-$diff))
    }
    else {
        return $lastDay.AddDays($diff)
    }    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top