Powershell script – create folder and zip – backup

You have a folder that you would like to compress with one click and save the result to a specific folder and file name. To have a regular backup and archive, multiple backup files e.g. every night or on each user logon/logoff should be created.

The following simple powershell scripts allow to compress the content of a folder and create a zip file on another location. This can be used e.g. as a simple backup solution.

Prerequisit

The following scripts require Powershell 4/5 for Windows, and Powershell 6 for Mac/Linux/arm user (using Powershell Core).

Simple script – zip file for directory with same target file name

The following powershell script creates a zip file based from $sourceDir and writes the result to $targetFile .

$sourceDir = 'c:\data';
$targetFile = 'c:\backup\data.zip'

## no changes here
Add-Type -A 'System.IO.Compression.FileSystem';
[IO.Compression.ZipFile]::CreateFromDirectory($sourceDir, $targetFile);

Advanced script – zip backup file with target filename including timestamp

The following advanced powershell script creates a zip file based on the content of the folder $sourceDir. The output is written to a file named “data-” and the current timestamp, located in the $targetDir.

$sourceDir = 'c:\data';
$targetDir = 'c:\backup\'
$targetFilenameBase = 'data-';

## no changes here
$date = get-date;
$dateStr = $date.ToString("yyyy-MM-dd_HH-mm");
$targetFile = $targetDir+$targetFilenameBase+$dateStr+'.zip';

Add-Type -A 'System.IO.Compression.FileSystem';
[IO.Compression.ZipFile]::CreateFromDirectory($sourceDir, $targetFile);

How to use the backup powershell script

Just copy the content of one of the solutions in a text editor or the Windows PowerShell Integrated Scripting Environment (ISE) , save the result to a file as e.g. create_backup.ps1 and run it.

Other solutions

Windows 10 provides further backup application and features – with some advanced features, that require addition settings and hardware.

Powershell 7 provides also features to create and decompress zip files with the functions Compress-Archive and Expand-Archive .

FastCGI, PHP, Symfony2 with basic auth not working

Just had a little issue that seams to be common in the web. Got a new server with Plesk 11 (sorry for that) and it took me nearly a day to get it working and setup for capifony deployment of Symfony2 projects.

The typical issues with not correctly set access rights for the root directory of the project (should be 755), manually editing of parameters.ini and other stuff was ok. But what nearly killed me was that my Plesk installation always returned a 503 when running PHP as apache module. FastCGI was default and seemed to be working, so I went with this.

Unfortunately this did not work with the admin interface that was running in a “virtual” subdirectory. It was not possible to login. In the background it is using the default, simple, boring and potentially unsecure basic authentification.

Did you know that there is a problem with FastCGI, Symfony2 and basic authentification? I did not, but know I know. It is fixed in the current release (2.0.16) – which is good. But unfortunately there is a RewriteRule that has to be written inside your web/.htaccess. Check the comment in src/symfony/src/Symfony/Component/HttpFoundation/ServerBag.php:

* php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
* For this workaround to work, add this line to your .htaccess file:
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
*
* A sample .htaccess file:
* RewriteEngine On
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Unfortunately, I tried a different line that was written in the ticket above:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

This did not work, but resulted in 401 results for all requests. Just remove the ,l which means that this .htaccess file will be left.

So if you are running a Symfony2 project with FastCGI, add this line to your web/.htaccess file:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]