Объяснения остаются теми же, что и в предыдущем вопросе, но мы просто добавляем код vbs, чтобы получить правильную дату в требуемом формате.
@echo off
echo >"%temp%\%~n0.vbs" s=DateAdd("d",0,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
if exist "C:\TEMP\zip\source\JEAR_%result%" (
set "mypath=C:\TEMP\zip\source\JEAR_%result%"
) else (
exit
)
if "%mypath:~-1%"=="\" set "mypath=%mypath:~0,-1%"
for %%i in (%mypath%) do set "last=%%~nxi"
CScript zip.vbs %mypath% C:\TEMP\zip\target\%last%.zip
Причина использования
Вы подтвердили, что регулярные выражения являются слишком дорогими?
Стоимость регулярных выражений значительно преувеличена. Для такого простого шаблона производительность будет довольно хорошей, вероятно, незначительно менее хорошей, чем прямой поиск-и-замена на самом деле. Кроме того, имейте Вас, экспериментировал с Compiled
отметить при построении регулярного выражения?
Тем не менее не можете Вы просто использовать самый простой путь, т.е. Replace
?
string varname = "name";
string pattern = "{" + varname + "}";
Console.WriteLine("Hi {name}".Replace(pattern, "Mike"));
Теперь, если у Вас есть Вы замены в словаре, как это:
var replacements = new Dictionary<string, string>();
replacements["name"] = "Mike";
replacements["age"]= "20";
затем Regex становится довольно простым:
Regex regex = new Regex(@"\{(?<key>\w+)\}");
string formattext = "{name} is {age} years old";
string newStr = regex.Replace(formattext,
match=>replacements[match.Groups[1].Captures[0].Value]);
Regex является, конечно, жизнеспособным вариантом, особенно с a MatchEvaluator
:
Regex re = new Regex(@"\{(\w*?)\}", RegexOptions.Compiled); // store this...
string input = "Hi {name}, do you like {food}?";
Dictionary<string, string> vals = new Dictionary<string, string>();
vals.Add("name", "Fred");
vals.Add("food", "milk");
string q = re.Replace(input, delegate(Match match)
{
string key = match.Groups[1].Value;
return vals[key];
});
Скомпилированный regex мог бы добиться цели, особенно если существует много маркеров, которые будут заменены. Если бы существует только горстка они, и производительность является ключевой, я просто нашел бы маркер индексом и заменой с помощью строковых функций. Хотите верьте, хотите нет, это будет быстрее, чем regex.
Попытайтесь использовать StringTemplate. Это намного более мощно, чем это, но это делает безупречное задание.
Как насчет
stringVar = "Hello, {0}. How are you doing?";
arg1 = "John"; // or args[0]
String.Format(stringVar, arg1)
Вы даже можете несколько аргументов, просто увеличьте {x} и добавьте еще один параметр в метод Format (). Не уверен, что разные, но и «строка», и «Строка» имеют этот метод.