-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
104 lines (95 loc) · 3.15 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System.IO;
using System.Text.RegularExpressions;
using IWshRuntimeLibrary;
namespace App {
class Program {
// static data
/// <summary>
/// Windows Script Host Shell object.
/// </summary>
private static WshShell Sh = new WshShell();
/// <summary>
/// URL regex search pattern.
/// </summary>
private static string PatternUrl = @"[A-Za-z]+:\/\/(.+)";
// static method
/// <summary>
/// Dream is collapsing.
/// : Hans Zimmer
/// </summary>
/// <param name="args">Input arguments.</param>
static void Main(string[] args) {
Params p = new Params(args);
if (p.TargetPath == null) return;
Match m = Regex.Match(p.TargetPath, PatternUrl);
bool isurl = m.Length > 0 && m.Index == 0;
if (p.Output == null) {
if (isurl) p.Output = m.Groups[1].Value.Replace("/", "_");
else p.Output = Path.GetFileNameWithoutExtension(p.TargetPath.Replace(":", ""));
}
p.Output = ExpandPath(p.Output);
p.TargetPath = ExpandPath(p.TargetPath);
p.IconLocation = ExpandPath(p.IconLocation);
p.Description = ExpandPath(p.Description);
p.WorkingDirectory = ExpandPath(p.WorkingDirectory);
p.Output = PathWithoutExt(p.Output) + (isurl? ".url" : ".lnk");
if (isurl) LinkUrl(p);
else LinkLocal(p);
}
/// <summary>
/// Create local shortcut.
/// </summary>
/// <param name="p">Input parameters.</param>
private static void LinkLocal(Params p) {
IWshShortcut l = Sh.CreateShortcut(p.Output);
l.TargetPath = p.TargetPath;
if (p.WindowStyle != null) l.WindowStyle = GetWindowStyle(p.WindowStyle);
if(p.HotKey != null) l.Hotkey = p.HotKey;
if(p.IconLocation != null) l.IconLocation = p.IconLocation;
if(p.Description != null) l.Description = p.Description;
if(p.WorkingDirectory != null) l.WorkingDirectory = p.WorkingDirectory;
if (p.Arguments != null) l.Arguments = p.Arguments;
l.Save();
}
/// <summary>
/// Create URL shortcut.
/// </summary>
/// <param name="p">Input parameters.</param>
private static void LinkUrl(Params p) {
IWshURLShortcut l = Sh.CreateShortcut(p.Output);
l.TargetPath = p.TargetPath;
l.Save();
}
/// <summary>
/// Expand shortcut path to full path.
/// </summary>
/// <param name="p">Shortcut path.</param>
/// <returns>Full path.</returns>
private static string ExpandPath(string p) {
if (p == null) return null;
MatchEvaluator fn = (m) => Sh.SpecialFolders.Item(m.Groups[1].Value);
return Regex.Replace(p, "{{(.+)}}", fn, RegexOptions.IgnoreCase);
}
/// <summary>
/// Get full path without extension.
/// </summary>
/// <param name="p">Input path.</param>
/// <returns>Path without extension.</returns>
private static string PathWithoutExt(string p) {
string d = Path.GetDirectoryName(p);
string f = Path.GetFileNameWithoutExtension(p);
return d + (d.Length > 0 ? "\\" : "") + f;
}
/// <summary>
/// Get Window style integer from string.
/// </summary>
/// <param name="ws">Window style string.</param>
/// <returns>Window style integer.</returns>
private static int GetWindowStyle(string ws) {
ws = ws.ToLower();
if (ws.StartsWith("max")) return 3;
if (ws.StartsWith("min")) return 7;
return 1;
}
}
}