Windows のシンボリックリンクとハードリンクの違い

Windows にはシンボリックリンクとハードリンクの機能がありますが、違いや特徴が解りづらく、あまり利用されていないのではないかと思います。
その違いと特徴について考察します。

シンボリックリンク

エクスプローラでショートカットファイルを作るのに似ています。
仕組みは概ね Linux と同様ですが、作成方法には違いがあります。

特徴

  • シンボリックリンクは、元のファイルの(実体そのものではなく)パスを指す。
  • パスを指す為、他のドライブや、ネットワーク越しでもリンクできる。
  • シンボリックリンクを削除しても、元のファイルには何も影響しない(そのまま残る)。
  • 元のファイルを削除した場合、そのファイルへのシンボリックリンクは残るが、既に存在しないパスを指しておりアクセスできなくなる。
  • ショートカットファイルのように「作業フォルダ」の情報は無い為、実行ファイルはリンク先のフォルダではなく、実行したフォルダ側で起動する。
  • dir コマンドやエクスプローラで symlink であることが確認できる。
  • 作成には管理者権限が必要。

作成と削除

シンボリックリンクを作成・削除するときは、リンク先がフォルダかファイルかで方法が異なります。

ファイルは mklink で作成、del で削除。
フォルダは mklink /d で作成、rmdir で削除します。

ハードリンク

ハードリンクは Linux のそれと同様の動作をします。
つまり同一のドライブ内で、元のファイル名と同様にファイルを直接指す別名を付けます。

特徴

  • ハードリンクで付けた名前は、元のファイルの名前と全く同じように扱える。
  • 1つのファイル内容に対して、複数の名前でリンクを張ると解釈できる。
  • 元のファイルを削除しても、ハードリンクが 1つでも残っていればファイル内容(への参照)は残り、やはり元のファイルと同じようにアクセスできる。
  • 言い換えれば、ハードリンクによる参照が 1つでも残っている限りファイルは削除されない。
  • Windows10 に Linux サブシステムを入れて ls -l してみると、Linux と同様にファイルの参照数が増えることが確認できる。
  • 作成は一般ユーザ権限で可能。

作成と削除

mklink /h で作成、del で削除します。
リンク先はファイルのみで、フォルダのハードリンクは作れません。

対応環境

ハードリンクは Windows 2000 以降、シンボリックリンクは Vista 以降で利用できます。
対応ファイルシステムは NTFS です。

PowerShell で実行する際はコマンド名を cmd /c mklink にする必要があります。
コマンドプロンプト(cmd.exe)からは直接実行できます。

関連サイト

Windows 10 アップデート 1809 がほぼ全ての環境で利用可能に

Intel 製ディスプレイドライバの問題などで、一部の環境には配信されないままになっていたバージョン 1809 へのアップデートが、ようやくほぼ全ての環境で利用可能になりました。
配信停止は 3月15日頃から解除され、筆者も Windows Update から確認することで無事アップデートできました。

そこで、Windows 10 October 2018 Update と呼ばれるこの大型アップデートの特徴をいくつかおさらいしておきます。

アップデート時

  • ストレージの必要空き容量は、アップデート時の作業領域も含めて 30GB 程度。なお、必要空き容量は非公表。
  • アップデート完了までには結構時間がかかる。(1~2時間程度)
  • アップデート後 10日以内なら、設定の「回復」から前のバージョンに戻すこともできる。
windows_update_1809_amd64_2019-03.png
更新プログラムのインストール待ち

新機能と変更点

  • 「Snipping Tool」が非推奨になり、代わりに「画面領域切り取り」が追加された。詳しくは後述。
  • エクスプローラにもダークモードが有効になった。
    • 色の設定で、規定のアプリモードを黒にして有効化。
  • デバイス間でのクリップボード共有が可能に。
  • Unicode 11 の絵文字が使用可能。
  • スマホ同期アプリが追加された (が、あまり便利ではないらしい)。
  • 一部の Windows アプリの設定が部分的に初期化される。
    • エクスプローラ、タスクマネージャなど。
    • 半期毎の大型アップデートでは毎回こうなる。
  • 一部関連付けの強制変更。(JPEG → フォトアプリなど)
    • 元に戻すには、右クリックの「プログラムから開く → 別のプログラムを選択」で任意のアプリを選択し「常にこのアプリを使って … ファイルを開く」をチェックして OK を押す。

画面領域切り取り機能

右下のアクションセンターに「画面領域切り取り」が追加され、ここから画面を簡単にキャプチャできる。

  • キャプチャ直後に表示される通知をクリックすると、ストアアプリ「切り取り領域とスケッチ」が起動してペン書き込みやファイル保存、共有ができる。
    • キャプチャ及びファイルからの編集は可能だが、クリップボードからの貼り付けはできない。
    • クリップボードにコピーすることは可能。
  • 機能的にはウィンドウ単位のキャプチャが無い等、今の所まだ Snipping Tool のほうが高機能。

関連サイト

Windows Update のクリーンアップで空き領域を増やす

Windows の自動更新などで Windows Update が実行されると、次第にストレージ (HDD・SSD) の空き領域が減っていきます。
その理由はもちろん、Windows 自体のサイズが増加する為でもあるのですが、実は Windows の動作に必須ではないファイルも残されたり、作られたりしています。

そのような削除しても良いファイルのうち、アップデート前の状態に復元する為のバックアップ(復元ポイント)は、一定期間後に自動的に削除されます。

しかし、過去にインストールされた更新プログラム情報は、不要ですが残ってしまいます。これは既に Windows で使われておらず、再利用されることも無いため、削除しても問題ありません。空き領域は数GB程度増える可能性があります。

また、アップグレードのログファイルも自動削除されません。こちらも Windows の動作には無関係で削除しても構いませんが、トラブル時に役立つ可能性があるため、残しておくことが推奨されています。

クリーンアップの実行方法

過去の更新プログラム情報の削除は、Windows の設定から簡単に行なえます。
まず、スタートメニューの ⚙ 歯車マークなどから「Windows の設定」を開き、メニューを下記の順にたどります。

システム > ストレージの項目ストレージセンサーにある「今すぐ空き領域を増やす

windows_update_cleanup1.jpg
Windows の設定 > システム > ストレージ

複数の削除対象項目とチェックボックスが表示されますので、その中から、「Windows Update のクリーンアップ」にチェックが入っていることを確認しましょう。なお、既にクリーンアップされている場合は、項目自体が表示されません。

削除対象項目のうちのいくつかは最初からチェックされていますが、上記の通りアップグレードログファイルは外しておいたほうが良いかもしれません。その他も、必要がなければチェックを外します。「縮小表示」と「一時ファイル」は削除しても大丈夫ですので、チェックを入れておきます。

windows_update_cleanup2.png
Windows Update のクリーンアップ中

確認がおわったら、上部にある「ファイルの削除」ボタンを押すと、不要ファイルの削除が開始されます。

完了までの時間

「Windows Update のクリーンアップ」にはかなり時間がかかります。数十分から1時間以上かかる可能性もありますので、PC の稼働時間に余裕があるときがオススメです。

削除中は進捗状況が表示されず、ちゃんと動いているのか不安になりますが、タスクマネージャで CPU の負荷など見ると動作していることが確認できます。
Everything などのインデックスを作るタイプのファイル検索ソフトが常駐している場合は、完全に終了させておいたほうが進捗が早くなるかもしれません(…関係ないかも)。

なお、「今すぐ空き領域を増やす」機能は Windows に以前から搭載されている「ディスク クリーンアップ」とほぼ同等のようです。「ディスク クリーンアップ」は今後廃止される予定ですが暫くの間は利用可能で、そちらでも削除できます。

※ 2018年10月現在の Windows 10 で確認。

関連サイト

Windows 10 には mklink が無い…わけではない

Windows ユーザの皆さん、シンボリックリンク使ってますか?
Linux では多用されるシンボリックリンクも Windows ではあまり使う機会が無いと思いますが、実はかなり以前 (Vista以降) から使えるようになっています。

PowerShell での実行方法

シンボリックリンクは mklink コマンドで作成できます。

そこで、いっちょ使ってやろうかな!と PowerShell を起動して mklink と入力すると、コマンドが無くて実行できないという事態に陥ります (´・ω・`)

mklink_powershell.png
Windows PowerShell

PowerShell では、画像の通り cmdmklink を渡せば実行できます。
シンボリックリンク作成時は管理者権限が必要ですので、管理者権限付きで PowerShell を起動します。

cmd /c mklink "新規symlink名" "既存ファイルのパス"

# リンク先がフォルダの場合
cmd /c mklink /d "新規symlink名" "既存フォルダのパス"

ジャンクションとハードリンク

mklink には他にも類似のリンクを作る機能があり、mklink /j でジャンクション、mklink /h でハードリンクが作れます。

これらとシンボリックリンクの違いは色々ありますが、使い分けの明確な基準はありません。
シンボリックリンクとハードリンクの違いについて書きましたので、そちらをご参照ください。

なぜ直接実行できないの?

直接実行できない理由は、mklink が cmd の内部コマンドだからのようです。
PowerShell ではなくコマンドプロンプトからなら、cmd を付けなくても実行可能です。

しかし cmd の内部コマンドが全て PowerShell で直接実行できないわけではなく、start などは実行できます。
うーん、謎仕様ですね(´・ω・`)

関連サイト

バッチファイルを UTF-8 で書く

現在の Windows では、コードページ指定をすればコマンドラインで UTF-8 を書くことができます。
そこで、バッチファイルを UTF-8 で書く際に気をつけるべき点をご紹介します。

UTF-8に変更したコマンドプロンプト
UTF-8に変更したコマンドプロンプト

コードページを変更する

コードページは、特定の文字コードを表す Windows 特有の番号で、SJISは 932、UTF-8 は 65001 です。
コードページを変更する為、バッチファイルの先頭で chcpコマンドを指定します。

@echo off
chcp 65001

改行コード

バッチファイルを UTF-8 で保存するとき、改行コードを LF (Unix形式)にしてしまいたくなりますが、これだと上手く動作しない場合があります。
改行コードは必ず、CR+LF (Windows形式)で保存しましょう。

対応フォントを指定

文字化けを防ぐ為に、コマンドプロンプトのプロパティ(または既定値)の「フォント」タブで、UTF-8 の表示に対応した等幅フォントを指定します。

「MSゴシック」や「MyricaM M」が対応しているようです。なお、残念ながら Microsoft 製の視認性が高い等幅フォント Consolas は対応していません。

表示できない文字もある

絵文字や外国語など、日本語の文字コードには無い文字は、上手く表示できないようです。指定したフォントには該当文字が存在しない為だろうと思います。

しかしコードページ指定が全く無意味なわけではなく、コードページに従って内部処理は正常に行われています。その為、Unicode の文字列をコマンドでアプリケーションに渡したり、リダイレクトでファイルに書き込むことが出来るようになります。

なお、コードページ 932 のままでも一部の Unicode 文字は表示されますが、ファイルに書き込む等すると文字化けします。

PowerShellの場合

PowerShellではコードページ 932 と 65001 の何れでも、echo コマンドなどをリダイレクトしてファイルに保存すると、UTF-16LE(BOM付き)として出力されます。

また、コマンドプロンプトでは 932 のままだと文字化けするようなケースでも、PowerShell だと上手く動作する場合がありますが、65001 に変更したほうが確実に動作しますので、それについては省略します。

※ 全て2018年04月時点の Windows 10 (64bit) で確認しました。

参考サイト