diff --git a/Duplicati/Library/Utility/Utility.cs b/Duplicati/Library/Utility/Utility.cs
index 30dee2edf..16f8db8b9 100644
--- a/Duplicati/Library/Utility/Utility.cs
+++ b/Duplicati/Library/Utility/Utility.cs
@@ -906,13 +906,40 @@ namespace Duplicati.Library.Utility
///
/// Expands environment variables, including the tilde character
///
- /// The environment variables.
+ /// The expanded string.
/// The string to expand.
public static string ExpandEnvironmentVariables(string str)
{
return Environment.ExpandEnvironmentVariables(str.Replace("~", HOME_PATH));
}
+ ///
+ /// Regexp for matching environment variables on Windows (%VAR%)
+ ///
+ private static readonly Regex ENVIRONMENT_VARIABLE_MATCHER_WINDOWS = new Regex(@"\%(?\w+)\%");
+
+ ///
+ /// Regexp for matching environment variables on Linux ($VAR or ${VAR})
+ ///
+ private static readonly Regex ENVIRONMENT_VARIABLE_MATCHER_LINUX = new Regex(@"\$(?\w+)|(\{(?[^\}]+)\})");
+
+ ///
+ /// Expands environment variables, including the tilde character, in a RegExp safe format
+ ///
+ /// The expanded string.
+ /// The string to expand.
+ public static string ExpandEnvironmentVariablesRegexp(string str)
+ {
+ return
+
+ // TODO: Should we switch to using the native format, instead of following the Windows scheme?
+ //IsClientLinux ? ENVIRONMENT_VARIABLE_MATCHER_LINUX : ENVIRONMENT_VARIABLE_MATCHER_WINDOWS
+
+ ENVIRONMENT_VARIABLE_MATCHER_WINDOWS
+ .Replace(str.Replace("~", Regex.Escape(HOME_PATH)), (m) =>
+ Regex.Escape(Environment.GetEnvironmentVariable(m.Groups["name"].Value)));
+ }
+
///
/// Checks that a hostname is valid
///
diff --git a/Duplicati/Server/Runner.cs b/Duplicati/Server/Runner.cs
index e5633da09..281bc4610 100644
--- a/Duplicati/Server/Runner.cs
+++ b/Duplicati/Server/Runner.cs
@@ -654,7 +654,7 @@ namespace Duplicati.Server
return options;
}
-
+
private static Duplicati.Library.Utility.IFilter ApplyFilter(Duplicati.Server.Serialization.Interface.IBackup backup, DuplicatiOperation mode, Duplicati.Library.Utility.IFilter filter)
{
var f2 = backup.Filters;
@@ -662,7 +662,10 @@ namespace Duplicati.Server
{
var nf =
(from n in f2
- let exp = Library.Utility.Utility.ExpandEnvironmentVariables(n.Expression)
+ let exp =
+ n.Expression.StartsWith("[") && n.Expression.EndsWith("]")
+ ? Library.Utility.Utility.ExpandEnvironmentVariablesRegexp(n.Expression)
+ : Library.Utility.Utility.ExpandEnvironmentVariables(n.Expression)
orderby n.Order
select (Duplicati.Library.Utility.IFilter)(new Duplicati.Library.Utility.FilterExpression(exp, n.Include)))
.Aggregate((a, b) => Duplicati.Library.Utility.FilterExpression.Combine(a, b));