use warnings;
 use PostgresNode;
 use TestLib;
+
+use File::Basename;
 use FindBin;
 use Test::More tests => 1;
 
 # get there.
 $node_primary->init(allows_streaming => 1, has_archiving => 1);
 my $perlbin = $^X;
-$perlbin =~ s{\\}{\\\\}g if ($TestLib::windows_os);
+if ($^O eq 'msys')
+{
+   $perlbin = TestLib::perl2host(dirname($^X)) . '\\' . basename($^X);
+}
+$perlbin =~ s!\\!/!g if $TestLib::windows_os;
 my $archivedir_primary = $node_primary->archive_dir;
 $node_primary->append_conf('postgresql.conf', qq(
-archive_command = '$perlbin "$FindBin::RealBin/cp_history_files" "%p" "$archivedir_primary/%f"'
+archive_command = '"$perlbin" "$FindBin::RealBin/cp_history_files" "%p" "$archivedir_primary/%f"'
 wal_keep_segments=8
 ));
+local $ENV{PERL_BADLANG}=0;
 $node_primary->start;
 
 # Take backup from primary
 # WAL segment, this is enough to guarantee that the history file was
 # archived.
 my $archive_wait_query =
-  "SELECT '$walfile_to_be_archived' <= last_archived_wal FROM pg_stat_archiver;";
+  "SELECT coalesce('$walfile_to_be_archived' <= last_archived_wal, false) " .
+  "FROM pg_stat_archiver";
 $node_standby->poll_query_until('postgres', $archive_wait_query)
   or die "Timed out while waiting for WAL segment to be archived";
 my $last_archived_wal_file = $walfile_to_be_archived;
 
 die "wrong number of arguments" if @ARGV != 2;
 my ($source, $target) = @ARGV;
 exit if $source !~ /history/;
+if ($^O eq 'msys')
+{
+    # make a windows path look like an msys path if necessary
+    $source =~ s!^([A-Za-z]):!'/' . lc($1)!e;
+    $source =~ s!\\!/!g;
+}
+
 copy($source, $target) or die "couldn't copy $source to $target: $!";