Commit 8d42e5c0d05ca724d43eb307f7f829993f986778
1 parent
71ae70b0
v1.23.0
Showing
3 changed files
with
99 additions
and
48 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -251,7 +251,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -251,7 +251,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
251 | foreach (var s in sqld.Xml_SQLScriptList) | 251 | foreach (var s in sqld.Xml_SQLScriptList) |
252 | { | 252 | { |
253 | ColorConsole.Write(s.Key, ConsoleColor.Yellow, bracket: "[]",suffix:" ",prefix: " "); | 253 | ColorConsole.Write(s.Key, ConsoleColor.Yellow, bracket: "[]",suffix:" ",prefix: " "); |
254 | - ColorConsole.Write($"{s.Description} ({s.Name})", ConsoleColor.Yellow, prefix: "Script:"); | 254 | + var fromfile = string.IsNullOrWhiteSpace(s.FilePath) ? "": $",from:{s.FilePath}"; |
255 | + ColorConsole.Write($"{s.Description} ({s.Name}{fromfile})", ConsoleColor.Yellow, prefix: "Script:"); | ||
255 | ColorConsole.WriteLine(); | 256 | ColorConsole.WriteLine(); |
256 | vlist.Add(s.Key); | 257 | vlist.Add(s.Key); |
257 | } | 258 | } |
@@ -260,9 +261,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -260,9 +261,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
260 | if (scriptkey.ToUpper() == "EX") { return o; } | 261 | if (scriptkey.ToUpper() == "EX") { return o; } |
261 | SQLDataBase.SQLScript ss = sqld.Xml_SQLScriptList.FirstOrDefault(s=>s.Key==scriptkey); | 262 | SQLDataBase.SQLScript ss = sqld.Xml_SQLScriptList.FirstOrDefault(s=>s.Key==scriptkey); |
262 | if (!Tools.ResolveArguments(ss.ArgumentParameters, ss.ScriptText,out string ssScriptText)) { return o; } | 263 | if (!Tools.ResolveArguments(ss.ArgumentParameters, ss.ScriptText,out string ssScriptText)) { return o; } |
263 | - ColorConsole.WriteLine(ssScriptText); | ||
264 | - //SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, ss.CommandTimeout, null); | ||
265 | - ColorConsole.WriteLine($"Script executed. Name:{sqld.DBName}, script name: {ss.Name}", ConsoleColor.Green); | 264 | + if (ss.ScriptText == null) |
265 | + { | ||
266 | + ColorConsole.WriteLine($"Nothing to execute!. Check script definition entry!", ConsoleColor.Red); | ||
267 | + } | ||
268 | + else | ||
269 | + { | ||
270 | + ColorConsole.WriteLine(ssScriptText); | ||
271 | + var confirm = ColorConsole.ReadLine("Enter CONFIRM to start! [EX]=exit.", ConsoleColor.Yellow, prefix:" ", suffix: " --> ", validitylist: new List<string>() {"CONFIRM"}); | ||
272 | + if (confirm == "CONFIRM") | ||
273 | + { | ||
274 | + SQLDataBaseManagerCore.ExecuteSQLScript(sqld.SQLCS, ssScriptText, ss.CommandTimeout, null); | ||
275 | + ColorConsole.WriteLine($"Script executed. Name:{sqld.DBName}, script name: {ss.Name}", ConsoleColor.Green); | ||
276 | + } | ||
277 | + else {ColorConsole.WriteLine($"Script was NOT executed!", ConsoleColor.Red);} | ||
278 | + } | ||
266 | } | 279 | } |
267 | } | 280 | } |
268 | catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } | 281 | catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); } |
@@ -361,15 +374,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -361,15 +374,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
361 | private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false, Menu.SelectionMode selectionmode = Menu.SelectionMode.Multi) | 374 | private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false, Menu.SelectionMode selectionmode = Menu.SelectionMode.Multi) |
362 | { | 375 | { |
363 | if (config == null) { config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); } | 376 | if (config == null) { config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); } |
364 | - List<SQLDataBase> schtskdefList = config.GetDefinitionList(); | 377 | + List<SQLDataBase> defList = config.GetDefinitionList(); |
365 | var menufct = new Menu("SQL Databases", prompt) | 378 | var menufct = new Menu("SQL Databases", prompt) |
366 | .SetMenuItemDisplayer(DisplayDataBaseInfo) | 379 | .SetMenuItemDisplayer(DisplayDataBaseInfo) |
367 | .SetSelectionMode(selectionmode); | 380 | .SetSelectionMode(selectionmode); |
368 | menufct.ClearMenuItemList(); | 381 | menufct.ClearMenuItemList(); |
369 | - foreach (var schtskdef in schtskdefList) | 382 | + foreach (var def in defList) |
370 | { | 383 | { |
371 | - var st = SQLDataBaseManagerCore.CollectDataBaseInfo(schtskdef); | ||
372 | - menufct.AddMenuItem(new Menu.Item(schtskdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st))); | 384 | + var st = SQLDataBaseManagerCore.CollectDataBaseInfo(def); |
385 | + menufct.AddMenuItem(new Menu.Item(def.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st))); | ||
373 | } | 386 | } |
374 | if (!silent) { menufct.DisplayItems(1); } | 387 | if (!silent) { menufct.DisplayItems(1); } |
375 | return menufct; | 388 | return menufct; |
@@ -406,7 +419,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -406,7 +419,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
406 | } | 419 | } |
407 | else if (lineix == 3) | 420 | else if (lineix == 3) |
408 | { | 421 | { |
409 | - var phypath = SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS); | 422 | + var phypath = (SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS))??"ERR"; |
410 | ColorConsole.Write($"{phypath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); | 423 | ColorConsole.Write($"{phypath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " "); |
411 | ColorConsole.WriteLine(" "); | 424 | ColorConsole.WriteLine(" "); |
412 | return " "; | 425 | return " "; |
@@ -440,11 +453,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -440,11 +453,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
440 | #region public CollectDataBaseInfo | 453 | #region public CollectDataBaseInfo |
441 | public static SQLDataBase CollectDataBaseInfo(SQLDataBase sqld) | 454 | public static SQLDataBase CollectDataBaseInfo(SQLDataBase sqld) |
442 | { | 455 | { |
443 | - sqld.Status = GetStatus(sqld.SQLCS); | ||
444 | - sqld.PhysicalFilesDirectoryPath = GetPhysicalFilesLocation(sqld.SQLCS); | ||
445 | - sqld.DBName = GetDBName(sqld.SQLCS); | ||
446 | - sqld.DataSource = GetDataSource(sqld.SQLCS); | ||
447 | - sqld.SizeString = GetSize(sqld.SQLCS); | 456 | + try |
457 | + { | ||
458 | + sqld.Status = GetStatus(sqld.SQLCS); | ||
459 | + sqld.PhysicalFilesDirectoryPath = (GetPhysicalFilesLocation(sqld.SQLCS))??""; | ||
460 | + sqld.DBName = GetDBName(sqld.SQLCS); | ||
461 | + sqld.DataSource = GetDataSource(sqld.SQLCS); | ||
462 | + sqld.SizeString = GetSize(sqld.SQLCS); | ||
463 | + } | ||
464 | + catch | ||
465 | + { | ||
466 | + sqld.Status = SQLDBStatus.NoAccess; | ||
467 | + sqld.PhysicalFilesDirectoryPath = ""; | ||
468 | + sqld.DBName = GetDBName(sqld.SQLCS); | ||
469 | + sqld.DataSource = GetDataSource(sqld.SQLCS); | ||
470 | + sqld.SizeString = ""; | ||
471 | + } | ||
448 | return sqld; | 472 | return sqld; |
449 | } | 473 | } |
450 | #endregion public CollectDataBaseInfo | 474 | #endregion public CollectDataBaseInfo |
@@ -661,7 +685,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -661,7 +685,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
661 | public enum SQLDBStatus { NoAccess, OK, } | 685 | public enum SQLDBStatus { NoAccess, OK, } |
662 | public static SQLDBStatus GetStatus(string cs) | 686 | public static SQLDBStatus GetStatus(string cs) |
663 | { | 687 | { |
664 | - try { var s = GetPhysicalFilesLocation(cs); if (s == null) { throw new Exception(); }; return SQLDBStatus.OK; } catch { return SQLDBStatus.NoAccess; } | 688 | + try |
689 | + { | ||
690 | + var s = GetPhysicalFilesLocation(cs); | ||
691 | + if (s == null) { throw new Exception(); }; | ||
692 | + return SQLDBStatus.OK; | ||
693 | + } | ||
694 | + catch { return SQLDBStatus.NoAccess; } | ||
665 | } | 695 | } |
666 | public static Server SQLServerConnect(string sqlconnectionstring) | 696 | public static Server SQLServerConnect(string sqlconnectionstring) |
667 | { | 697 | { |
@@ -693,26 +723,30 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -693,26 +723,30 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
693 | /// <returns></returns> | 723 | /// <returns></returns> |
694 | public static string GetSize(string sqlconnectionstring) | 724 | public static string GetSize(string sqlconnectionstring) |
695 | { | 725 | { |
696 | - var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
697 | - var dbname = GetDBName(sqlconnectionstring); | 726 | + try |
727 | + { | ||
728 | + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring); | ||
729 | + var dbname = GetDBName(sqlconnectionstring); | ||
698 | 730 | ||
699 | - var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand ("sp_spaceused", sqlc); | ||
700 | - getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
701 | - sqlc.Open(); | ||
702 | - var reader = getsizecmd.ExecuteReader(); | 731 | + var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand("sp_spaceused", sqlc); |
732 | + getsizecmd.CommandType = System.Data.CommandType.StoredProcedure; | ||
733 | + sqlc.Open(); | ||
734 | + var reader = getsizecmd.ExecuteReader(); | ||
703 | 735 | ||
704 | - if (reader.HasRows) | ||
705 | - { | ||
706 | - while (reader.Read()) | 736 | + if (reader.HasRows) |
707 | { | 737 | { |
708 | - var dbn = reader["database_name"]; | ||
709 | - var dbs = reader["database_size"]; | ||
710 | - if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); }; | 738 | + while (reader.Read()) |
739 | + { | ||
740 | + var dbn = reader["database_name"]; | ||
741 | + var dbs = reader["database_size"]; | ||
742 | + if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); }; | ||
743 | + } | ||
711 | } | 744 | } |
745 | + sqlc.Close(); | ||
746 | + sqlc.Dispose(); | ||
747 | + return "N/A"; | ||
712 | } | 748 | } |
713 | - sqlc.Close(); | ||
714 | - sqlc.Dispose(); | ||
715 | - return "N/A"; | 749 | + catch { return "ERR"; } |
716 | } | 750 | } |
717 | #endregion GetSize | 751 | #endregion GetSize |
718 | 752 | ||
@@ -724,18 +758,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -724,18 +758,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
724 | /// <returns>the path, or null, if any error occurs</returns> | 758 | /// <returns>the path, or null, if any error occurs</returns> |
725 | public static string GetPhysicalFilesLocation(string sqlconnectionstring) | 759 | public static string GetPhysicalFilesLocation(string sqlconnectionstring) |
726 | { | 760 | { |
727 | - int commandtimeout = 5000; | ||
728 | - string scripttext = ""; | ||
729 | - scripttext += " DECLARE @physicalpath varchar(1000) = NULL;"; | ||
730 | - scripttext += " SELECT @physicalpath = f.physical_name"; | ||
731 | - scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id"; | ||
732 | - scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';"; | ||
733 | - scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;"; | ||
734 | - var vars = new Dictionary<string, string>(); | ||
735 | - vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring)); | ||
736 | - vars.Add(nameof(DBSubstitutionName.DATASOURCE), ""); | ||
737 | - var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars); | ||
738 | - if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; }; | 761 | + try |
762 | + { | ||
763 | + int commandtimeout = 5000; | ||
764 | + string scripttext = ""; | ||
765 | + scripttext += " DECLARE @physicalpath varchar(1000) = NULL;"; | ||
766 | + scripttext += " SELECT @physicalpath = f.physical_name"; | ||
767 | + scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id"; | ||
768 | + scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';"; | ||
769 | + scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;"; | ||
770 | + var vars = new Dictionary<string, string>(); | ||
771 | + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring)); | ||
772 | + vars.Add(nameof(DBSubstitutionName.DATASOURCE), ""); | ||
773 | + var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars); | ||
774 | + if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; }; | ||
775 | + } | ||
776 | + catch { return null; } | ||
739 | } | 777 | } |
740 | #endregion GetPhysicalFilesLocation | 778 | #endregion GetPhysicalFilesLocation |
741 | #region DBSubstitution | 779 | #region DBSubstitution |
@@ -1295,6 +1333,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -1295,6 +1333,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
1295 | public static class Attributes | 1333 | public static class Attributes |
1296 | { | 1334 | { |
1297 | public static class Name { public static class Values { public const string DEFAULT = ""; } } | 1335 | public static class Name { public static class Values { public const string DEFAULT = ""; } } |
1336 | + public static class File { public static class Values { public const string DEFAULT = ""; } } | ||
1298 | public static class Description { public static class Values { public const string DEFAULT = ""; } } | 1337 | public static class Description { public static class Values { public const string DEFAULT = ""; } } |
1299 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } | 1338 | public static class ScriptCommandTimeout { public static class Values { public const int DEFAULT = 10000; } } |
1300 | public static class Parameters { public static class Values { public const string DEFAULT = ""; } } | 1339 | public static class Parameters { public static class Values { public const string DEFAULT = ""; } } |
@@ -1309,6 +1348,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -1309,6 +1348,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
1309 | { | 1348 | { |
1310 | public string Key = ""; | 1349 | public string Key = ""; |
1311 | public string Name = ""; | 1350 | public string Name = ""; |
1351 | + public string FilePath = ""; | ||
1312 | public string Description = ""; | 1352 | public string Description = ""; |
1313 | public string ScriptText = ""; | 1353 | public string ScriptText = ""; |
1314 | public int CommandTimeout = 10000; | 1354 | public int CommandTimeout = 10000; |
@@ -1322,10 +1362,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | @@ -1322,10 +1362,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS | ||
1322 | 1362 | ||
1323 | Key = $"S{index}"; | 1363 | Key = $"S{index}"; |
1324 | Name = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name.Values.DEFAULT); | 1364 | Name = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Name.Values.DEFAULT); |
1365 | + FilePath = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.File), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.File.Values.DEFAULT); | ||
1325 | Description= GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description.Values.DEFAULT); | 1366 | Description= GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description), sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Attributes.Description.Values.DEFAULT); |
1326 | Tools.ResolveArguments(ArgumentParameters, this.Name, out this.Name, interactive: false); | 1367 | Tools.ResolveArguments(ArgumentParameters, this.Name, out this.Name, interactive: false); |
1327 | Tools.ResolveArguments(ArgumentParameters, this.Description, out this.Description, interactive: false); | 1368 | Tools.ResolveArguments(ArgumentParameters, this.Description, out this.Description, interactive: false); |
1328 | - ScriptText = GetValue(sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Values.DEFAULT); | 1369 | + if (string.IsNullOrWhiteSpace(this.FilePath)) |
1370 | + { | ||
1371 | + ScriptText = GetValue(sqlscriptXml, XmlStructure.SQLDataBase.Scripts.Script.Values.DEFAULT); | ||
1372 | + } | ||
1373 | + else | ||
1374 | + { | ||
1375 | + try { ScriptText = File.ReadAllText(this.FilePath); } catch { ScriptText = null; } | ||
1376 | + } | ||
1329 | CommandTimeout = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.ScriptCommandTimeout), sqlscriptXml, defaultcommandtimeout); | 1377 | CommandTimeout = GetValue(nameof(XmlStructure.SQLDataBase.Scripts.Script.Attributes.ScriptCommandTimeout), sqlscriptXml, defaultcommandtimeout); |
1330 | } | 1378 | } |
1331 | } | 1379 | } |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; | ||
32 | // You can specify all the values or you can default the Build and Revision Numbers | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | // by using the '*' as shown below: | 33 | // by using the '*' as shown below: |
34 | // [assembly: AssemblyVersion("1.0.*")] | 34 | // [assembly: AssemblyVersion("1.0.*")] |
35 | -[assembly: AssemblyVersion("1.22.3.0")] | ||
36 | -[assembly: AssemblyFileVersion("1.22.3.0")] | 35 | +[assembly: AssemblyVersion("1.23.0.0")] |
36 | +[assembly: AssemblyFileVersion("1.23.0.0")] |
Vrh.Log4Pro.MaintenanceConsole/Tools.cs
@@ -330,14 +330,17 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | @@ -330,14 +330,17 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS | ||
330 | resolvedtext = stringwithparameters; | 330 | resolvedtext = stringwithparameters; |
331 | foreach (var kvp in argumentparametersdictionary) | 331 | foreach (var kvp in argumentparametersdictionary) |
332 | { | 332 | { |
333 | - if (kvp.Value.StartsWith("?") && interactive) | 333 | + if (kvp.Value == null) { resolveddictionary.Add(kvp.Key, "");} |
334 | + else if (kvp.Value.StartsWith("?") && interactive) | ||
334 | { | 335 | { |
336 | + // "?default?prompt" | ||
335 | string prompt = $"Enter value for {kvp.Key}:"; | 337 | string prompt = $"Enter value for {kvp.Key}:"; |
336 | string kvpdefaultvalue = null; | 338 | string kvpdefaultvalue = null; |
337 | if (kvp.Value.Length > 1) | 339 | if (kvp.Value.Length > 1) |
338 | { | 340 | { |
339 | - prompt = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0]; | ||
340 | - if (kvp.Value.Substring(1).IndexOf('?') != -1) kvpdefaultvalue = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[1]; | 341 | + var ppp = kvp.Value.Substring(1).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries); |
342 | + if (!string.IsNullOrWhiteSpace(ppp[0])) { kvpdefaultvalue = ppp[0]; }; | ||
343 | + if (kvp.Value.Substring(1).IndexOf('?') != -1) { prompt = ppp[1]; } | ||
341 | } | 344 | } |
342 | string value = ColorConsole.ReadLine(prompt, ConsoleColor.Yellow, defaultvalue: kvpdefaultvalue); | 345 | string value = ColorConsole.ReadLine(prompt, ConsoleColor.Yellow, defaultvalue: kvpdefaultvalue); |
343 | if (value.ToUpper() == "EX") { return false; } | 346 | if (value.ToUpper() == "EX") { return false; } |