From what I've seen in other questions, using the Shell.Application object in a script leads to problems (because it's always asynchronous, not intended for scripting). I did some searching and found a PowerShell sample that uses the .NET System.IO.Packaging.ZipPackage
class instead:
http://www.winsoft.se/2010/12/easy-archiving-of-files-using-powershell/
If you're using PowerShell v3 (.NET Framework 4 is required), it's apparently even easier (found this function in the comments of this post:
http://stackoverflow.com/questions/1153126/how-to-create-a-zip-archive-with-powershell
function ZipFiles( $zipfilename, $sourcedir )
{
[Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" )
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory( $sourcedir, $zipfilename, $compressionLevel, $false )
}