Windows 上にあるインターネットショートカットを普通のショートカットに変換するプログラムです。
既定のブラウザに関わらず指定したブラウザ(Chorome)で強制的に開くように変換します。
using IWshRuntimeLibrary; using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; namespace ConsoleApp1 { internal class Program { public static void Main(string[] args) { createShortcut(args[0], getUrl(args[0])); } /// <summary> /// 指定したインターネットショートカットからURLを取得します。 /// </summary> private static string getUrl(string path) { string[] lines = System.IO.File.ReadAllLines(path); if (lines[0] != "[InternetShortcut]") { throw new NotSupportedException("1行目がショートカットではありません。"); } for (int i = 1; i < lines.Length; i++) { if (lines[i].StartsWith("URL")) { return lines[i].Split('=')[1]; } } throw new InvalidDataException("URLタグが見つかりませんでした。"); } private static void createShortcut(string path, string url) { // 起動するプログラム(=Chorome) string programPath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"; // ショートカットの生成先 string dir = Path.GetDirectoryName(path); string name = Path.GetFileNameWithoutExtension(path); string destPath = Path.Combine(dir, name + ".lnk"); using (var gen = new ShortcutGenerator()) { // (1) リンク先:起動するプログラムのパス IWshShortcut info = gen.GetInfo(destPath); info.TargetPath = programPath; // (2) 引数 info.Arguments = url; // (3) 作業フォルダ info.WorkingDirectory = Path.GetDirectoryName(programPath); // (4) 実行時の大きさ 1が通常、3が最大化、7が最小化 info.WindowStyle = 1; // (5)アイコンのパス 自分のEXEファイルのインデックス0のアイコン info.IconLocation = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" + ",0"; gen.Save(info); } } } /// <summary> /// ショートカットを作成するためのクラス /// </summary> public class ShortcutGenerator : IDisposable { // // Fields // - - - - - - - - - - - - - - - - - - - - // ショートカット生成用のCOMオブジェクト private WshShell shell = new WshShell(); // 生成したCOMコンテナの数 private List<IWshShortcut> shortcutList = new List<IWshShortcut>(); // Dispose したかどうかのフラグ // true : Dispose済み / false : まだ private bool isDisposed; // // Constructors // - - - - - - - - - - - - - - - - - - - - /// <summary> /// オブジェクトを破棄します。 /// </summary> ~ShortcutGenerator() { this.Dispose(); } // // Public Methods // - - - - - - - - - - - - - - - - - - - - /// <summary> /// ショートカットへ与えるデータを格納するオブジェクトを生成します。 /// </summary> public IWshShortcut GetInfo(string path) { var info = (IWshShortcut)shell.CreateShortcut(path); this.shortcutList.Add(info); return info; } /// <summary> /// 既存のショートカットをロードします。 /// </summary> public IWshShortcut Load(string path) { var info = (IWshShortcut)shell.CreateShortcut(path); info.Load(path); this.shortcutList.Add(info); return info; } /// <summary> /// ショートカットを生成します。 /// </summary> public void Save(IWshShortcut info) => info.Save(); /// <summary> /// <see cref="IDisposable"/> の実装。 /// </summary> public void Dispose() { if (isDisposed) { return; } isDisposed = true; for (int i = 0; i < this.shortcutList.Count; i++) { Marshal.FinalReleaseComObject(shortcutList[i]); } this.shortcutList.Clear(); this.shortcutList = null; Marshal.FinalReleaseComObject(shell); this.shell = null; GC.SuppressFinalize(this); } } }