diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index fc7aa8b9a3..6e06686478 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -31,12 +31,11 @@ do './src/tools/msvc/config_default.pl';
 do './src/tools/msvc/config.pl' if (-f 'src/tools/msvc/config.pl');
 
 # These values are defaults that can be overridden by the calling environment
-# (see buildenv.pl processing below).
+# (see buildenv.pl processing below).  We assume that the ones listed here
+# always exist by default.  Other values may optionally be set for bincheck or
+# taptest, see set_command_env() below.
 # c.f. src/Makefile.global.in and configure.ac
-$ENV{GZIP_PROGRAM} ||= 'gzip';
-$ENV{LZ4} ||= 'lz4';
 $ENV{TAR} ||= 'tar';
-$ENV{ZSTD} ||= 'zstd';
 
 # buildenv.pl is for specifying the build environment settings
 # it should contain lines like:
@@ -119,6 +118,41 @@ exit 0;
 
 ########################################################################
 
+# Helper function for set_command_env, to set one environment command.
+sub set_single_env
+{
+	my $envname = shift;
+	my $envdefault  = shift;
+
+	# If a command is defined by the environment, just use it.
+	return if (defined($ENV{$envname}));
+
+	# Nothing is defined, so attempt to assign a default.  The command
+	# may not be in the current environment, hence check if it can be
+	# executed.
+	my $rc = system($envdefault, '--version');
+	if ($rc != 0)
+	{
+		# Execution of the default command failed, so reset its
+		# environment value.
+		$ENV{$envname} = '';
+		return;
+	}
+
+	# Set the environment to the default as it exists.
+	$ENV{$envname} = $envdefault;
+	return;
+}
+
+# Set environment values for various command types.  These can be used
+# in the TAP tests.
+sub set_command_env
+{
+	set_single_env('GZIP_PROGRAM', 'gzip');
+	set_single_env('LZ4', 'lz4');
+	set_single_env('ZSTD', 'zstd');
+}
+
 sub installcheck_internal
 {
 	my ($schedule, @EXTRA_REGRESS_OPTS) = @_;
@@ -276,6 +310,8 @@ sub bincheck
 {
 	InstallTemp();
 
+	set_command_env();
+
 	my $mstat = 0;
 
 	# Find out all the existing TAP tests by looking for t/ directories
@@ -310,6 +346,9 @@ sub taptest
 	push(@args, "$topdir/$dir");
 
 	InstallTemp();
+
+	set_command_env();
+
 	my $status = tap_check(@args);
 	exit $status if $status;
 	return;
