A simple backup script in powershell
This repository has been archived on 2024-09-20. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
Find a file
2021-01-19 16:49:28 +01:00
bin First commit 2021-01-15 12:19:10 +01:00
etc First commit 2021-01-15 12:19:10 +01:00
lib First commit 2021-01-15 12:19:10 +01:00
log First commit 2021-01-15 12:19:10 +01:00
backup.ps1 Add some output messages 2021-01-19 16:49:28 +01:00
README.md Some rework / corrections in README 2021-01-15 12:22:24 +01:00

Powershell Backup Script

This is a simple backup script write in Powershell for Microsoft Windows. It needs 7za and rclone executable into the ./bin directory to work properly.

You must configure it with JSON files, one example is provided in ./etc/example.json.

usage

powershell -File backup.ps1 [-conf ./etc/example.json] [-log ./log/example.log] [-debug]
  • -conf : configuration file (JSON), default ./etc/backup.json
  • log : log file, default $false
  • -debug : verbose output on stdout (not log file)

Configuration example

Here is the example.json file :

{
    "actions" : 
    [
        {
            "name" : "document_backup",
            "source" : "C:\\Users\\people\\document",
            "source_eval" : false,
            "dest" : "\\\\backup_srv\\srv01\\",
            "type" : "compress",
            "options" : {
                "-mx" : 3,
                "-mmt" : 4,
                "-xr@" : "C:\\backup\\etc\\7z\\exclude.txt"
            },
            "hook_postexec" : "<command>",
            "username" : "bkp_example",
            "pass" : "<secure_string>"
        },   
        {
            "name" : "project_copy",
            "source" : "C:\\Users\\people\\project",
            "dest" : "X:\\",
            "type" : "clone",
            "options" : {
                "--exclude" : "*.zip"
            }
        },
        {
            "name" : "database_backup",
            "source" : false,
            "dest" : "X:\\databases",
            "type" : "dump_mssql",
            "options" : {
                "server": "srv_host",
                "instance" : "SQL2016",
                "databases": "mydatabase",
                "compression" : false 
            }
        }
    ]
}

All actions performed by the script are defined by actions [...] object :

  • name : name of the action, it will be use as filename for the .zip output in compress type (see below)
  • source : the source path, can be {{tmpdir}} to give the temporary folder or a powershell expression if source_eval is set to true
  • source_eval : evaluate the powershell expression in source, for example $env:HOMEDATA\Music will be interpreted as C:\Users\name\Music
  • dest : the destination path, can be a network path (like \\<host>\<path> ) can be {{tmpdir}} to give the script temporary folder.
  • type define the action, action is represented by a powershell module file in lib/ directory
  • options : options for the module
  • hook_postexec : Powershell command to execute when current action is terminated
  • username : user name for destination network share (if needed)
  • pass: password for destination network share (if needed)

Modules

This script works with Powershell modules located in lib/ directory. Here is the list of defaults module

clone : Clone a directory

This module Clone a directory from source to dest. It use rclone so you can add rclone command line parameters in options.

compress : Compress files / directory

This module create a compressed file in dest with source. It use 7zip so you can add 7za command line parameters in options.

dump_mssql : Dump MSSQL database(s)

This module backup Microsoft SQL Server databases, for this one, source must be false. Here are json options :

  • server : MSSQL Server, required parameter (localhost doesn't work 😢)
  • instance : Server instance, required parameter
  • compression : activate compression output (zip format - default false)
  • databases : list of databases to be backuped (default all)

You must execute backup script with an user that have the right of backupping MSSQL databases. For now, authentication for databases export is not supported. The user that run the MSSQL daemon must have right to access destination path.

temporary folder

You can use {{tempdir}} in source or destination to specify a temporary directory (formely <script_folder>\tmp). This can be useful, for example, when you want to dump database but use 7zip to compress them :

  • first action dump databases to {{tempdir}}
  • second action compress files in {{tempdir}} to final destination

Password for network share

In this script, network share need a password. password must be created on the machine and tha user account which execute the script with following command

"PassW0rd" |  ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString

Copy-paste the result in your json file into pass (in example, replace <secure_string>).

Log

This backup script log information to your terminal, but it can also log to a file, useful when you execute it in scheduled task for example. Log are in the log/ directory. Script create a logfile per day named with the configuration file basename plus date of execution (eg example.20210112.log)

If a logfile is older that 15 day, it will be move to a compressed file (example.log.archives.<year>.<month>.7z)

disclaimer

Until I'm a Linux/*BSD system administrator, I'm not too familiar with Windows system, in particular with MSSQL command line backup tool. So I could do some misktakes, if i do then you can contact me on the fediverse at @ephase@toot.aquilenet.fr (and if you have some questions, bug reports, suggestions too).

Licence

This script is released under le MIT licence

Copyright © 2021 Yorick Barbanneau

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.