<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://turgenev.cloudfree.jp/mw-new/mw143/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Turgenev</id>
	<title>Turgenev&#039;s Wiki - 利用者の投稿記録 [ja]</title>
	<link rel="self" type="application/atom+xml" href="https://turgenev.cloudfree.jp/mw-new/mw143/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Turgenev"/>
	<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/wiki/%E7%89%B9%E5%88%A5:%E6%8A%95%E7%A8%BF%E8%A8%98%E9%8C%B2/Turgenev"/>
	<updated>2026-05-05T12:07:28Z</updated>
	<subtitle>利用者の投稿記録</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=363</id>
		<title>デュアルブート</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=363"/>
		<updated>2025-10-02T06:09:16Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
WindowsとLinuxのデュアルブートにおいて役に立つ情報を記述する。古いメモを多く含む。[[Linuxのインストール|Linuxのインストール]]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsのプロダクトキー関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsのプロダクトキー関連 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|デュアルブート}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bitlocker ==&lt;br /&gt;
&lt;br /&gt;
とにかく前もって&amp;lt;strong&amp;gt;回復キーを保存しておくこと！！&amp;lt;/strong&amp;gt;逆に回復キーさえあればBitlockerで大きなトラブルになることは多くない。&lt;br /&gt;
&lt;br /&gt;
* [https://www.pcdock24.com/blog/?p=53931 BitLockerとは【BitLockerの要件と自動有効化の問題点】｜パソコン修理パソコンドック24] によるとローカルアカウントでBitlockerの有効/無効を確認するときはdiskmgmtから行かなきゃいけないらしい。&lt;br /&gt;
* Bitlockerを有効にしたあとにwinを起動すると再起動ループにハマることがある。解決法(Manage&amp;amp;#45;bdeを使う)→[https://community.spiceworks.com/how_to/124388-stop-a-bitlocker-boot-loop Stop a BitLocker boot loop &amp;amp;#45; Windows Forum &amp;amp;#45; Spiceworks]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsパーティションntfsのマウント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsパーティション（NTFS）のマウント ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
==== remove_hiberfileについて ====&lt;br /&gt;
&lt;br /&gt;
マウントが成功するにはWindowsが完全シャットダウンされている必要がある（またはそれが望ましい）。ただ、[https://unix.stackexchange.com/questions/107978/cant-access-windows-drive-windows-is-hibernated-refused-to-mount https&amp;amp;#58;//unix.stackexchange.com/questions/107978/cant&amp;amp;#45;access&amp;amp;#45;windows&amp;amp;#45;drive&amp;amp;#45;windows&amp;amp;#45;is&amp;amp;#45;hibernated&amp;amp;#45;refused&amp;amp;#45;to&amp;amp;#45;mount]にある通り、windowsを正しくシャットダウンしてもなぜか「ハイバーネートされててマウントできません」的なのが出ることがあるので、マウントオプションにremove_hiberfileを追加するとよい。&lt;br /&gt;
&lt;br /&gt;
* 高速スタートアップを無効にしているにもかかわらず完全シャットダウンされていないことがある気がしたので、Windowsでシャットダウン時に実行するスクリプトとして完全シャットダウンコマンドを追加したりした&lt;br /&gt;
* デスクトップPCではだいたい不要？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker無し&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker無し ===&lt;br /&gt;
&lt;br /&gt;
普通にntfs&amp;amp;#45;3gを使う。数字など適宜読み替えること。主にWindowsのDドライブ想定。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;ntfs-3g -o remove_hiberfile /dev/nvme0n1p5 /media/win&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstabの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;/dev/sda2     /media/ddrive ntfs-3g noauto,rw,nofail 0  0&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker有り&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker有り ===&lt;br /&gt;
&lt;br /&gt;
ntfs&amp;amp;#45;3gの前にDislockerで暗号化を解除する。参考→[http://www7390uo.sakura.ne.jp/wordpress/archives/270 http&amp;amp;#58;//www7390uo.sakura.ne.jp/wordpress/archives/2]&lt;br /&gt;
&lt;br /&gt;
dislocker&amp;amp;#45;fileの方式だと一旦復号したのをファイルに書き出して静的にマウントするので、（事実上）readonlyとなる。よってdislocker&amp;amp;#45;fuseを使う→[https://www.systutorials.com/docs/linux/man/1-dislocker-fuse/ https&amp;amp;#58;//www.systutorials.com/docs/linux/man/1&amp;amp;#45;dislocker&amp;amp;#45;fuse/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/dl-fuse&lt;br /&gt;
$ sudo mount -o loop,rw /media/dl-fuse/dislocker-file /media/win/&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstab例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  0 0&lt;br /&gt;
/media/bitlocker/dislocker-file   /media/win10   ntfs-3g   rw,nofail,remove_hiberfile,permissions 0  2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;と、二行に分けて記載する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;permissions については後述&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セキュリティ問題 ====&lt;br /&gt;
&lt;br /&gt;
recovery&amp;amp;#45;passwordを暗号化されていないパーティションに書いてしまうと結局Bitlockerの意味が全くなくなってしまうので、Linux側でもBitlockerのような暗号化パーティション（LUKSとか？）やユーザーログイン時に復号される暗号化フォルダ（ecryptfsとか）といったディスク上で暗号化される領域に書いておく必要がある（もちろん毎回パスワードの類を打ち込むのでよければそれでもいい）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;permissions-inheritについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== permissions, inheritについて ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tuxera/ntfs-3g/wiki/File-Ownership-and-Permissions https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/wiki/File&amp;amp;#45;Ownership&amp;amp;#45;and&amp;amp;#45;Permissions] 詳しくはこちらも参照。&lt;br /&gt;
&lt;br /&gt;
まず、マウントオプションとして&amp;lt;strong&amp;gt;permissions&amp;lt;/strong&amp;gt;を指定しない限り、ntfs&amp;amp;#45;3gでマウントしたファイルは全てパーミッション・所有者が固定（uid, gid, umaskなどで指定）となり、個別のファイルについて変更することはできない。&lt;br /&gt;
&lt;br /&gt;
そして、この場合、ntfs&amp;amp;#45;3g経由で作成したファイルはWindows側で見るとすべてAdministratorの所有となり、さらにEveryoneにフルコントロール権限が付与される（この動作を変更するのは筆者の知る限り不可能）。&lt;br /&gt;
&lt;br /&gt;
Linuxではフォルダの実行権限（x）が無ければその中に含まれたファイルにはアクセスが通らず、パスを推測することも不可能だが、Windowsではたとえ一切権限のないフォルダであっても中にあるファイル・フォルダのパスがわかれば直接パスを打つことでアクセスが通ってしまうようである（試した限り）。そのため、permissions無しでntfs&amp;amp;#45;3gで作成したファイルはパスさえわかればWindows上の全ユーザーが閲覧・編集・削除できる状態ということになる。&lt;br /&gt;
&lt;br /&gt;
従って、Gitを使用する場合や複数ユーザーで使用したい場合などパーミッション管理が必要なデータを扱う場合はもちろん、単に中にあるデータを保護したいという場合でもpermissionsオプションを指定することが必須になる。&lt;br /&gt;
&lt;br /&gt;
次に、permissionsを指定して、かつUserMappingを指定しない場合、Linux上でrootが所有するファイルをWindows側で見ると、全てAdministratorsの所有物になり（ここはpermissionsがない場合と同じ）、そのアクセス権はLinux上での見え方と概ね一致するように設定されるようである。他のユーザーが所有するファイルにはS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000というような上位桁が円周率に由来する（この部分はハードコードされている）SIDが割り当てられ、こちらもアクセス権が適切に設定される。UserMappingを指定することで、このSIDの部分の割り当てを変更することができる。&lt;br /&gt;
&lt;br /&gt;
Windowsに挙動を近づけるための他のオプションとしては&amp;lt;strong&amp;gt;inherit&amp;lt;/strong&amp;gt;というのもあり、これは新規作成時に上位フォルダの権限を継承するものである。しかし、これは&amp;lt;u&amp;gt;所有者を継承するオプションではない&amp;lt;/u&amp;gt;（そして、所有者が違えばまともに継承もされない）。&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/tuxera/ntfs-3g/issues/90 https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/issues/90] では、UserMappingがなくても所有者が継承されるようになるパッチが示されているが、これを使うとpermissionsは動かなくなる（chmodなどが使えない）。自力で変えようとしてみたが、うまくいかなかった。&lt;br /&gt;
&lt;br /&gt;
以上のことから、Windowsの一般ユーザーフォルダの内容などをLinuxから良い感じに（Windows側の権限設定を汚染せずに）使えるようにするには、明示的なUserMappingが事実上必須であることがわかる。&lt;br /&gt;
&lt;br /&gt;
一方で、Administrator所有・全ユーザー閲覧可能（あるいは不可能）、といった、Windows側の全ての一般ユーザーに対して共通のアクセス権を適用する設定であれば、UserMappingを使用しなくても簡単に設定が可能である。個人用PCかつ、画像・動画などのメディアファイルやLinuxでしか使用しない大きめのソフトウェアを入れておく用途であれば、こちらで問題ないだろう。&lt;br /&gt;
&lt;br /&gt;
Linux側で別ユーザーの所有に見せたい場合は、上記のS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000のようなSIDが見えてしまう状態でもよければ（かつ、権限設定にも問題がなければ）それでもいいし、下記のbindfsと併用する方法もある。いずれにしても、Linux側で全員が読み取り・書き込み・実行が可能なファイルは、Linux側での親フォルダの権限によらず、Windows側では（パスさえわかれば）対応する権限でアクセスができてしまうということに注意が必要である。一応、パス名をランダムなものにするという対策は考えられそうではある。&lt;br /&gt;
&lt;br /&gt;
また、Windowsではファイルの新規作成時には必ず実行権限が付加されるので、Linux側でそれを見た場合も実行可能になる（実行権限を外すと.exeなどが実行できなくなる）。従って、GitのレポジトリのフォルダをWindows/Linux間で共用するようなことをすると、Windows側では実行権限無しで（これがデフォルトであるため）コミットされたファイルがLinux側では実行権限有りに見えるため差分が出てしまうといったことが発生する。これはUserMappingでも解決はできないので、Gitリポジトリのあるフォルダを共用するのは不可能である。&lt;br /&gt;
&lt;br /&gt;
結局、後述のbindfsと組み合わせると、以下のようにするのが良さそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;大元のntfsパーティションは、permissionsでマウント。UserMappingを使ってもよい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Linux側でパーミッションを変更できる必要がなく、Windows側と共用したいものについては、bindfsで再マウントし、create&amp;amp;#45;with&amp;amp;#45;perms&amp;amp;#61;a+rwxによってWindows側でアクセスに制約が出ないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;より完全なオプションとしては、以下のような感じ？&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;map=root/myname:@root/@myname,perms=a+rwx,create-with-perms=a+rwx,chown-ignore,chgrp-ignore,chmod-ignore&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Gitのようにパーミッションを変更できる必要があるものは、改めてこれも別のbindfsとして再マウントする。この場合、Windows側からはアクセスの問題が生じる可能性があるので、とりあえず内容だけ確認したいときに見られればいいという状況で使うのがいいだろう。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;あるいはbindfsを1つにまとめてcreate&amp;amp;#45;with&amp;amp;#45;perms&amp;amp;#61;+rw（xは指定しない）にするのもいけるかもしれないが、本当にうまくいくかどうか…&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;設定例&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;UUID=109B0ED0109B0ED0 /media/localdisk ntfs-3g permissions,nofail 0 0&lt;br /&gt;
UUID=040CAEB80CAEA460 /media/cdrive ntfs-3g permissions,nofail,remove_hiberfile 0  0&lt;br /&gt;
/media/localdisk /home/useruser/.mnt/localdisk2 fuse.bindfs nofail,map=root/useruser:@root/@useruser,create-with-perms=g-w 0 0&lt;br /&gt;
/media/localdisk /home/useruser/.mnt/localdisk fuse.bindfs nofail,map=root/useruser:@root/@useruser,perms=a+rwx,create-with-perms=a+rwx,chown-ignore,chgrp-ignore,chmod-ignore 0 0&lt;br /&gt;
/media/cdrive /home/useruser/.mnt/cdrive2 fuse.bindfs nofail,map=root/useruser:@root/@useruser,create-with-perms=g-w 0 0&lt;br /&gt;
/media/cdrive /home/useruser/.mnt/cdrive fuse.bindfs nofail,map=root/useruser:@root/@useruser,perms=a+rwx,create-with-perms=a+rwx,chown-ignore,chgrp-ignore,chmod-ignore 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== bindfs ====&lt;br /&gt;
&lt;br /&gt;
既存のディレクトリを、所有ユーザーやパーミッションを変更してマウントしてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --mirror=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
または&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --force-user=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
この2つの違いは不明&lt;br /&gt;
&lt;br /&gt;
作成した&lt;br /&gt;
&lt;br /&gt;
sudoがないと&amp;lt;code&amp;gt;fusermount&amp;amp;#58; option allow_other only allowed if &amp;amp;#39;user_allow_other&amp;amp;#39; is set in /etc/fuse.conf&amp;lt;/code&amp;gt;とか言われたりする&lt;br /&gt;
&lt;br /&gt;
fstabの例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;/media/win /home/myname/.mnt_win fuse.bindfs nofail,map=root/myname:@root/@myname,create-with-perms=g-w 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linuxだとrootのデフォルトのumaskが022で一般ユーザーが002なせいで一般ユーザーが作ったファイルが775とか664になってしまったりするがg&amp;amp;#45;wをつけることによって755とか644になる（もちろんchmodすれば変えられる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;minecraft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Minecraft ==&lt;br /&gt;
&lt;br /&gt;
.minecraftフォルダをWindowsとLinuxで共有したはいいが、（それ自体.minecraftの中にある）ゲームディレクトリの指定も共有することを考えると、両OSでパスの仕様がやや異なるのが問題になる。&lt;br /&gt;
&lt;br /&gt;
例えば以下ではWindowsのルートが/media/winにマウントされているとする。&lt;br /&gt;
&lt;br /&gt;
まずLinuxのランチャーは相対パスどころかシンボリックリンクすら変換して普通の絶対パスにしてしまう（設定を書き換えてしまう）っぽいので、linuxでは絶対パス指定で/media/win/Users/pathのようにする。で、この書き方をするとWindowsでは相対パスと解釈されるのだが、基準となるフォルダが謎で、「PLAY」を押した時のチェック時は.minecraftが基準なのだが、実際に見られるのはランチャーがあるフォルダが基準（＝こっちになかった場合ゲームディレクトリが新たに作られる）&lt;br /&gt;
&lt;br /&gt;
* ストアアプリ版の（新しい方の？）Minecraftランチャーでは、この「ランチャーがあるフォルダ」は&amp;lt;code&amp;gt;AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local&amp;lt;/code&amp;gt; あたりである。&lt;br /&gt;
&lt;br /&gt;
従って、ランチャーのフォルダと.minecraft内の両方にmediaというフォルダを作って中にwinという名前でC&amp;amp;#58;\へのジャンクション置くとうまくいく。&lt;br /&gt;
&lt;br /&gt;
ちゃんと設定されていれば、実体フォルダは必ずしもRoaming以下の階層になければならないわけではない。&lt;br /&gt;
&lt;br /&gt;
.minecraftの中にはゲームディレクトリ専用のフォルダを作り、その中にmain, snapshotなど用途に応じたフォルダを作っておくとよい&lt;br /&gt;
&lt;br /&gt;
== google&amp;amp;#45;drive&amp;amp;#45;ocamlfuse ==&lt;br /&gt;
&lt;br /&gt;
labelを使うと複数アカウントをマウントできる。デフォルトのラベル名はdefault&lt;br /&gt;
&lt;br /&gt;
しばらく使っていないと起動時におそらく認証の失敗が原因でマウントポイントのあるフォルダに対するlsがしばらく一切反応しなくなる（&amp;amp;#126;/.gdfuse内の該当ラベル名のフォルダを削除して最初からやり直せば治る）。よってマウントポイントをホームディレクトリ直下に作るのは避けたほうがよい（gdfというフォルダを作っている）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mega&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MEGA ==&lt;br /&gt;
&lt;br /&gt;
Winが完全にはシャットダウンされていない状態でLinuxを起動するとCドライブ上のMEGAのフォルダが読めずに同期が無効になってしまう。MEGA自身のかわりに、Cが読める状態でのみMEGAを起動するシェルスクリプト（mega&amp;amp;#45;mounted.sh）をスタートアップに登録しておく。Cが読めなかった場合にはdialogコマンドで通知ダイアログを表示する。（このスクリプトではC自身のかわりにC&amp;amp;#58;\Windowsをみている）（gdialogは一部のディストリにしか入っていないかもしれない。実際にコマンド打ってみてどんな表示になるかも含めて確かめておいたほうがよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if [ -d /media/win-rw/Windows ]; then&lt;br /&gt;
megasync&lt;br /&gt;
else&lt;br /&gt;
gdialog --title &amp;quot;Warning&amp;quot; --infobox &amp;quot;MEGAsync is not started because Windows partition is not mounted&amp;quot; 0 0&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bluetooth機器&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bluetooth機器 ==&lt;br /&gt;
&lt;br /&gt;
同じBluetooth機器を同じPCのWindowsとLinux双方にペアリングするというもの。自分はマウスでしかやったことがない。意外と難しいが何とかなる。&lt;br /&gt;
&lt;br /&gt;
==== 参考 ====&lt;br /&gt;
&lt;br /&gt;
* [https://orumin.blogspot.com/2019/02/bluetooth.html https&amp;amp;#58;//orumin.blogspot.com/2019/02/bluetooth.html]&lt;br /&gt;
* [https://qiita.com/yoko-yan/items/9b0235678fd804b4fe0d https&amp;amp;#58;//qiita.com/yoko&amp;amp;#45;yan/items/9b0235678fd804b4fe0d]&lt;br /&gt;
* Bluetooth Low Energyという仕様もあるらしく、自分のマウスはこっちだった。これに関しては[http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html http&amp;amp;#58;//aimingoff.way&amp;amp;#45;nifty.com/blog/2018/09/windows&amp;amp;#45;linux&amp;amp;#45;b.html]を参照。割と情報が少ないので感謝。&lt;br /&gt;
** &amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx&amp;lt;/code&amp;gt;を見るためにpstoolsをダウンロードして&amp;lt;code&amp;gt;PsExec64 &amp;amp;#45;s &amp;amp;#45;i regedit&amp;lt;/code&amp;gt;とする必要があることに注意。なお、セキュリティソフトによってPsexecが脅威と見なされ強制削除されてしまうときは代わりにフリーソフトのAdvancedRunを使うとよい。&lt;br /&gt;
** まとめ&lt;br /&gt;
*** CSRKをLocalSignatureKey&lt;br /&gt;
*** LTKをLongTermKey&lt;br /&gt;
*** EDIVをEdiv（16進→10進に変換）&lt;br /&gt;
*** ERandをRandに（&amp;lt;strong&amp;gt;バイト&amp;lt;/strong&amp;gt;(2文字のかたまり)&amp;lt;strong&amp;gt;をすべて逆順にしてから&amp;lt;/strong&amp;gt;10進変換）。ちなみにこれを間違えた結果、マウスを動かすたびにbluetoothアイコンが白↔黒と高速で切り替わる謎のバグっぽい現象が起こったことがあった。&lt;br /&gt;
*** 小文字を大文字に変える必要はない。また、IRKをIdentityResolvingKeyに書くのも不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;マルチデバイス対応マウスlogicool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== マルチデバイス対応マウス（Logicool） ====&lt;br /&gt;
&lt;br /&gt;
マルチデバイス対応（切り替えボタンがあるやつ）のマウス（LogicoolのM595）を使ったら、&amp;lt;strong&amp;gt;登録情報を一旦削除して再接続するごとにMacアドレスがひとつインクリメント&amp;lt;/strong&amp;gt;されて困った。Linuxで接続→Winで接続→Linuxで上記の書き換え、とやったあと、フォルダ名を変更（1を足せばよいはずだが正確にはWinの情報を見るのがよい）するとうまくいった。[https://twitter.com/e9g/status/1381111849664409600 自分のツイート]にも記録あり&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=AFDKO%E3%81%AB%E3%82%88%E3%82%8BOpenType%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90&amp;diff=362</id>
		<title>AFDKOによるOpenTypeフォントの作成</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=AFDKO%E3%81%AB%E3%82%88%E3%82%8BOpenType%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90&amp;diff=362"/>
		<updated>2025-10-02T06:09:09Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;筆者は[https://github.com/adobe-type-tools/afdko &amp;lt;strong&amp;gt;Adobe Font Development Kit for OpenType (AFDKO)&amp;lt;/strong&amp;gt;]を用いて、[https://github.com/ge9/NazonoMincho 謎乃明朝]というフォントを作成し公開している。謎乃明朝は[http://fonts.jp/hanazono/ 花園フォント]と同じく[https://glyphwiki.org/wiki/GlyphWiki:%e3%83%a1%e3%82%a4%e3%83%b3%e3%83%9a%e3%83%bc%e3%82%b8 GlyphWiki]のデータをもとにしている完全フリーのフォントであるが、GlyphWikiデータからの漢字のパスデータの生成においてオリジナルの[https://github.com/kamichikoichi/kage-engine KAGEエンジン]を[https://github.com/ge9/kage-engine-2 改変したもの]を使用している。&lt;br /&gt;
&lt;br /&gt;
改変エンジンのget_sub_path_svg_fontという関数を使用すると、&amp;amp;#91;0 &amp;amp;#45;120 1000 880&amp;amp;#93;をバウンディングボックスとしたときに適切に表示されるようなパスがSVG形式で出力される。この記事ではそこから先のプロセスについて解説する。&lt;br /&gt;
&lt;br /&gt;
他に全体を通して参考になるサイトとしては以下がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://shiromoji.hatenablog.jp/entry/20111206/1323270030 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 前篇：AFDKOのインストールとmergeFonts &amp;amp;#45; しろもじメモランダム]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;一通りのことが書いてある読みやすい日本語の記事はこれくらいである。筆者もこれを参考にした。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://ccjktype.fonts.adobe.com/wp-content/uploads/2012/06/afdko-lunde-20120625.pdf https&amp;amp;#58;//ccjktype.fonts.adobe.com/wp&amp;amp;#45;content/uploads/2012/06/afdko&amp;amp;#45;lunde&amp;amp;#45;20120625.pdf]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ワークショップで使用した講義資料なので単体だとやや読みづらいが、ヒント情報の付加に関して唯一まともに書いてあった。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://aznote.jakou.com/prog/opentype/index.html OpenType フォント・フォーマット]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;OpenTypeの仕様が日本語で記述されている。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;パスの統合単純化&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== パスの統合・単純化 ==&lt;br /&gt;
&lt;br /&gt;
これはAFDKOには関係ないが割と役に立つ話なのでついでに記載する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;inkscapeによる統合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Inkscapeによる統合 ===&lt;br /&gt;
&lt;br /&gt;
改造エンジンで生成した漢字パスデータはそれぞれの画が別々のサブパスで表現されており、互いに重複する部分がある。これをそのままフォントに使うこともできるが、画が交差する場所（「田」の中央とか）で白い抜けが表示されてしまうなど不具合が生じる場合がある。そこで、重複がなくなるようにパス同士のUnionを取る（統合する）必要がある。&lt;br /&gt;
&lt;br /&gt;
この目的で本家の花園明朝では[https://github.com/AngusJohnson/Clipper2 Clipper]が使われているが、こちらはどうやら直線のみ対応で、ベジェ曲線は扱えないようである。ベジェ曲線にも使えるフリーのものはFontforgeとInkscapeがあるがFontforgeは色々と不安定なのでInkscapeを使う。&lt;br /&gt;
&lt;br /&gt;
* Fontforgeは一応試したが、閉じていないパスが発生する不具合が頻発するのと、GUIだと途中で落ちる。ところで、謎乃明朝にissue([https://github.com/ge9/NazonoMincho/issues/2 &amp;lt;span&amp;gt;https://github.com/ge9/NazonoMincho/issues/2&amp;lt;/span&amp;gt;])が立ったが、KAGEデータの「曲げ」ストロークにおいてInkscapeの統合によって図形が消えるバグが発生していた（[https://gitlab.com/inkscape/inbox/-/issues/6886 &amp;lt;span&amp;gt;https://gitlab.com/inkscape/inbox/-/issues/6886&amp;lt;/span&amp;gt;] に報告済）（謎乃明朝側ではストロークの図形をあらかじめ統合された状態で生成することで回避して対応済）。Inkscapeも完璧ではないようである。&lt;br /&gt;
&lt;br /&gt;
コマンドとしては&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;inkscape --actions=&amp;quot;select-all;path-union&amp;quot; --export-type=svg input.svg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
などとすると、input_out.svgが出力される。&lt;br /&gt;
&lt;br /&gt;
ワイルドカード&amp;lt;code&amp;gt;&amp;amp;#42;.svg&amp;lt;/code&amp;gt;も使えるが、謎乃明朝のビルド時はかなり大量のファイルを処理するために「コマンドライン引数が長すぎる」的なことを言われてしまうのでxargsを使った（自動で分割してくれる）。&lt;br /&gt;
&lt;br /&gt;
個々のsvgファイルとして処理する（出力ファイルを逐一新規作成する）ためIOが頻発して効率はあまりよくない（謎乃明朝の数万グリフに対して実行すると数十分かかる）のだが、入力ファイル単位で分ける以外で複数のパスデータをバッチ処理で統合する（例えばsvgの”path”タグごと処理するなど）方法があるのかどうかはわからなかった。分かったら誰か教えてください。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontforgeによる単純化&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Fontforgeによる単純化 ===&lt;br /&gt;
&lt;br /&gt;
統合を行うと、（KAGEエンジン側のデザインの都合もあり）完全な直線になるべき部分が微妙な誤差のせいでほぼ直線と変わらない微妙な折れ線になってしまうことがある。また、極めて短く直線に近似できるのにベジェ曲線で表現されてしまう場合もある。こうした箇所はデータ削減やヒント（後述）の品質向上のために制御点を除いて単純化（simplify）したい。&lt;br /&gt;
&lt;br /&gt;
Inkscapeにも単純化はあるのだが、やってみたところ、単純化を行うと逆に曲線部分では無駄な制御点が挿入されてしまうというバグ（[https://gitlab.com/inkscape/inbox/-/issues/8096 報告済み]→[https://gitlab.com/inkscape/inkscape/-/issues/4419 こちら]に移動）があったので今回はスキップ。単純化に関してはFontforgeのほうが良さそうである。&lt;br /&gt;
&lt;br /&gt;
FontforgeはSVGフォント（＝単一ファイルに複数のパスを入れられる）に対応しているので、先ほどInkscapeが出力したファイルを一つにまとめてからFontforgeに入力して全グリフをSimplifyするという流れになる。あとFontforgeのGUIは割と不安定（特にWindows版）なので、対象が1000個を超えるような場合はスクリプトを組んでCUIで実行することを強く推奨する。&lt;br /&gt;
&lt;br /&gt;
例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;Open($argv[1])&lt;br /&gt;
SelectAll()&lt;br /&gt;
Simplify(128+32+8, 1.1)&lt;br /&gt;
Generate($argv[2])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 手元では「NaN value in spline creation」というエラーが漢字10000字につき1.5文字くらいの割合で出るのだが、該当文字を見ても特に問題はなさそうだったので放置している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;afdkoでのフォント作成-&amp;amp;#45;-基本&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== AFDKOでのフォント作成 &amp;amp;#45; 基本 ==&lt;br /&gt;
&lt;br /&gt;
基本的には&lt;br /&gt;
&lt;br /&gt;
素材フォント→（適宜txなどで変換した上でmergefonts）→ヒント情報無しのCIDフォント→（[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl perl&amp;amp;#45;scripts/hintcidfont.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts] と psautohintによるヒント情報の付加）→ヒント情報付きのCIDフォント→（makeotf）→完成品の（CIDキー方式の）OpenTypeフォント&lt;br /&gt;
&lt;br /&gt;
という流れになる。&lt;br /&gt;
&lt;br /&gt;
「CIDフォント」「PostScriptフォント」「CFFフォント」「Type1フォント」「OpenTypeフォント」など様々な用語があるが、いずれも正確な定義が難しいものばかりであり筆者も正確に理解しているわけではないのでそこは注意して読み進めていただきたい。今回作るものは「CIDキー方式のOpenTypeフォント（CID&amp;amp;#45;keyed OpenType Font）」だが、おそらくCFFフォントでもあり、PostScriptフォントでもあるのではないかと思われる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txで使えるsvgデータ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== txで使えるSVGデータ ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;まず、単体のSVGではフォントとして正しくtxに認識されないので、SVGフォントの形にする必要がある。具体的には、&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;lt;font&amp;amp;gt;タグが最も外側にある状態&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;にする。「SVGフォント」といったときには（例えばFontforgeでフォントとして開く場合）さらに外側に&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;…&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;のようなタグが必要になる場合もあるが、これだとtxには弾かれるので注意が必要である。&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（2023/12/21追記）&amp;lt;strong&amp;gt;改めて試したところ、&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;で囲っても問題なく動いた&amp;lt;/strong&amp;gt;。ただ、FontForgeが出力するSVGフォントのヘッダーの&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE svg PUBLIC &amp;quot;-//W3C//DTD SVG 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&amp;quot; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;があると動かなかったので、上記の内容はおそらくそれを勘違いしたものと思われる。なお、このヘッダがなくてもFontForgeは正しくSVGフォントを開けるが、&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;がないと開けないので、&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;は付けてヘッダーは無しで保存しておくのが最も良さそうである。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;txのエラーメッセージは全体的にあまり丁寧ではなく、例えば入力のsvgに何かおかしい点（※ただしtxによる主観的評価）がある場合は&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;などとしか表示してくれない。デバッグモードもなさそうなので、根気強く原因を探すしかない。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;のような形式の出力については、おそらく最初の二文字（ここでは&amp;lt;code&amp;gt;sv&amp;lt;/code&amp;gt;&amp;amp;#61;svgだが、&amp;lt;code&amp;gt;cf&amp;lt;/code&amp;gt;&amp;amp;#61;cffなどもある）がフォーマットを表し、最後の一文字は&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;がerror、&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;がwarningを表すようである。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;そもそもAFDKO自体に「Adobe社内の業務用ツールが形だけ一般公開されている」ような雰囲気を感じなくもないような…&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば以下は正しくtxに認識される入力のsvgである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;font horiz-adv-x=&amp;quot;1000&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;font-face &lt;br /&gt;
    font-family=&amp;quot;Untitled1&amp;quot;&lt;br /&gt;
    font-weight=&amp;quot;400&amp;quot;&lt;br /&gt;
    font-stretch=&amp;quot;normal&amp;quot;&lt;br /&gt;
    units-per-em=&amp;quot;1000&amp;quot;&lt;br /&gt;
    ascent=&amp;quot;880&amp;quot;&lt;br /&gt;
    descent=&amp;quot;-120&amp;quot;&lt;br /&gt;
    bbox=&amp;quot;0 0 1000 1000&amp;quot;&lt;br /&gt;
    underline-thickness=&amp;quot;50&amp;quot;&lt;br /&gt;
    underline-position=&amp;quot;-100&amp;quot;&lt;br /&gt;
  /&amp;gt;&lt;br /&gt;
&amp;lt;missing-glyph horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;M500 300l150 -300l-300 0zM650 760l-150 -300l-150 300l300 0zM730 760l0 -760l-190 380zM270 760l190 -380l-190 -380l0 760zM200 830l0 -900l600 0l0 900l-600 0z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;0&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;m-100,-100l100,0L0,100C0,200 200,0 200,200 m100,200 c 300,0 0,300 300,300 Zm-150,-150 c 200,100 -100,0 0,100 l-300,-200  l100,200 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;S&amp;quot; horiz-adv-x=&amp;quot;500&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;D&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;system.svg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はsvgを素材としてのみ使用する（フォント名などは後で設定する）のでfont&amp;amp;#45;faceタグの中身はあまり気にしなくてよいと思うが、フォントの高さ範囲を決める&amp;lt;code&amp;gt;ascent&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;descent&amp;lt;/code&amp;gt;は一応正しい値を入力してある。OpenTypeでは通常このようにフォントの高さは1000とする。&lt;br /&gt;
&lt;br /&gt;
以降がフォント本体のデータで、パス（d属性）と水平方向の幅（horiz&amp;amp;#45;adv&amp;amp;#45;x属性）をそれぞれ指定する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;missing&amp;amp;#45;glyph&amp;lt;/code&amp;gt;は普通のフォント用語でいうと&amp;lt;code&amp;gt;.notdef&amp;lt;/code&amp;gt;にあたるもので、文字が無かった時に表示されるいわゆる「豆腐」のことである。他のフォント形式に変換するとこのグリフが&amp;lt;code&amp;gt;.notdef&amp;lt;/code&amp;gt;に割り当てられることになる。このsvgではU+303F（〿、□の中に×が入った形）のような図形が入っている。&lt;br /&gt;
&lt;br /&gt;
それ以降のglyphタグではunicode属性によりどの文字を使用するかを設定している。&amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;のようにd属性がない場合は空白（スペース）を表すことになる（逆にd&amp;amp;#61;””などと書くとエラーになったはず）。幅を見ればわかる通り、Sが半角スペース、Dが全角スペースである。&lt;br /&gt;
&lt;br /&gt;
==== d属性の解釈について ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
txによるd属性の解釈は&amp;lt;strong&amp;gt;ものすごく行儀が悪く&amp;lt;/strong&amp;gt;、エラーメッセージを出さない割に明らかに仕様を満たさない挙動を連発する。&lt;br /&gt;
&lt;br /&gt;
* txの挙動を迅速に確かめるには、&amp;lt;code&amp;gt;tx &amp;amp;#45;pdf input.svg &amp;amp;gt; output.pdf&amp;lt;/code&amp;gt;とpdfに変換して見るのがよい。&lt;br /&gt;
* 以下の不具合に関する具体的な報告はなさそうであるが、[https://github.com/adobe-type-tools/afdko/issues/1567 &amp;amp;#91;tx/SVG&amp;amp;#93; Replace homemade XML parser with LibXML2 for SVG parsing · Issue &amp;amp;#35;1567 · adobe&amp;amp;#45;type&amp;amp;#45;tools/afdko]は関係がありそうなのでこれがfixされれば治る可能性がある。&lt;br /&gt;
&lt;br /&gt;
txの1.3.0（2023年1月現在で多分最新）に関して挙動をまとめる。&lt;br /&gt;
&lt;br /&gt;
まず、正しく解釈できると思われるのは以下の命令である。&lt;br /&gt;
&lt;br /&gt;
* M（絶対座標によるパス開始点の指定）&lt;br /&gt;
* L（絶対座標による直線描画）&lt;br /&gt;
* l（相対座標による直線描画）&lt;br /&gt;
* C（絶対座標による3次ベジェ曲線描画）&lt;br /&gt;
* z, Z（パスを閉じる）&lt;br /&gt;
&lt;br /&gt;
問題なのはc（相対座標による3次ベジェ曲線）で、本来は現在の点が(x, y)であるときに&amp;lt;code&amp;gt;c x1,y1 x2,y2 x3,y3&amp;lt;/code&amp;gt;とすると(x, y)→(x+x1, y+y1)→(x+x2, y+y2)→(x+x3, y+y3)という3次ベジェ曲線が描画されるべきであるが、txでは(x,y) → (x+x1, y+y1) → (x+x1+x2, y+y1+y2) → (x+x1+x2+x3, y+y1+y2+y3) という意味に解釈される。&lt;br /&gt;
&lt;br /&gt;
似たような問題として、パスの開始点（最初やzの直後で使用する）でm（相対座標指定）を使用する場合は、本来は絶対座標として解釈されるべきであるが、txでは直前の座標（zの直前）からの相対位置で計算される。なお、フォントの描画においては必ず閉じたパスを使用する（多分）のでパスの描画途中でMやmを使用することはありえないが、仮に使用した場合、（txでは）その直前にzを付加したのと同じ挙動をするようである。&lt;br /&gt;
&lt;br /&gt;
そして、以下には対応していない。&lt;br /&gt;
&lt;br /&gt;
* V, v, H, h（絶対/相対座標による垂直/水平な直線の描画）&lt;br /&gt;
* Q, q（絶対/相対座標による2次ベジェ曲線描画）&lt;br /&gt;
&lt;br /&gt;
これらはそれぞれL, lとC, cに容易に変換できるので、そのようにしてから渡すべきである。&lt;br /&gt;
&lt;br /&gt;
さらに、svgではデータ量の圧縮のため直前と同じ命令を使用する場合は&amp;lt;code&amp;gt;l 100,100 l 200,200&amp;lt;/code&amp;gt;と書くかわりに&amp;lt;code&amp;gt;l 100,100 200,200&amp;lt;/code&amp;gt;などと略することができるがこれにも対応していない（余ったパラメータは余計なものとして無視される）。&lt;br /&gt;
&lt;br /&gt;
また、svgの仕様では座標データの数字において指数表現（1.2345e&amp;amp;#45;6のような）が許容されているが、これにも対応していない（&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;となる）。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝で使用したsvgに関しては、元データでM,C,Lのみ使っていたおかげかinkscapeの出力でもそれら以外が入ることはないようだったが、指数表現に関してはごく稀に（謎乃明朝全体でも10個以下程度）紛れ込んでいたので&amp;lt;code&amp;gt;sed &amp;amp;#45;r &amp;amp;quot;s/ &amp;amp;#45;?&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;\.&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;&amp;amp;#42;e&amp;amp;#45;&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;+ / 0 /g&amp;amp;quot;&amp;lt;/code&amp;gt;で0に変えた。小数に直すのが筋かもしれないが、OpenTypeではそもそも座標が整数に丸められる気がするのでこれでいいはず。&lt;br /&gt;
&lt;br /&gt;
* Inkscapeが相対座標を使用するかどうかは設定で変えられるらしい。参考&amp;amp;#58; [https://stackoverflow.com/questions/6890685/is-there-a-tool-to-convert-svg-line-paths-from-absolute-to-relative Is there a tool to convert SVG line paths from absolute to relative? &amp;amp;#45; Stack Overflow]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontforgeの出力の修正&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== FontForgeの出力の修正 ====&lt;br /&gt;
&lt;br /&gt;
FontForgeで出力されるsvgには&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;に加えて&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;なども（元データになくても）入ることがあり、これはtxが読めないので修正する。あとtxには関係ないが、PostScriptアウトラインの向きはFontForgeが出力するSVGのアウトラインの向き（＝TrueTypeのアウトラインの向き）と逆なので、この段階で修正しておくとよい。この2点の修正は謎乃明朝の生成スクリプトでは[https://github.com/thednp/svg-path-commander &amp;lt;span&amp;gt;https://github.com/thednp/svg-path-commander&amp;lt;/span&amp;gt;]にやらせている。&lt;br /&gt;
&lt;br /&gt;
== txによる変換 ==&lt;br /&gt;
&lt;br /&gt;
この次で使用するmergefontsは、複数のフォントをマージするコマンドであるが、より正確には「親」となるフォントに「子」となるフォントを統合するコマンドである（ヘルプにも書いてある）。上記のようなsvg形式のフォントは「子」にはなれるが「親」にはなれない。&lt;br /&gt;
&lt;br /&gt;
そこでtxコマンド（fonttoolsのttxと名前が似ているが全く異なるものなので注意）を用いてsvgを「親」として使えるフォーマットに変換する。この際の出力は、&amp;lt;code&amp;gt;&amp;amp;#45;ps&amp;lt;/code&amp;gt;(PostScript形式)、&amp;lt;code&amp;gt;&amp;amp;#45;cff&amp;lt;/code&amp;gt;(CFF形式）、&amp;lt;code&amp;gt;&amp;amp;#45;t1&amp;lt;/code&amp;gt;(Type1形式)などいくつかのオプションが選べるが、&amp;lt;strong&amp;gt;psautohintでヒントを付ける方法を筆者が発見できたのは&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;t1&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;を使った場合のみ&amp;lt;/strong&amp;gt;であった。ヒントを付けないのであれば&amp;amp;#45;cffでも問題なくこの記事の最後まで進むことができる。&amp;amp;#45;psも&amp;amp;#45;cffと同じだったと思う。&lt;br /&gt;
&lt;br /&gt;
ちなみにmergefontsは子としてsvgが指定された場合にはそれを読むために内部的にtxを使用するため、子にしても親にしてもtxが読めるsvgを指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝では、.notdefや空白など一部のシステムグリフ的なものだけを含むsvg（上記のsystem.svg）を親フォントとしてまずType1形式に変換したあと、子フォントとして漢字グリフを統合することにしている。&lt;br /&gt;
&lt;br /&gt;
従ってコマンドとしては以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;tx -t1 system.svg &amp;gt; system.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
参考までに、system.pfaの最初のほうは以下のようになっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;%!FontType1-1.1: Untitled1&lt;br /&gt;
%ADOt1write: (1.0.35)&lt;br /&gt;
%%Copyright: Copyright 2023 Adobe System Incorporated. All rights reserved.&lt;br /&gt;
%%BeginResource: font Untitled1&lt;br /&gt;
12 dict dup begin&lt;br /&gt;
/FontType 1 def&lt;br /&gt;
/FontName /Untitled1 def&lt;br /&gt;
/FontInfo 4 dict dup begin&lt;br /&gt;
/FullName (Untitled1) def&lt;br /&gt;
end def&lt;br /&gt;
/PaintType 0 def&lt;br /&gt;
/FontMatrix [0.001 0 0 0.001 0 0] def&lt;br /&gt;
/Encoding 256 array&lt;br /&gt;
0 1 255 {1 index exch /.notdef put} for&lt;br /&gt;
def&lt;br /&gt;
/FontBBox {-100 -100 950 1050} def&lt;br /&gt;
end&lt;br /&gt;
currentfile eexec BAB431EA06BB0A1031E1AA11919E714AC6968FC4C8AFEB&lt;br /&gt;
5F1C717DAFACA48FA00303519D5ACA187D3A7A07245E6211EF0746489B63BDB8&lt;br /&gt;
0250FD69171FFE98581843A94F9CCED81A25205CD6D774793B21300079565F0A&lt;br /&gt;
...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== mergefonts ==&lt;br /&gt;
&lt;br /&gt;
次にmergefontsを使ってCIDフォントを作る。CIDフォントを作る場合は、コマンドの構文は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts -cid [cidfontinfo] [output] [font1.map] [font1] [font2.map] [font2] ...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
cidfontinfoはフォントに関していくつかの情報を設定するファイルで、今回は以下のものを使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;FontName       (NazoMin)&lt;br /&gt;
FullName       (NazoMin Unknown)&lt;br /&gt;
FamilyName     (NazoMin)&lt;br /&gt;
Weight         (Unknown)&lt;br /&gt;
version        (1.000)&lt;br /&gt;
Registry       (Adobe)&lt;br /&gt;
Ordering       (Identity)&lt;br /&gt;
Supplement     0&lt;br /&gt;
AdobeCopyright (Public Domain)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
細かい部分の効果はわからないが（詳しくは[https://shiromoji.hatenablog.jp/entry/20111206/1323270030 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 前篇：AFDKOのインストールとmergeFonts &amp;amp;#45; しろもじメモランダム]）、とりあえずこれで問題なく先に進めるだろう。FontName（&amp;lt;strong&amp;gt;Postscript名&amp;lt;/strong&amp;gt;）の「NazoMin」の部分は後で使用するので覚えておくこと。FullNameとFamilyNameについては最終的にどのように反映されるのかよくわかっていない。&lt;br /&gt;
&lt;br /&gt;
* Postscript名は、フォントの名前の一種であるが、あまりユーザーが目にすることはない。Postscript名では、空白を使用してはいけない。たとえば[https://github.com/adobe-fonts/source-han-code-jp/blob/master/Normal/cidfontinfo source&amp;amp;#45;han&amp;amp;#45;code&amp;amp;#45;jp/cidfontinfo at master · adobe&amp;amp;#45;fonts/source&amp;amp;#45;han&amp;amp;#45;code&amp;amp;#45;jp]のようにハイフンに置き換えられていることが多い。また、「+」は禁止ではないようだが、今回使用するhintcidfont.plは対応していない。フォント名に「+」が入っている代表的なフォントである「M+フォント」の一種[https://fonts2u.com/m-2m-regular.font M+ 2m regular font]においても、Postscript名は「mplus」となっているようである。&lt;br /&gt;
&lt;br /&gt;
outputで指定するファイル名は何でもいいが、そのままではまだ使えない「生」のCIDフォントということで「.raw」という拡張子を使う場合もあるようである。今回であればType 1が出力されるので.pfaとしてもよいだろう。&lt;br /&gt;
&lt;br /&gt;
==== mapファイルと素材フォント ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
では、残るmapファイルと素材フォントの部分について解説する。三点リーダ&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;で示した通り、この&amp;lt;code&amp;gt;&amp;amp;#91;font1.map&amp;amp;#93; &amp;amp;#91;font1&amp;amp;#93;&amp;lt;/code&amp;gt;のペアはいくらでも多く指定してよい。この部分がフォントの本体部分を形作ることになる。&lt;br /&gt;
&lt;br /&gt;
最初のペアとして指定されたものが前述の「親フォント」ということになる。ここにType1フォントを指定すれば出力もType1になるし、CFFフォントを指定すればCFFになる。&lt;br /&gt;
&lt;br /&gt;
今回は親フォントとして先ほどのsystem.pfaを使用する。&lt;br /&gt;
&lt;br /&gt;
以下がそれに対応するmapファイルの例（system.map）である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts NazoMin-System&lt;br /&gt;
0 .notdef&lt;br /&gt;
1 S&lt;br /&gt;
633 D&lt;br /&gt;
8720 S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;system.map&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ファイルの最初にはこのようにmergeFontsという語が必要であり、その後にFDArray要素（この用語は後のヒント情報付加のところでまた出てくる）の名前を書く。&amp;lt;strong&amp;gt;ここではcidfontinfoで使用した&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NazoMin&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という（任意の）識別子にハイフンを付加してさらに別の（後でも使用する任意の）識別子である&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;を追加した&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NazoMin&amp;amp;#45;System&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という名前を指定している。このようにしないと、ヒント情報を付加するスクリプトである&amp;lt;/strong&amp;gt;[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl &amp;lt;strong&amp;gt;https&amp;amp;#58;//github.com/adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts/blob/master/hintcidfont.pl&amp;lt;/strong&amp;gt;]&amp;lt;strong&amp;gt;が正しく使えない&amp;lt;/strong&amp;gt;。これはどこを見てもあまりはっきりとは書かれおらず、最終的にスクリプトのソースを読んでわかったことなので注意が必要である（スクリプトの説明をよく読むと一応「the CIDFontName plus a unique identifier」などと書いてあるのだが、ハイフンを間に入れるという説明は全くない）。ただし、これはそうしないとこのスクリプトが使えないというだけであって、CIDフォントの仕様上必要というわけではない（多分）。ただ実際、多くのCIDフォント（例えば源ノ角ゴシックなど）ではこのような命名がされている気がする。&lt;br /&gt;
&lt;br /&gt;
2行目以降が、CIDからグリフへの対応を記述したものである。&lt;br /&gt;
&lt;br /&gt;
* 以下のように、x番目のCIDという意味で「CID+x」と書くことが多い&lt;br /&gt;
&lt;br /&gt;
まず2行目で、CID+0に先ほどのSVGのmissing&amp;amp;#45;glyphが割り当てられる。CIDフォント（少なくともCID形式のOpenTypeフォント？）ではCID+0は必ず含める必要があり、これが「豆腐」グリフとなる。&lt;br /&gt;
&lt;br /&gt;
3&amp;amp;#45;5行目により、CID+1とCID+8720には半角スペース（ただし後者は縦書き用として使用する。後のmakeotfの節も参照）、CID+633に全角スペースが割り当てられる。これは[https://github.com/adobe-type-tools/Adobe-Japan1 Adobe&amp;amp;#45;Japan1]に従ったものであるが、Adobe&amp;amp;#45;Japan1準拠のフォントを作るのでなければ（CID+0とは違って）必ずしもこのようにする必要はないはず。ただ、（現在はリンク切れとなっているのでweb archiveのURLを貼るが）[http://web.archive.org/web/20130225051414/http://d.hatena.ne.jp/mashabow/20120306/1331028598 花園明朝OTを0.510に更新、IVD 2012&amp;amp;#45;03&amp;amp;#45;02版に対応 &amp;amp;#45; しろもじメモランダム]において、「Windowsでは、CFFアウトラインのOpenTypeフォントのGSUBテーブルにvrt2 featureが定義されていないのにvhea/vmtxテーブルがあると、OSに不正なフォントして弾かれます。」との情報があり、[http://web.archive.org/web/20161115085209/http://shiromoji.net/font/HanaMinOT/ 花園明朝OT]ではこれに対応するためにこの3グリフを追加したとされている。そこで謎乃明朝でも一応この通りにしている（ただし謎乃明朝+では漢字と範囲を分けるためにCIDの割り当てを1, 633, 8720からそれぞれ1, 100, 101に変えている）。&lt;br /&gt;
&lt;br /&gt;
このファイルを見てわかる通り、ソースフォントの同じ文字を複数のCIDで使用しても構わない（その分データは増えるはず）（[https://github.com/adobe-type-tools/Adobe-Japan1/blob/master/README-JP.md Adobe&amp;amp;#45;Japan1/README&amp;amp;#45;JP.md at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/Adobe&amp;amp;#45;Japan1] の 「重複した漢字グリフ」もその一例）。CIDの部分は0000,00001のように先頭にいくつか0が付いていても構わない。&lt;br /&gt;
&lt;br /&gt;
次に、「子」として使用するmapファイルとSVGファイル（今回は子は1つだけなので1つずつ）をそれぞれ見てみよう。謎乃明朝には数万文字の漢字が収録されているが、ここでは解説に適した6グリフのみ収録したサンプルを使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts NazoMin-Ideographs&lt;br /&gt;
14197 u8279-j&lt;br /&gt;
14198 ufa5e&lt;br /&gt;
14199 ufa5d&lt;br /&gt;
24000 u20000-jv&lt;br /&gt;
24001 u20000-ue0101&lt;br /&gt;
24002 u20000-ue0102&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;kanjisample.map&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;font id=&amp;quot;Untitled1&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;font-face &lt;br /&gt;
    font-family=&amp;quot;Untitled1&amp;quot;&lt;br /&gt;
    font-weight=&amp;quot;400&amp;quot;&lt;br /&gt;
    font-stretch=&amp;quot;normal&amp;quot;&lt;br /&gt;
    units-per-em=&amp;quot;1000&amp;quot;&lt;br /&gt;
    ascent=&amp;quot;880&amp;quot;&lt;br /&gt;
    descent=&amp;quot;-120&amp;quot;&lt;br /&gt;
    bbox=&amp;quot;0 0 1000 1000&amp;quot;&lt;br /&gt;
    underline-thickness=&amp;quot;50&amp;quot;&lt;br /&gt;
    underline-position=&amp;quot;-100&amp;quot;&lt;br /&gt;
  /&amp;gt;&lt;br /&gt;
&amp;lt;missing-glyph horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;M50,0l900,0l0,533l-900,0 z M100,50l0,433l800,0l0,-433z&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u8279-j&amp;quot; d=&amp;quot;M 321.5 247.15039 L 321.5 411.21289 L 43.25 411.21289 L 43.25 436.41211 L 321.5 436.41211 L 321.5 562.9375 L 321.5 578.6875 L 321.5 600.38867 L 383.93359 588.48633 C 415.96232 582.32437 417.82989 565.93743 384.5 555.52148 L 384.5 436.41211 L 615.5 436.41211 L 615.5 562.9375 L 615.5 578.6875 L 615.5 600.38867 L 677.93359 588.48633 C 709.96232 582.32437 711.82989 565.93743 678.5 555.52148 L 678.5 436.41211 L 843.34961 436.41211 L 893.75 486.8125 L 956.75 436.41211 L 956.75 411.21289 L 678.5 411.21289 L 678.5 272.34961 L 615.5 247.15039 L 615.5 411.21289 L 384.5 411.21289 L 384.5 272.34961 L 321.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;ufa5e&amp;quot; d=&amp;quot;M 279.5 247.15039 L 279.5 411.21289 L 43.25 411.21289 L 43.25 436.41211 L 279.5 436.41211 L 279.5 562.9375 L 279.5 578.6875 L 279.5 600.38867 L 341.93359 588.48633 C 373.96232 582.32437 375.82989 565.93743 342.5 555.52148 L 342.5 436.41211 L 360.34961 436.41211 L 410.75 486.8125 L 473.75 436.41211 L 473.75 411.21289 L 342.5 411.21289 L 342.5 272.34961 L 279.5 247.15039 z M 657.5 247.15039 L 657.5 411.21289 L 526.25 411.21289 L 526.25 436.41211 L 657.5 436.41211 L 657.5 562.9375 L 657.5 578.6875 L 657.5 600.38867 L 719.93359 588.48633 C 751.96232 582.32437 753.82989 565.93743 720.5 555.52148 L 720.5 436.41211 L 843.34961 436.41211 L 893.75 486.8125 L 956.75 436.41211 L 956.75 411.21289 L 720.5 411.21289 L 720.5 272.34961 L 657.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;ufa5d&amp;quot; d=&amp;quot;M 342.5 247.15039 L 342.5 415.15039 L 43.25 415.15039 L 43.25 440.34961 L 342.5 440.34961 L 342.5 564.25 L 342.5 580 L 342.5 601.70117 L 404.93359 589.79883 C 436.96232 583.63687 438.82989 567.24993 405.5 556.83398 L 405.5 272.34961 L 342.5 247.15039 z M 594.5 247.15039 L 594.5 564.25 L 594.5 580 L 594.5 601.70117 L 656.93359 589.79883 C 688.96232 583.63687 690.82989 567.24993 657.5 556.83398 L 657.5 440.34961 L 843.34961 440.34961 L 893.75 490.75 L 956.75 440.34961 L 956.75 415.15039 L 657.5 415.15039 L 657.5 272.34961 L 594.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-jv&amp;quot; d=&amp;quot;M 143 -31.099609 L 143 480.25 L 201.80078 450.84961 L 473.75 450.84961 L 473.75 756.40039 L 80 756.40039 L 80 781.59961 L 806.59961 781.59961 L 857 832 L 920 781.59961 L 920 756.40039 L 536.75 756.40039 L 536.75 385.75 L 473.75 360.55078 L 473.75 425.65039 L 206 425.65039 L 206 57.099609 L 775.09961 57.099609 L 825.5 107.5 L 888.5 57.099609 L 888.5 31.900391 L 206 31.900391 L 206 -5.9003906 L 143 -31.099609 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-ue0101&amp;quot; d=&amp;quot;M 143 -36.349609 L 143 417.25 L 201.80078 387.84961 L 468.5 387.84961 L 468.5 640.90039 L 80 640.90039 L 80 666.09961 L 468.5 666.09961 L 468.5 805.75 L 468.5 821.5 L 468.5 843.20117 L 530.93359 831.29883 C 562.86375 825.15583 564.51051 808.89709 531.5 798.47656 L 531.5 666.09961 L 806.59961 666.09961 L 857 716.5 L 920 666.09961 L 920 640.90039 L 531.5 640.90039 L 531.5 322.75 L 468.5 297.55078 L 468.5 362.65039 L 206 362.65039 L 206 51.849609 L 780.34961 51.849609 L 830.75 102.25 L 893.75 51.849609 L 893.75 26.650391 L 206 26.650391 L 206 -11.150391 L 143 -36.349609 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-ue0102&amp;quot; d=&amp;quot;M 143 -43.123047 L 143 395.38281 L 201.79688 365.98438 L 473.75 365.98438 L 473.75 601.78711 L 95.75 601.78711 L 95.75 626.98828 L 817.10156 626.98828 L 867.5 677.38672 L 930.5 626.98828 L 930.5 601.78711 L 536.75 601.78711 L 536.75 300.88281 L 473.75 275.68359 L 473.75 340.7832 L 206 340.7832 L 206 45.078125 L 775.10156 45.078125 L 825.5 95.476562 L 888.5 45.078125 L 888.5 19.876953 L 206 19.876953 L 206 -17.921875 L 143 -43.123047 z M 500 706 C 469.39653 706.23029 444.875 730.37828 444.875 761.125 C 444.875 791.87172 469.39653 816.01971 500 816.25 C 530.60347 816.01971 555.125 791.87172 555.125 761.125 C 555.125 730.37828 530.60347 706.23029 500 706 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;kanjisample.svg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
先ほどと違ってsvgにおいて各グリフにunicode属性ではなく&amp;lt;strong&amp;gt;glyph&amp;amp;#45;name属性&amp;lt;/strong&amp;gt;を指定していることに注意。system.svgではType1への変換を経由しているのでunicodeを指定してそれをグリフ名として使う必要があったが、svgフォントを直接指定する場合はglyph&amp;amp;#45;nameがかわりに使えるようである（unicodeでも探してくれるかもしれないが確かめていない）。「glyph&amp;amp;#45;00001」のようにunicodeとは全く無関係の識別子でも自由に使えるので便利である。ここではglyph&amp;amp;#45;nameとしてGlyphWikiでのグリフ名を使用している（例えばu8279&amp;amp;#45;jは[https://glyphwiki.org/wiki/u8279-j?view=all u8279&amp;amp;#45;j (艹) &amp;amp;#45; GlyphWiki]の字形である）。&lt;br /&gt;
&lt;br /&gt;
またmapファイルのFDArray要素の名前としては&amp;lt;code&amp;gt;NazoMin&amp;amp;#45;Ideographs&amp;lt;/code&amp;gt;と、先ほどの&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;とは異なり&amp;lt;code&amp;gt;Ideographs&amp;lt;/code&amp;gt;という識別子を使っている。これも後で使う。&lt;br /&gt;
&lt;br /&gt;
今後の説明でも必要になるので上記で例として使用している字について一通り説明しておこう。以下が&amp;lt;code&amp;gt;tx &amp;amp;#45;pdf kanjisample.svg &amp;amp;gt; kanjisample.pdf&amp;lt;/code&amp;gt;で出力されるpdfである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/kanjisample.pdf.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
見ての通り、最初の3文字は「くさかんむり」であるが、微妙に字形が異なる。&lt;br /&gt;
&lt;br /&gt;
この3グリフは（記事執筆時点の）GlyphWikiにおいてそれぞれ以下のUnicodeコードポイントや異体字シーケンスが割り当てられている。（ここでは異体字について詳しく解説はしないが、以下の意味がすんなり理解できるようになれば異体字マスターといっても過言ではない（？）。「異体字セレクタ」「Adobe&amp;amp;#45;Japan1」「CJK部首補助」などの語で適宜検索すること。）&lt;br /&gt;
&lt;br /&gt;
# つながった字形…CJK部首補助&amp;lt;code&amp;gt;U+2EBE&amp;lt;/code&amp;gt;（⺾）、CJK統合漢字&amp;lt;code&amp;gt;U+8279&amp;lt;/code&amp;gt;（艹）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0100&amp;lt;/code&amp;gt;（艹󠄀）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0105&amp;lt;/code&amp;gt;（艹󠄅）&lt;br /&gt;
# 「十」が2つの字形…CJK部首補助&amp;lt;code&amp;gt;U+2EBF&amp;lt;/code&amp;gt;（⺿）、CJK互換漢字&amp;lt;code&amp;gt;U+FA5E&amp;lt;/code&amp;gt;（艹）、それに対応するSVSである&amp;lt;code&amp;gt;U+8279 U+FE01&amp;lt;/code&amp;gt;（艹︁）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0102&amp;lt;/code&amp;gt;（艹󠄂）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0104&amp;lt;/code&amp;gt;（艹󠄄）&lt;br /&gt;
# 「T」が背中合わせの字形…CJK部首補助&amp;lt;code&amp;gt;U+2EC0&amp;lt;/code&amp;gt;（⻀）、CJK互換漢字&amp;lt;code&amp;gt;U+FA5D&amp;lt;/code&amp;gt;（艹）、それに対応するSVSである&amp;lt;code&amp;gt;U+8279 U+FE00&amp;lt;/code&amp;gt;（艹︀）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0101&amp;lt;/code&amp;gt;（艹󠄁）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0103&amp;lt;/code&amp;gt;（艹󠄃）&lt;br /&gt;
&lt;br /&gt;
以上の通りこれらは全てAdobe&amp;amp;#45;Japan1コレクションに含まれている字であるため、游明朝などAdobe&amp;amp;#45;Japan1準拠のフォントでは、上記のうち「Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS」となっているもの以外は全て正しく表示できるはずである。カッコ内をコピペして試してみるとよい。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝では、現時点では（2フォントに分ける前提で）グリフ数に多少余裕があるので、一応Adobe&amp;amp;#45;Japan1に従ってCID+14197, CID+14198, CID+14199をそれぞれ割り当てているが、Adobe&amp;amp;#45;Japan1準拠のフォントを作るのでなければこうする必要はなく、CID+1から順に漢字で埋めても構わないはず。&lt;br /&gt;
&lt;br /&gt;
その次の3文字は、U+20000（𠀀）の異体字である。Unicodeの20000&amp;amp;#45;2FFFFは「追加漢字面」（SIP）と呼ばれ、日本で普段使われることはない漢字が大半である（「𩸽（ほっけ）」など例外もある）。この範囲の文字を例に含めたのは、BMP外のUnicode文字はサポートが不十分なソフトも多い中で、AFDKOを使えばきちんと対応できる、ということを示すためである。&lt;br /&gt;
&lt;br /&gt;
こちらの割り当ては先ほどよりはずいぶん単純である。GlyphWikiでは、最初のu20000&amp;amp;#45;jvが&amp;lt;code&amp;gt;U+20000&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;U+20000 U+E0100&amp;lt;/code&amp;gt;、次のu20000&amp;amp;#45;ue0101が&amp;lt;code&amp;gt;U+20000 U+E0101&amp;lt;/code&amp;gt;、その次のu20000&amp;amp;#45;ue0102が&amp;lt;code&amp;gt;U+20000 U+E0102&amp;lt;/code&amp;gt;で使われている（後の2つは名前からして当然であるが）。これらは全てMoji_JohoコレクションのIVS異体字であり、U+20000自体もAdobe&amp;amp;#45;Japan1には含まれていないので、正しく表示するには謎乃明朝、花園明朝あるいはIPAmj明朝などが必要だろう。ここでは一応、Adobe&amp;amp;#45;Japan1のCID（現在23059まで定義されている）と被らないよう、24000以降を割り当てている（もちろんそうする必要はない。）&lt;br /&gt;
&lt;br /&gt;
なお、ここではSVS・IVSに対応したフォントを作成するが、Variation Selectorは特殊文字なので、それ自体にグリフを割り当てる必要はない。&lt;br /&gt;
&lt;br /&gt;
==== 出力 ====&lt;br /&gt;
&lt;br /&gt;
ここまで理解したら、以下のようにコマンドを実際に実行してみよう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ mergefonts -cid cidfontinfo merged.pfa system.map system.pfa kanjisample.map kanjisample.svg&lt;br /&gt;
mergefonts: --- system.pfa&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-0&amp;gt;&lt;br /&gt;
Adding font dict 0 from system.pfa.&lt;br /&gt;
mergefonts: --- kanjisample.svg&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14197&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14198&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14199&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-24000&amp;gt;&lt;br /&gt;
Adding font dict 1 from kanjisample.svg.&lt;br /&gt;
mergefonts: (cfw) There are 2 additional reports of &#039;unhinted&#039;.&lt;br /&gt;
&lt;br /&gt;
mergefonts: --- merged.pfa&lt;br /&gt;
mergefonts: (cfr) /BlueValues missing: FD[1]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;unhinted&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;/BlueValues missing&amp;amp;#58; FD&amp;amp;#91;1&amp;amp;#93;&amp;lt;/code&amp;gt;などとwarning/errorが出ているが、あとでヒントを追加するので無視でよい（多分）（SVGに直接BlueValuesを追加する方法があってもおかしくはないと思うが見つけられなかった）。&lt;br /&gt;
&lt;br /&gt;
生成されたmerged.pfaを再びtxでpdfにしてみると以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/merged.pdf.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、各CIDに意図した字形が割り当てられていることがわかるだろう。しかし、それらのCIDがどの文字に対応するものなのかという情報は全く含まれていないので、これはまだ実際に使用できるフォントではない。&lt;br /&gt;
&lt;br /&gt;
== ヒントの付加 ==&lt;br /&gt;
&lt;br /&gt;
次に、このフォントにヒントを付加する。ヒントというのは、フォントをラスタライズ（実際にピクセルに変換して描画）する際に、線の太さなどを調節して見やすくするための機能であり、特に小さいサイズで表示したときの見た目に大きく影響する。日本語情報はあまりないが、Fontforge関連でいくつか見つけることができる。またBlueValuesやStdHWなど個々の値の仕様に関しては[https://kikakurui.com/x4/X4163-1994-01.html https&amp;amp;#58;//kikakurui.com/x4/X4163&amp;amp;#45;1994&amp;amp;#45;01.html]で日本語で読める。個人的にもあまりヒントの動作についてはよくわかっていないので、ここでは最低限のやり方だけ述べる。&lt;br /&gt;
&lt;br /&gt;
ちなみにこの記事では扱わないがAFDKOにはrotatefontというグリフを（ヒント情報含めて）自動で回転させてくれるコマンドがあり、これを使った場合にもその後で改めてpsautohintを実行するのが望ましいようである（参考 &amp;amp;#58;[https://aznote.jakou.com/afdko/anti02.html アンチックフォントを作る&amp;amp;#58; グリフの変形と合成]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hitcidfontplを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== hitcidfont.plを使う ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ヒントの付加はpsautohintというプログラムで行うが、psautohintが動作するためには、&amp;lt;strong&amp;gt;BlueValues&amp;lt;/strong&amp;gt;という値だけは最低限手動で設定しなければいけないようである。そこで、[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl perl&amp;amp;#45;scripts/hintcidfont.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts]を用いて、先ほど生成したmerged.pfaにBlueValues（やその他、必須ではないパラメータ）を付加する。&lt;br /&gt;
&lt;br /&gt;
このスクリプトは（今回であれば）以下のように使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;hintcidfont.pl hintparam.txt &amp;lt; merged.pfa &amp;gt; merged_out.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
前述の通りpfaフォント（ファイルの先頭がああいう感じのやつ）以外には使えないようである。この&amp;lt;code&amp;gt;hintparam.txt&amp;lt;/code&amp;gt;がBlueValuesなどを指定するファイルで、ここで先ほどFDArray要素の名前で使用した&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Ideographs&amp;lt;/code&amp;gt;を使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;System&lt;br /&gt;
/BlueValues [-250 -250 1100 1100] def&lt;br /&gt;
/StdHW [100] def&lt;br /&gt;
/StdVW [100] def&lt;br /&gt;
&lt;br /&gt;
Ideographs&lt;br /&gt;
/BlueValues [-100 -200 1100 1100] def&lt;br /&gt;
/StdHW [70] def&lt;br /&gt;
/StdVW [100] def&lt;br /&gt;
/StemSnapH [70 80 60 90 50 40] def&lt;br /&gt;
/StemSnapV [80 70 90 60 100 50 110] def&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;hintparams.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、FDArray要素ごとに自動ヒント付けのための情報を付加できる。&lt;br /&gt;
&lt;br /&gt;
前述のようにBlueValuesは最低限必要で、これは確かフォントがラスタ化されるときの最大のバウンディングボックスを指定するものなので、該当のFDArrayに含まれるグリフのバウンディングボックスより大きければ大丈夫だと思う。今回のように1000x1000で漢字のみ入れるような場合は適当に&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#45;250 &amp;amp;#45;250 1100 1100&amp;amp;#93;&amp;lt;/code&amp;gt;などとしておけばよいはず。&lt;br /&gt;
&lt;br /&gt;
StdHWとStdVWは水平方向のステムの（垂直方向の）幅と垂直方向のステムの（水平方向の）幅の目安（？）をそれぞれ指定するものである。明朝なら横線のほうが細いということで、ここでは何となくStdHWを70、StdVWを100としているが、効果がどうなのかはよくわかっていない。StemSnapHとStemSnapVは、StdHWとStdVWと似ているが、より細かい精度でガイドラインを設定するような感じのやつである。あまり情報がなくてよくわからないので、かなり適当に設定していて、本当は小さい順に並べる必要があったりするのかもしれない。&lt;br /&gt;
&lt;br /&gt;
まあ言ってしまえば、見た目を追求するなら本来は手動でヒント付けを行うべきである（多分）。他の設定例は[https://ccjktype.fonts.adobe.com/wp-content/uploads/2012/06/afdko-lunde-20120625.pdf https&amp;amp;#58;//ccjktype.fonts.adobe.com/wp&amp;amp;#45;content/uploads/2012/06/afdko&amp;amp;#45;lunde&amp;amp;#45;20120625.pdf] なども参照。&lt;br /&gt;
&lt;br /&gt;
上手くいけば、以下のような出力とともにこれらの値が付加されたpfaファイルが生成される。テキストエディタで開いてみると、pfaファイルの上の方に&amp;lt;code&amp;gt;/BlueValues &amp;amp;#91;&amp;amp;#45;250 &amp;amp;#45;250 1100 1100&amp;amp;#93; def&amp;lt;/code&amp;gt;などと書きこまれているのがわかる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ hintcidfont.pl hintparam.txt &amp;lt; merged.pfa &amp;gt; merged_out.pfa&lt;br /&gt;
Detected CIDFontName: NazoMin&lt;br /&gt;
Modifying System hinting parameters...&lt;br /&gt;
Modifying Ideographs hinting parameters...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ここまでの記事に従っていれば大丈夫かと思うが、何も出なかったらおそらくどこかが間違っているのでpfaファイルの中身やスクリプトのソースを読んでみるなどして確認すること。&lt;br /&gt;
&lt;br /&gt;
==== psautohintの実行 ====&lt;br /&gt;
&lt;br /&gt;
では次にpsautohintを実行する。オプションなどは筆者がよくわかっていないので、今回は以下を実行するだけである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;psautohint merged_out.pfa -o hinted.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
今回はグリフ数が少ないのですぐに終わるが、数万グリフあるとなると数分ほどかかる処理である。&lt;br /&gt;
&lt;br /&gt;
手元ではたまに&amp;lt;code&amp;gt;ERROR&amp;amp;#58; cid51649&amp;amp;#58; Possible loop in element that goes from 109 46 to 109 47. Please check.&amp;lt;/code&amp;gt;（あるいは稀に&amp;lt;code&amp;gt;ERROR&amp;amp;#58; cid45515&amp;amp;#58; Check for duplicate subpath at 128 758&amp;lt;/code&amp;gt;）などと出る字もあるのだが特に見た目は問題無さそうなので無視している。&lt;br /&gt;
&lt;br /&gt;
== makeotfの準備 ==&lt;br /&gt;
&lt;br /&gt;
ここまででグリフのデータは完成したので、実際に使えるフォントにするためのmakeotfの実行に向けて準備を行う。&lt;br /&gt;
&lt;br /&gt;
基本的には、それぞれの文字（Unicode符号位置）でどのCIDを使用するかという&amp;lt;strong&amp;gt;CMap&amp;lt;/strong&amp;gt;が最も重要で、これさえあれば一通り使えるフォントにはなるが、ここでは（先ほど説明した）異体字セレクタも使えるようにSequenceファイルも使用する。OpenType featureに関しては（自分があまりよくわかっていないので）フォントの高さなど最低限の設定のみ行う。他にもGSUB・GPOSをはじめ様々な面白いfeatureがあるので調べてみてほしい。また、フォント名の設定のためFontMenuNameDBというファイルも使用する。&lt;br /&gt;
&lt;br /&gt;
これらについては[https://shiromoji.hatenablog.jp/entry/20111210/1323520587 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 後篇：makeotf &amp;amp;#45; しろもじメモランダム]も参考になる。また[https://github.com/adobe-fonts/source-han-sans &amp;lt;span&amp;gt;https://github.com/adobe-fonts/source-han-sans&amp;lt;/span&amp;gt;]や[https://github.com/adobe-type-tools/Adobe-Japan1 &amp;lt;span&amp;gt;https://github.com/adobe-type-tools/Adobe-Japan1&amp;lt;/span&amp;gt;]にも例がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontmenunamedb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== FontMenuNameDB ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;[NazoMin]&lt;br /&gt;
  f=NazonoMincho&lt;br /&gt;
  s=Regular&lt;br /&gt;
  l=NazonoMincho Regular&lt;br /&gt;
&lt;br /&gt;
  f=3,1,0x411,\8B0E\4E43\660E\671D&lt;br /&gt;
  s=3,1,0x411,Regular&lt;br /&gt;
  l=3,1,0x411,\8B0E\4E43\660E\671D Regular&lt;br /&gt;
&lt;br /&gt;
  f=1,1,11,\93\E4\94\54\96\BE\92\A9&lt;br /&gt;
  s=1,1,11,Regular&lt;br /&gt;
  l=1,1,11,\93\E4\94\54\96\BE\92\A9 Regular&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;FontMenuNameDB&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、先ほど使用したPostScript名である&amp;lt;code&amp;gt;NazoMin&amp;lt;/code&amp;gt;を先頭に書き、フォント名を設定する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\8B0E\4E43\660E\671D&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;\93\E4\94\54\96\BE\92\A9&amp;lt;/code&amp;gt;はそれぞれWinとMacのエンコーディングで「謎乃明朝」を表す。少なくともWindowsに関しては、UTF&amp;amp;#45;16のサロゲートペアを用いればBMP外文字でも指定できるようである（例えば先ほどのU+20000なら&amp;lt;code&amp;gt;\D840\DC00&amp;lt;/code&amp;gt;）が、やめておいた方が無難だろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmap&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== CMap ====&lt;br /&gt;
&lt;br /&gt;
CMapは、各UnicodeのためにどのCIDを使用するかを指定するもので、フォントの根幹部分を決める重要なファイルである。日本語の「、。」のような縦と横で字形（位置）が異なる文字のために縦書き用CMapが必要なこともあるが、今回は漢字だけなので、とりあえず横書きだけ指定しておけばあとはmakeotfがやってくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;%!PS-Adobe-3.0 Resource-CMap&lt;br /&gt;
%%DocumentNeededResources: ProcSet (CIDInit)&lt;br /&gt;
%%IncludeResource: ProcSet (CIDInit)&lt;br /&gt;
%%BeginResource: CMap (NazoMinCMAP-UTF32-H)&lt;br /&gt;
%%Title: (NazoMinCMAP-UTF32-H Adobe Identity 0)&lt;br /&gt;
%%Version: 2.004&lt;br /&gt;
%%Copyright: -----------------------------------------------------------&lt;br /&gt;
%%Copyright: (省略)&lt;br /&gt;
%%Copyright: -----------------------------------------------------------&lt;br /&gt;
%%EndComments&lt;br /&gt;
&lt;br /&gt;
/CIDInit /ProcSet findresource begin&lt;br /&gt;
&lt;br /&gt;
12 dict begin&lt;br /&gt;
&lt;br /&gt;
begincmap&lt;br /&gt;
&lt;br /&gt;
/CIDSystemInfo 3 dict dup begin&lt;br /&gt;
  /Registry (Adobe) def&lt;br /&gt;
  /Ordering (Identity) def&lt;br /&gt;
  /Supplement 0 def&lt;br /&gt;
end def&lt;br /&gt;
&lt;br /&gt;
/CMapName /NazoMinCMAP-UTF32-H def&lt;br /&gt;
/CMapVersion 2.004 def&lt;br /&gt;
/CMapType 1 def&lt;br /&gt;
&lt;br /&gt;
/WMode 0 def&lt;br /&gt;
&lt;br /&gt;
1 begincodespacerange&lt;br /&gt;
  &amp;lt;00000000&amp;gt; &amp;lt;0010FFFF&amp;gt;&lt;br /&gt;
endcodespacerange&lt;br /&gt;
&lt;br /&gt;
1 beginnotdefrange&lt;br /&gt;
&amp;lt;00000000&amp;gt; &amp;lt;0000001f&amp;gt; 1&lt;br /&gt;
endnotdefrange&lt;br /&gt;
&lt;br /&gt;
6 begincidchar&lt;br /&gt;
&amp;lt;00000020&amp;gt; 1&lt;br /&gt;
&amp;lt;00003000&amp;gt; 633&lt;br /&gt;
&amp;lt;00008279&amp;gt; 14197&lt;br /&gt;
&amp;lt;0000fa5d&amp;gt; 14199&lt;br /&gt;
&amp;lt;0000fa5e&amp;gt; 14198&lt;br /&gt;
&amp;lt;00020000&amp;gt; 24000&lt;br /&gt;
endcidchar&lt;br /&gt;
&lt;br /&gt;
1 begincidrange&lt;br /&gt;
&amp;lt;00002ebe&amp;gt; &amp;lt;00002ec0&amp;gt; 14197&lt;br /&gt;
endcidrange&lt;br /&gt;
&lt;br /&gt;
endcmap&lt;br /&gt;
CMapName currentdict /CMap defineresource pop&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%%EndResource&lt;br /&gt;
%%EOF&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;NazoMinCMAP-UTF32-H&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このような感じで、unicode位置（このファイルはUTF32版である）からCIDへの対応関係を記述する。&lt;br /&gt;
&lt;br /&gt;
なお、begincidrangeはbegincidcharがCID・Unicode位置ともに連続しているときに楽に指定するためのものである。また、begincidcharやbegincidrangeによる1つのブロックまでには最大100個（上記では1や6になっている）までしか情報を入れられない。従って、機械的にCMapを生成するときは、以下のように全て&amp;lt;code&amp;gt;1 begincidchar ... endcidchar&amp;lt;/code&amp;gt;で指定してしまうのが楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;...&lt;br /&gt;
1 begincidchar&lt;br /&gt;
&amp;lt;00008279&amp;gt; 14197&lt;br /&gt;
endcidchar&lt;br /&gt;
1 begincidchar&lt;br /&gt;
&amp;lt;00002ebe&amp;gt; 14197&lt;br /&gt;
endcidchar&lt;br /&gt;
...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
その上で、サイズを削減したいときは、[https://github.com/adobe-type-tools/perl-scripts/blob/master/cmap-tool.pl perl&amp;amp;#45;scripts/cmap&amp;amp;#45;tool.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts]を使うと良い感じにbegincidrangeにした上で100個ずつにまとめてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sequenceファイル&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sequenceファイル ====&lt;br /&gt;
&lt;br /&gt;
今回は以下のものを使用する。先ほど解説した通りに「CJK統合漢字+異体字セレクタ」の組が該当CIDを参照していることを確認せよ。&lt;br /&gt;
&lt;br /&gt;
ちなみに、異体字セレクタが付けられている元の字（以下ならU+8279とU+20000）自体がフォントに含まれていないとたしか異体字も使えないはずなのでそこは注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;8279 E0100; AJ1; CID+14197&lt;br /&gt;
8279 E0105; AJ1; CID+14197&lt;br /&gt;
8279 E0104; AJ1; CID+14198&lt;br /&gt;
8279 FE01; AJ1; CID+14198&lt;br /&gt;
8279 E0102; AJ1; CID+14198&lt;br /&gt;
8279 E0101; AJ1; CID+14199&lt;br /&gt;
8279 E0103; AJ1; CID+14199&lt;br /&gt;
8279 FE00; AJ1; CID+14199&lt;br /&gt;
20000 E0100; AJ1; CID+24000&lt;br /&gt;
20000 E0101; AJ1; CID+24001&lt;br /&gt;
20000 E0102; AJ1; CID+24002&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;sequences.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイル形式はAFDKOやOpenTypeフォント自体に由来するものであるというよりは多分Unicodeの[https://www.unicode.org/ivd/data/ IVD]に含まれるSequenceファイルに由来するものであるように思われる。SourceHanSansやAdobe&amp;amp;#45;Japan1のリポジトリにある例ではそれに従って中央の列に&amp;lt;code&amp;gt;Adobe&amp;amp;#45;Japan1&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Standardized_Variants&amp;lt;/code&amp;gt;などと律儀に書いてあるが、AFDKOが読むのは実際には第1のシーケンスと第3列のCID番号だけと思われるので、このように適当に&amp;lt;code&amp;gt;AJ1&amp;lt;/code&amp;gt;などと書いてファイル容量をケチっておいても問題はなさそうだった。&lt;br /&gt;
&lt;br /&gt;
==== featureファイル ====&lt;br /&gt;
&lt;br /&gt;
このファイルによって完成品のフォント名などが決められる。&lt;br /&gt;
&lt;br /&gt;
ほぼ[https://shiromoji.hatenablog.jp/entry/20111210/1323520587 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 後篇：makeotf &amp;amp;#45; しろもじメモランダム]を参考に、最低限の内容だけ入れている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;table head {&lt;br /&gt;
  FontRevision     0.004;&lt;br /&gt;
} head;&lt;br /&gt;
&lt;br /&gt;
table hhea {&lt;br /&gt;
  CaretOffset          0;&lt;br /&gt;
  Ascender           880;&lt;br /&gt;
  Descender         -120;&lt;br /&gt;
  LineGap           1000;&lt;br /&gt;
} hhea;&lt;br /&gt;
&lt;br /&gt;
table OS/2 {&lt;br /&gt;
  FSType               0;&lt;br /&gt;
  Panose               2   # Latin, Text&lt;br /&gt;
                      11   # Normal Sans&lt;br /&gt;
                       4   # Thin&lt;br /&gt;
                       9   # Monospaced&lt;br /&gt;
             0 0 0 0 0 0;  # Any&lt;br /&gt;
  UnicodeRange&lt;br /&gt;
  0 1 2 5 6 7 9&lt;br /&gt;
 31&lt;br /&gt;
  32 33 34 35 36 37 38 39&lt;br /&gt;
        42 43 44 45 46 47&lt;br /&gt;
  48 &lt;br /&gt;
                      49   # Hiragana&lt;br /&gt;
                      50   # Katakana&lt;br /&gt;
    54 55 57&lt;br /&gt;
                     59   # CJK Unified Ideographs&lt;br /&gt;
                      61 # CJK Strokes, CJK Compatibility Ideographs (Supplement)&lt;br /&gt;
      65 68&lt;br /&gt;
                      91   # Variation Selectors&lt;br /&gt;
  ;&lt;br /&gt;
  CodePageRange&lt;br /&gt;
                    1252   # Latin 1&lt;br /&gt;
                    1250   # Latin 2&lt;br /&gt;
                     932   # JIS/Japan&lt;br /&gt;
                     936   # Chinese: Simplified chars—PRC and Singapore&lt;br /&gt;
                     949   # Korean Wansung&lt;br /&gt;
                     950     # Chinese: Traditional chars—Taiwan and Hong Kong&lt;br /&gt;
                    1361   # Korean Johab&lt;br /&gt;
  ;&lt;br /&gt;
  TypoAscender       880;&lt;br /&gt;
  TypoDescender     -120;&lt;br /&gt;
  TypoLineGap       1000;&lt;br /&gt;
  winAscent         1000;&lt;br /&gt;
  winDescent         100;&lt;br /&gt;
  XHeight              0;&lt;br /&gt;
  CapHeight            0;&lt;br /&gt;
  WeightClass        400;&lt;br /&gt;
  WidthClass           5;  # Full width&lt;br /&gt;
  Vendor          &amp;quot;YHVH&amp;quot;;&lt;br /&gt;
} OS/2;&lt;br /&gt;
&lt;br /&gt;
table vhea {&lt;br /&gt;
  VertTypoAscender   500;&lt;br /&gt;
  VertTypoDescender -500;&lt;br /&gt;
  VertTypoLineGap   1000;&lt;br /&gt;
} vhea;&lt;br /&gt;
&lt;br /&gt;
feature vrt2 {&lt;br /&gt;
  sub \1 by \8720;&lt;br /&gt;
} vrt2;&lt;br /&gt;
&lt;br /&gt;
feature vert {&lt;br /&gt;
  sub \1 by \8720;&lt;br /&gt;
} vert;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;features&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
詳しくは他サイトに譲る。Ascender/Descenderによりフォントの高さ・深さを指定している（880&amp;amp;#45;(&amp;amp;#45;120)でちょうど1000になっていることを確認せよ）。winAscentとwinDescentはWindows限定のようだが、少なくともこれを変えると手元ではWordでのフォント高さが変わるので重要そうである（この設定例はかなり小さめである）。FontRevisionは好きに設定してよい。わからないときは、ttx（txではない）で既存フォントのテーブルを見てみるのもよいだろう。&lt;br /&gt;
&lt;br /&gt;
UnicodeRangeやCodePageRangeは、フォントがどのような言語・文字集合に対応しているかの参考にされるのだと思うが、少なくともフォント名を自分で指定してこのフォントを使う分にはあまり影響しない部分かと思われる。&amp;lt;s&amp;gt;実際には一文字も収録していないUnicode範囲をこんな大量に指定するのはやめた方がよさそうである。&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vrt2の部分は前述の[http://web.archive.org/web/20130225051414/http://d.hatena.ne.jp/mashabow/20120306/1331028598 花園明朝OTを0.510に更新、IVD 2012&amp;amp;#45;03&amp;amp;#45;02版に対応 &amp;amp;#45; しろもじメモランダム]を参考にしたものである。vertは勝手に同じ内容でつけてみた。&lt;br /&gt;
&lt;br /&gt;
== makeotfの実行 ==&lt;br /&gt;
&lt;br /&gt;
ここまでできたら&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;makeotf -f hinted.pfa -ff features -o final.otf -ch NazoMinCMAP-UTF32-H -ci sequences.txt -mf FontMenuNameDB&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
としてフォントをビルドしてみよう。なお、&amp;lt;code&amp;gt;FontMenuNameDB&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;features&amp;lt;/code&amp;gt;はそれぞれAFDKOが探すデフォルトの名前なので、別の名前を使わない限りは指定しなくてもよい。&amp;lt;code&amp;gt;Built development mode font &amp;amp;quot;…./final.otf&amp;amp;quot;&amp;lt;/code&amp;gt;などと出ればめでたく成功である。ちなみに&amp;amp;#45;rオプションを付けるとreleaseモードになり、”Built release mode font”と出る。多少時間がかかるもののサイズが減るなどする。&lt;br /&gt;
&lt;br /&gt;
あとはインストールしてちゃんと文字が出るか確かめればよい。Wordで確かめているとインストール直後はフォントの色々な情報（特に高さなど）がうまく読み込まれない場合があるので、何かおかしいと思ったらOffice系のソフトを一旦全て終了するなどしてからまた起動するのがよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;truetypeへの変換&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== TrueTypeへの変換 ==&lt;br /&gt;
&lt;br /&gt;
AFDKOが生成するのはPostScriptアウトラインのOpenTypeフォントであるから、曲線データには3次ベジェ曲線が用いられる。TrueTypeでは2次ベジェ曲線しか使えないので、3次ベジェ曲線→2次ベジェ曲線の変換が必要である。これは自明な変換ではなく近似が必要であるが、AFDKOにはこれをやってくれるotf2ttfというコマンドがある。シンプルに&amp;lt;code&amp;gt;otf2ttf final.otf&amp;lt;/code&amp;gt;とすれば&amp;lt;code&amp;gt;final.ttf&amp;lt;/code&amp;gt;というTrueTypeフォントが出力される。&lt;br /&gt;
&lt;br /&gt;
== その他参考 ==&lt;br /&gt;
&lt;br /&gt;
その他、フォントに関連する記事としては、[[Webブラウザ（Chrome）|Webブラウザ（Chrome）]]と[[Wordの「検索と置換」について|Wordの「検索と置換」について]]も参考になるだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cssで謎乃明朝&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== CSSで謎乃明朝 ==&lt;br /&gt;
&lt;br /&gt;
IVSなどがあるので（body&amp;amp;#58;&amp;amp;#123;&amp;amp;#125;などに書く）font&amp;amp;#45;family&amp;amp;#58;のところではNazoMinを先に指定すること。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;@font-face {&lt;br /&gt;
      font-family: &amp;quot;NazoMin&amp;quot;;&lt;br /&gt;
      src: local(&amp;quot;謎乃明朝 Regular&amp;quot;);&lt;br /&gt;
      unicode-range: U+3400-U+4DFF, U+2F800-2FFFF, U+30000-3FFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
      font-family: &amp;quot;NazoMin+&amp;quot;;&lt;br /&gt;
      src: local(&amp;quot;謎乃明朝+ Regular&amp;quot;);&lt;br /&gt;
      unicode-range: U+20000-2F7FF;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%92%B0%E5%A2%83&amp;diff=361</id>
		<title>Windowsでのターミナル環境</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%92%B0%E5%A2%83&amp;diff=361"/>
		<updated>2025-10-02T06:09:03Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WindowsはLinuxに比べるとライトユーザー向けのOSで、端末エミュレータで文字を打ってコマンドを実行するというCUIのスタイルで使いやすいようにデザインされているとは言い難い。それでも、ある程度工夫すれば不満点を改善することはできる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;c&amp;amp;#58;usersusernamepathにpathを通す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== C&amp;amp;#58;\Users\USERNAME\.pathにPATHを通す ==&lt;br /&gt;
&lt;br /&gt;
ユーザーフォルダ（C&amp;amp;#58;\Users\USERNAME）の直下などわかりやすいところに.path（もちろん名前は好きに決めてよい）というフォルダを作り、これをユーザー環境変数のPATH（の先頭がいいかな？）に追加しておく（他ユーザーから見えないフォルダなのでシステム環境変数に追加するのは不適切）。するとPATHをいちいち書き換えなくてもこの中に入れた実行ファイルやバッチファイルはファイル名だけで呼び出せる状態になる。&lt;br /&gt;
&lt;br /&gt;
これは、インストール不要（圧縮ファイル解凍のみ）、あるいはPATHを自動で通さないようなソフトウェアを使いやすくするのに有用である。実行ファイル単体で動作するならファイルを直接入れてもいいし、依存ファイルがあるなら&amp;lt;strong&amp;gt;本体の位置はそのままでそれを呼び出す&amp;lt;/strong&amp;gt;プログラムを入れればいい（バッチファイルでもいいが、欠点がある。詳しくは後述）。&lt;br /&gt;
&lt;br /&gt;
筆者はrclone（ファイル同期ソフト）やmpv（メディアプレイヤー）などをこの.path経由で起動できるようにしている。またLinuxでも同様の設定をしている。&lt;br /&gt;
&lt;br /&gt;
== 他のコマンドを呼び出すプログラム ==&lt;br /&gt;
&lt;br /&gt;
前項の目的を達するため、「自身に渡されたコマンドライン引数を（場合により多少の処理をした上で）ほぼそのまま使って他のコマンドを実行する」ようなプログラムを作成した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/win-console-delegator &amp;lt;span&amp;gt;https://github.com/ge9/win-console-delegator&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
このプログラムは、「自分自身のファイル名の最後の文字と最後から3番目の文字を&amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;に変更したファイル（主にexe→txtを想定しているが、com→totなどでもよい）を読み込み、その内容と自分に与えられたコマンドライン引数をつなげた文字列をコマンドとして実行する」という挙動をする。すなわち、実行ファイルは（コンパイルし直さず）そのままコピーした上で、ペアとなる.txtファイルに適切な内容を書くことで、以下のようなプログラムが実現できる。&lt;br /&gt;
&lt;br /&gt;
==== 他のプログラムをそのまま実行 ====&lt;br /&gt;
&lt;br /&gt;
たとえばテキストファイルに以下のように書いておけば、mpvが起動される。&amp;lt;strong&amp;gt;末尾の半角スペースも入れること。&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;quot;C:\Users\username\Softwares\mpv\mpv.exe&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Windows版のmpvは、設定ファイル（mpv.conf）やプラグインなどを自身が存在するディレクトリから読み込むが、それらの動作を維持したままで、.pathにはmpv.exeという呼び出し専用のファイルだけを配置することができる。&lt;br /&gt;
&lt;br /&gt;
==== 指定フォルダにあるプログラムを実行 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;myprogram somecommand arg1 arg2 ...&amp;lt;/code&amp;gt;と呼び出されたときに、&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\somecommand arg1 arg2 ...&amp;lt;/code&amp;gt;をかわりに実行したい、ということがある。例えば複数の実行ファイルがまとまって提供されるような場合である。このときは以下のようなmycommand.txtをペアにすればよい。この場合はパスを直接引数につなげるため、&amp;lt;strong&amp;gt;末尾に半角スペースを入れてはいけない。&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;C:\path\to\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ところで、&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\&amp;lt;/code&amp;gt;の部分に空白文字が含まれている場合、このままではパスが正しく認識されない。通常はパス全体をダブルクォーテーションで囲うことでこれを回避するが、今回は与えられた引数のどこにダブルクォーテーションを挿入するかが自明ではない（&amp;lt;code&amp;gt;myprogram someprogram&amp;amp;quot;&amp;lt;/code&amp;gt;と入力させるという方法もあるが美しくない）ため、&amp;lt;strong&amp;gt;半角スペースを含まない別名&amp;lt;/strong&amp;gt;（8.3形式）&amp;lt;strong&amp;gt;を使う&amp;lt;/strong&amp;gt;のがよいだろう（短い名前については[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]]も参照）。例えばProgram Filesなら普通は「PROGRA&amp;amp;#126;1」になっているはずである。以下はGit Bashでのtxtファイルの例である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;C:\PROGRA~1\Git\usr\bin\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
これにより、PATHを変更せずとも、例えば&amp;lt;code&amp;gt;gb grep&amp;lt;/code&amp;gt;などとするだけでGit Bashの&amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;を呼び出すことができるようになる。gitやnpmやbusyboxやmagick（ImageMagick）のようにサブコマンドを指定して使うプログラムは多くあるが、これと同じような使用感になる。プレフィックスを設けることでそれぞれの名前の集合を別々に管理して衝突を防ぐ、という意味では、多くのプログラム言語で採用されている名前空間（namespace）に近い発想かもしれない。（コマンドにおけるこのような手法に特に名前は付いていないと思う。）&lt;br /&gt;
&lt;br /&gt;
==== pathなどの環境変数を変更して実行 ====&lt;br /&gt;
&lt;br /&gt;
上記と若干似ているが、PATHをはじめとした環境変数を変えることでプログラムがうまく実行されるようにしたい、という場合もある。この場合は、テキストファイルを以下のようにすればよい（Git Bashのフォルダをパスに追加し、&amp;lt;code&amp;gt;MYVAR&amp;lt;/code&amp;gt;に&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;をセットする例）。末尾の半角スペースはあってもなくてもいい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cmd /c path C:\Program Files\Git\usr\bin;%PATH% &amp;amp; set MYVAR=value1 &amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こちらは、先ほどと違って、内部でGit Bashのコマンドを使用する（Git Bashとは無関係な）プログラムを実行する際などに有用である。&lt;br /&gt;
&lt;br /&gt;
また、これに類似のケースとして、環境変数の設定などを行うバッチファイルが既に用意されていてそれを使いたいという場合もある。例えば以下のようなテキストファイルを用いれば、実質的にVisual Studioの開発者コマンドプロンプト（Developer Command Prompt for VS 2022）の内部で与えられたコマンドを実行してくれるプログラムが作れる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;cmd /c C:\PROGRA~1\MIB055~1\2022\Community\Common7\Tools\VsDevCmd.bat &amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* ここでも短いパスを使用している。長いパスでも引用符で囲めばある程度うまく動作するが、&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;の後にくるコマンドに引用符が含まれている場合にうまくいかない。&lt;br /&gt;
&lt;br /&gt;
Linuxでも、例えば特定のvenv仮想環境の中で与えられたコマンドを実行するシェルスクリプトを全く同じ発想で作ることができる。&lt;br /&gt;
&lt;br /&gt;
=== 実装について ===&lt;br /&gt;
&lt;br /&gt;
* 言語はC++を使った。これはWindows APIのGetCommandLineから生のコマンドライン文字列が得られるからである。予め分割されたコマンドラインでは情報量が減ってしまう。WinMainが使えればlpCmdLineで楽にできたが、今回はコンソールアプリケーションで実装したかったので、[https://stackoverflow.com/questions/14150374/how-to-get-the-raw-command-line-arguments c++ &amp;amp;#45; How to get the raw command line arguments &amp;amp;#45; Stack Overflow]のようにして自身のファイルパスだけ取り除いた。&lt;br /&gt;
* コンソールイベント（Ctrl+Cなど）の転送に関しては、CreateProcessにCREATE_NEW_PROCESS_GROUPを指定した上で、SetConsoleCtrlHandlerによって全てのコンソールイベントを転送する方式とした。CREATE_NEW_PROCESS_GROUPを指定しない場合よりもこのほうが安定して動いている気がする。&lt;br /&gt;
* cmdの対話シェルには、実行するアプリケーションがコンソールアプリケーションではなくGUIアプリケーションである場合は実行終了を待たずに即座に制御を返すという仕様がある。これを模倣するため、自作プログラムにはGUIアプリケーションにしたバージョンも同梱している。&lt;br /&gt;
&lt;br /&gt;
=== batとの比較 ===&lt;br /&gt;
&lt;br /&gt;
上記の例は、いずれもバッチファイルを使って似たようなことが実現できる。例えばGit Bashならそれぞれ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;prolog&amp;quot;&amp;gt;@C:\path\to\directory\%*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
や&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;@cmd /c &amp;quot;path C:\path\to\directory;%PATH% &amp;amp; %*&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のようにする（&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;は、echo offを一時的に行うために必要である）。&lt;br /&gt;
&lt;br /&gt;
しかし、cmd.exeには、バッチファイルの実行中にCtrl+Cを送信すると「バッチ ジョブを終了しますか (Y/N)?」というプロンプトを表示するという厄介な仕様がある。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で挟まれた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が文字列として含まれていた場合に展開されてしまう。そのため、先ほどの自作プログラムを使用するほうがスマートである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin-msysmingw-git-bashの違い&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwin, MSYS/MinGW, Git Bashの違い ==&lt;br /&gt;
&lt;br /&gt;
これらはいずれもWindows上でUnixライクなコマンドライン環境を整備してくれるツールだが、違いもある。&lt;br /&gt;
&lt;br /&gt;
個人的な印象としては&lt;br /&gt;
&lt;br /&gt;
* Cygwinは起動に若干タイムラグがあるが、最も信頼できる動作をするので、例えばシェルスクリプトを実行させるときなどはまずCygwinで試した方がいい。&lt;br /&gt;
* MSYS系は、C++でWindows向けに何かをコンパイルしたい時に使う。&lt;br /&gt;
* Git Bashは、最も手軽だが、Cygwinに比べると意外とWindowsとの互換性というか、動作が怪しいことがある。&lt;br /&gt;
** Git Bashからだと、cmdを起動したときに入力カーソルの位置がおかしい、Windowsのアプリケーションに&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;を引数として渡したいときは&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;と書かなければいけない、xargsの並列実行の挙動がおかしい（[https://github.com/ge9/ExecuteCommand-Pipe/issues/3 With &amp;amp;quot;h&amp;amp;quot; option, ][https://github.com/ge9/ExecuteCommand-Pipe/issues/3 &amp;lt;code&amp;gt;xargs &amp;amp;#45;n1&amp;lt;/code&amp;gt;][https://github.com/ge9/ExecuteCommand-Pipe/issues/3  creates only one process · Issue &amp;amp;#35;3 · ge9/ExecuteCommand&amp;amp;#45;Pipe]）という例があった。&lt;br /&gt;
&lt;br /&gt;
==== 参考サイト ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://www.glamenv-septzen.net/view/1422 https&amp;amp;#58;//www.glamenv&amp;amp;#45;septzen.net/view/1422]これを見た限り（2017年のやつだけど）、MSYS2って意外と大したことなくない？という。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;呼び方の違いがわかりやすい表[https://gist.github.com/rz7d/4e699498d339a5837f016b3108631a2b https&amp;amp;#58;//gist.github.com/rz7d/4e699498d339a5837f016b3108631a2b]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://opcdiary.net/%E6%B7%B7%E3%81%9C%E3%82%8B%E3%81%AA%E5%8D%B1%E9%99%BA-msys2%E3%81%A8cygwin%E3%81%A8git-for-windows%E3%82%92%E4%B8%80%E7%B7%92%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%BE/ 混ぜるな危険 (msys2とCygwinとGit For Windowsを一緒に使ってはいけません) | OPCDiary]&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これがあるので、当サイトのように呼び出し用のコマンドを整備するのが割とおすすめ。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://sites.google.com/site/toriaezuzakki/msys2?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F https&amp;amp;#58;//sites.google.com/site/toriaezuzakki/msys2?tmpl&amp;amp;#61;%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F]&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MSYS2をインストールしたときに出る複数のシェルはパスの設定が違う（だけ？）らしい&amp;amp;#58;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;「これらの違いはパスの設定です。MSYS2 Shellを基本として、MinGW&amp;amp;#45;w64 Win32 Shellはそれに/mingw32/binが追加されており、MinGW&amp;amp;#45;w64 Win64 Shellは/mingw64/binが追加されています。」&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;詳しくは、「msys2_shell.cmd」を読んでみると良さそうである。MSYSTEM環境変数というのが重要そう。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://m-hiyama.hatenablog.com/entry/20151013/1444704189 Mingw&amp;amp;#45;w64/MSYS2 を入れなくても Git for Windows で間に合うみたい &amp;amp;#45; 檜山正幸のキマイラ飼育記 (はてなBlog)] Git BashはMinGW/MSYSベースなので、そちらと同様に、MSYSTEM環境変数を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;に設定すると/mingw64/binがパスに入る。ここにはgit.exeが入っているが、git.exe自体は実は/cmdに入っているので、そのことによる実効的な違いはあまりない。ということらしい。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただgit以外にもxzコマンドとか/mingw64/binにしかないものもいくつかあるので、違いが全くないわけでもない。（なぜxzがこっちに入っているんだろう？）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;MSYSTEMに何も設定せずusr/binにあるbashに&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を付けて実行したところ、MSYSTEMはMSYSに設定され、パスには/mingw64/binがないかわりに&amp;lt;strong&amp;gt;/opt/binが追加&amp;lt;/strong&amp;gt;されている。しかし実際には/optフォルダはGit Bashのインストール時には存在しておらず、無意味である。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== アプリ実行エイリアスの扱い ==&lt;br /&gt;
&lt;br /&gt;
wt.exeやmspaint.exeなどストアアプリ系の実行ファイルは「アプリ実行エイリアス」というやや特殊な仕組みで管理されており（例えばエクスプローラーで見るとこれらのファイルサイズは0バイトである）、Cygwin系と相性が悪い。Git BashではPermission Deniedでこれらのファイルの実行ができないという問題があった。最新リリースでは修正されている。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/git-for-windows/git/issues/2675 Permission Error on all App Execution Aliases in git&amp;amp;#45;bash · Issue &amp;amp;#35;2675 · git&amp;amp;#45;for&amp;amp;#45;windows/git]&lt;br /&gt;
&lt;br /&gt;
Cygwinでは、実行は問題ないがwhich wtとすると見つからないと言われる（Git Bashでは大丈夫そう）（2023/08時点）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwinのforkに関するエラーを直す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwinのforkに関するエラーを直す ==&lt;br /&gt;
&lt;br /&gt;
setupを再実行してバイナリがアップデートされた後に、以下のようなエラーが頻発するようになることがある。毎回出るわけではなく、確率的に生じるので厄介である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;child -1 – forked process 9272 died unexpectedly, retry 0, exit code 0xC0000142, errno 11&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;40 [main] bash 3348 fork: child -1 - forked process 4248 died unexpectedly, retry 0, exit code -1073741819, errno 11&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
解決方法はいくつかある（単に再起動などで治る場合もある？）らしいが、自分の場合は以下のようにrebaseallというのをやることで治った。&lt;br /&gt;
&lt;br /&gt;
[https://stackoverflow.com/questions/9300722/cygwin-error-bash-fork-retry-resource-temporarily-unavailable/14509551#14509551 Cygwin error&amp;amp;#58; &amp;amp;quot;&amp;amp;#45;bash&amp;amp;#58; fork&amp;amp;#58; retry&amp;amp;#58; Resource temporarily unavailable&amp;amp;quot; &amp;amp;#45; Stack Overflow]（元記事は[https://cygwin.fandom.com/wiki/Rebaseall https&amp;amp;#58;//cygwin.fandom.com/wiki/Rebaseall]らしい）&lt;br /&gt;
&lt;br /&gt;
ここには&amp;lt;code&amp;gt;rebaseall &amp;amp;#45;v&amp;lt;/code&amp;gt;と書いてあるが、手元ではそのようなオプションがなさそうだったので単純にrebaseallとしたら、それでうまく行ったようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;まとめると、手順は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Cygwin関連のプロセスをすべて終了させる。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;/usr/binにある&amp;lt;strong&amp;gt;dash.exe&amp;lt;/strong&amp;gt;を&amp;lt;strong&amp;gt;管理者権限で&amp;lt;/strong&amp;gt;起動させる（おそらく軽量で依存関係が少ないから？）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;./rebaseall&amp;lt;/code&amp;gt;を実行&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;他には以下のようにWindowsのセキュリティ設定をいじる方法もあるようだが、ちょっと不安。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://oni-gili.org/archives/290 https&amp;amp;#58;//oni&amp;amp;#45;gili.org/archives/290]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://umateku.com/archives/462 https&amp;amp;#58;//umateku.com/archives/462]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwinでcmdにを出力させる&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwinでcmdに&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を出力させる ==&lt;br /&gt;
&lt;br /&gt;
[https://cygwin.com/pipermail/cygwin/2020-June/245226.html change in handling quotes in cygwin package from 3.1.4&amp;amp;#45;1 to 3.1.5&amp;amp;#45;1]にある通り、Cygwinでcmd（を含むWindowsネイティブのプログラム？）にダブルクォーテーション単体（あるいはダブルクォーテーションを途中に含む任意の文字列など）を渡すのは難しい（難しくなった？）。環境変数に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を入れておいて渡すという手はあるが、衝突する可能性も考えられる。一番確実なのは、与えられた引数に含まれる指定された文字列を全て&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に置き換えて実行するようなプログラムを別途書くことだろう（気が向いたらやるかも）。&lt;br /&gt;
&lt;br /&gt;
* [https://twitter.com/e9g/status/1660590434429865984 https&amp;amp;#58;//twitter.com/e9g/status/1660590434429865984]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwinなどでbatやvbsを拡張子無しで呼ぶ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Bash/Cygwinなどでbatやvbsを拡張子無しで呼ぶ ==&lt;br /&gt;
&lt;br /&gt;
Windows上では、実行ファイルの拡張子（の主流）である.exe以外にもバッチファイル（.bat）やVBScript（.vbs）などが環境変数&amp;lt;code&amp;gt;PATHEXT&amp;lt;/code&amp;gt;に登録され、拡張子無しで呼び出すことができる。しかし、Git Bash/Cygwinでは、exeのみが省略でき、他は明示的に付けないと呼び出せない。これは[https://qiita.com/snipsnipsnip/items/03b3bb9149954cb44bea Git Bashで.batや.lnkを使うとき拡張子を省く &amp;amp;#45; Qiita]のようにbash側で設定すると解決できる（が、あまり綺麗な方法とはいえない気がする）（なおCygwinでは未確認）。また、よく使う操作をコマンド一発で呼び出したい時は、batではなくシェルスクリプトや前述のようにexeファイルを使う手もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;conhostexeで文字選択中に出力がブロックされる&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== conhost.exeで文字選択中に出力がブロックされる ==&lt;br /&gt;
&lt;br /&gt;
Windows コンソールホスト（conhost.exe）というのは、Windowsで従来ずっと使われてきたターミナルのことであり、この上でコマンドプロンプト（cmd.exe）やPowerShellやその他のコンソールアプリケーションが動く。conhost.exeに代わるものとして最近出てきたのがWindows Terminal（wt.exe）である。&lt;br /&gt;
&lt;br /&gt;
この2つは以下の画像の通り、概ね見た目で区別できる。（Windows11以降でWindows Terminalをデフォルトにする機能が追加されるようであるが、そうしていない場合は、）cmdやPowerShell、あるいはpythonやnode.jsなどの対話コンソールを普通に開いた際にはこの上側のような感じのウインドウが表示されるはずである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/conhost.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;conhost.exeの見た目&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/wt.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;Windows Terminalの見た目&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
しかし、あまり知られていないようだが、このconhost.exeには「&amp;lt;strong&amp;gt;文字を選択した状態（ウインドウタイトルに「選択」と出る）だと一切の出力がブロックされる&amp;lt;/strong&amp;gt;」という仕様があるようである（文字選択を容易にするため？参考&amp;amp;#58; [https://github.com/microsoft/terminal/issues/34 &amp;lt;span&amp;gt;https://github.com/microsoft/terminal/issues/34&amp;lt;/span&amp;gt;]）。例えば&amp;lt;code&amp;gt;ping &amp;amp;#45;t localhost&amp;lt;/code&amp;gt;を実行して文字を選択してみるといいだろう。方向キーや文字を入力するなどして選択状態を解除すると出力は再開する。&lt;br /&gt;
&lt;br /&gt;
この仕様により、[https://stackoverflow.com/questions/8140804/how-can-i-stop-my-server-from-freezing-when-powershell-is-in-select-mode ruby on rails &amp;amp;#45; how can I stop my server from freezing when powershell is in &amp;amp;#39;select&amp;amp;#39; mode? &amp;amp;#45; Stack Overflow] などにあるように、サーバーアプリケーションの実行が出力の際に意図せずブロックされるといった問題が起こる（筆者は[[error_private_page|error_private_page]]のサーバーを使っている際にこの問題に気付いた）。また、詳しい条件はわからないが、筆者の経験では、&amp;lt;strong&amp;gt;単にそのコンソールウインドウを長時間使わず放置するだけでも同じ現象が発生する&amp;lt;/strong&amp;gt;ことがあり、文字選択をしないように気を付けるだけでは不十分なようである。&lt;br /&gt;
&lt;br /&gt;
解決策としては、conhost.exe以外のターミナルを使えばよい。比較的新しいWindowsであればWindows Terminal、それが無理ならCygwinやGit Bashのターミナル（mintty.exeだっけ？）などでもよい（ただGit BashはCygwinと比べてWindowsアプリケーションとの互換性が微妙な気もする。例えばcmd.exeを開いて方向キーを押すと不自然な動作をする）。また、あくまでブロックされるのは出力に際してであるため、&amp;lt;code&amp;gt;&amp;amp;gt; nul&amp;lt;/code&amp;gt;などで出力を全て捨てればブロックはされない（ただしそれでは不便という場合も多いだろう）。&lt;br /&gt;
&lt;br /&gt;
== cmd ==&lt;br /&gt;
&lt;br /&gt;
あまり知られていないが、cmdでもbashなどと同じように&amp;lt;code&amp;gt;PROMPT&amp;lt;/code&amp;gt;変数にエスケープ文字を入れることでプロンプト（&amp;lt;code&amp;gt;C&amp;amp;#58;\Users&amp;amp;gt;&amp;lt;/code&amp;gt;みたいなやつ）の色やスタイル（太字など）を変えられる。&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/nanagami1369/items/9f6894b0759f74519f1e コマンドプロンプトのプロンプトに色をつける方法 &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://chiyosuke.blogspot.com/2018/05/blog-post_7.html ちよぶろ。&amp;amp;#58; コマンドプロンプトの色を変える。]&lt;br /&gt;
&lt;br /&gt;
例えば黄色（&amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt;）+太字（&amp;lt;code&amp;gt;01&amp;lt;/code&amp;gt;）+末尾空白（&amp;lt;code&amp;gt;$S&amp;lt;/code&amp;gt;）なら&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;$E[33;01m$P$E[0m$G$S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ただしVista以降～Windows 10の途中（1607より前？）ではcmd+conhostという組み合わせ（といっても多分cmdを使うとしたら事実上conhostが必要となる）だとエスケープ文字がそのまま表示されてしまい色がつかない。これは[https://github.com/adoxa/ansicon ansicon]で解決できる。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://qiita.com/TsuneoNakanishi/items/a86f52a406b99d202c06 WindowsコマンドプロンプトでのANSIエスケープシーケンスの使用 &amp;amp;#45; Qiita]など&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windows Terminal ==&lt;br /&gt;
&lt;br /&gt;
プロファイルを自分で追加できるなどの仕様は、Windowsにしてはなかなか偉い感じがする。&lt;br /&gt;
&lt;br /&gt;
フォントは、GUIからではなく設定ファイルを変更する必要はあるが、変えられる。デフォルトのCascadia Codeより&amp;lt;strong&amp;gt;Consolas&amp;lt;/strong&amp;gt;のほうが英数字が日本語のちょうど半分のサイズになるので読みやすい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;quot;defaults&amp;quot;: {&lt;br /&gt;
            &amp;quot;font&amp;quot;:{   &amp;quot;face&amp;quot;: &amp;quot;Consolas&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 12&lt;br /&gt;
             }&lt;br /&gt;
        },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;設定例&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CSSのように複数のフォントを指定することはまだできないようである。[https://github.com/microsoft/terminal/issues/2664 &amp;lt;span&amp;gt;https://github.com/microsoft/terminal/issues/2664&amp;lt;/span&amp;gt;] まあこれはしょうがないだろう。&lt;br /&gt;
&lt;br /&gt;
==== 太字 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/microsoft/terminal/issues/109 &amp;lt;span&amp;gt;https://github.com/microsoft/terminal/issues/109&amp;lt;/span&amp;gt;]の通り、反映されない不具合があった。そこに書いてある通り、Windows Terminalの設定画面から開ける（下部にボタンあり）JSONファイルの”profiles”にある&amp;lt;code&amp;gt;&amp;amp;quot;defaults&amp;amp;quot;&amp;amp;#58; &amp;amp;#123;&amp;amp;#125;&amp;lt;/code&amp;gt;またはその下の”list”の各プロファイルの中身に&amp;lt;code&amp;gt;&amp;amp;quot;intenseTextStyle&amp;amp;quot;&amp;amp;#58; &amp;amp;quot;bold&amp;amp;quot;&amp;lt;/code&amp;gt;と書くことで治った。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;{&lt;br /&gt;
    ....//省略&lt;br /&gt;
    &lt;br /&gt;
    &amp;quot;profiles&amp;quot;: &lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;defaults&amp;quot;: {&lt;br /&gt;
            &amp;quot;intenseTextStyle&amp;quot;: &amp;quot;bold&amp;quot; //ここ&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;list&amp;quot;: &lt;br /&gt;
        [&lt;br /&gt;
            ....&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;commandline&amp;quot;: &amp;quot;%SystemRoot%\\System32\\cmd.exe&amp;quot;,&lt;br /&gt;
                &amp;quot;font&amp;quot;: &lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;face&amp;quot;: &amp;quot;Consolas&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;guid&amp;quot;: &amp;quot;{00000000-4444-3333-2222-111111111111}&amp;quot;,&lt;br /&gt;
                &amp;quot;hidden&amp;quot;: false,&lt;br /&gt;
                &amp;quot;name&amp;quot;: &amp;quot;name&amp;quot;,&lt;br /&gt;
                &amp;quot;intenseTextStyle&amp;quot;: &amp;quot;bold&amp;quot; //またはここ&lt;br /&gt;
            },&lt;br /&gt;
            ....&lt;br /&gt;
        ]&lt;br /&gt;
    },&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== コマンドライン引数をめぐる仕様 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Windowsでのターミナル環境}}&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=360</id>
		<title>Zotero</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=360"/>
		<updated>2025-10-02T06:09:00Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。&lt;br /&gt;
&lt;br /&gt;
== 初期設定 ==&lt;br /&gt;
&lt;br /&gt;
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては [https://note.com/sdeso/n/n013952313c1b 【令和最新版】文献管理ソフト Zoteroのすゝめ｜SD｜note] が大変詳しく、これでほぼ十分であるが、いくつか追加しておく。&lt;br /&gt;
&lt;br /&gt;
* Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると（アドオンと混同されて）「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。&lt;br /&gt;
* ファイルの自動命名は日本人だと苗字がLast Nameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。&lt;br /&gt;
* コレクションごとにフォルダ分けしたい場合は、”Use subfolder defined by”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする（この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける）。参考&amp;amp;#58;[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427 Zoteroの使い方（我流、逐次更新） &amp;amp;#45; Bag of ML Words]など&lt;br /&gt;
&lt;br /&gt;
=== ブラウザ拡張の使い方など ===&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbedded Metadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由せずに（ローカルにあるpdfを）入れるときは、ZoteroのウインドウにD&amp;amp;amp;D（このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される（移動になる））して取り込む。日本語論文などで文献情報がうまく読まれない場合は、Manual Entryを作成するしかない場合もあるが、J&amp;amp;#45;STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある（pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい）。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRename Attachmentsをする必要がある。なお（最初のサイトで推奨されている通り）”&amp;lt;strong&amp;gt;サブコレクションからアイテムを表示&amp;lt;/strong&amp;gt;”がonだと特定コレクションの中身（サブコレクション内部を含め）すべてに対してRename Attachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う（あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる）。なお、前述のようにクラウドストレージのフォルダをLocation of Filesに指定して同期している場合、Rename Attachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。&lt;br /&gt;
&lt;br /&gt;
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRename and moveを実行し、適宜ゴミ箱に移動して（アイテムを）削除し、DELETEフォルダの中身も定期的に削除する、とやっている。&lt;br /&gt;
&lt;br /&gt;
== dateデータのフォーマットについて ==&lt;br /&gt;
&lt;br /&gt;
Zotero Connectorはサイトやpdfから論文の投稿（掲載？）日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月 22 , 2011」、英語であれば「April 22, 2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&amp;amp;#45;04&amp;amp;#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。&lt;br /&gt;
&lt;br /&gt;
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、Better BibTeXの使用時に問題が発生していた（後述）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;better-bibtex-for-zotero&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== [https://retorque.re/zotero-better-bibtex/ &amp;lt;strong&amp;gt;Better BibTeX for Zotero&amp;lt;/strong&amp;gt;] ==&lt;br /&gt;
&lt;br /&gt;
まずは普通に[https://retorque.re/zotero-better-bibtex/ Better BibTeX for Zotero]からxpiをインストール、再起動すると再びdrag&amp;amp;#45;and&amp;amp;#45;dropを有効にするため再起動しろと言われるので再起動する。Citation keyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0d Zotero+BibTeXで参考文献の出力を自動化&amp;amp;amp;論文の引用で出てきた順にソートする]の通り、export→fieldsのfields to omit from exportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/ Zotero で citation keys を設定する ( zotero&amp;amp;#45;better&amp;amp;#45;bibtex ) &amp;amp;#45; shoei05]の通りCitation keysを&amp;amp;#91;auth&amp;amp;#58;lower&amp;amp;#93;&amp;amp;#91;year&amp;amp;#93;&amp;amp;#91;shorttitle1_1&amp;amp;#93;に変更する。&lt;br /&gt;
&lt;br /&gt;
Citation keyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える（これは設定で無効にできる）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;日本語文献のcitation-keyについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 日本語文献のCitation Keyについて ====&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977 https&amp;amp;#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;yearデータの不具合6760で修正済&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== yearデータの不具合(&amp;lt;u&amp;gt;6.7.60で修正済&amp;lt;/u&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011&amp;amp;#45;04&amp;amp;#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX（.bib）に出力されてしまう（報告済み&amp;amp;#58; [https://github.com/retorquere/zotero-better-bibtex/issues/2449 &amp;amp;#91;Bug&amp;amp;#93;&amp;amp;#58; Japanese date format is not parsed correctly · Issue &amp;amp;#35;2449 · retorquere/zotero&amp;amp;#45;better&amp;amp;#45;bibtex]、6.7.61あたりで修正済み）。←の通り、Better BibTeXのエクスポート時に適用されるscript（Export → postscript）のところにデータを置換するための以下のようなコードを書いておくとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;if (tex.has.year) {&lt;br /&gt;
tex.add({name: &#039;year&#039;, replace: true, value: tex.has.year.value.replace(/.* /, &#039;&#039;)})&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
設定箇所はこんな感じ↓&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった（[https://github.com/retorquere/zotero-better-bibtex/issues/2447 &amp;lt;span&amp;gt;https://github.com/retorquere/zotero-better-bibtex/issues/2447&amp;lt;/span&amp;gt;]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zotero-protocolを使用した操作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zotero Protocolを使用した操作 ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//&amp;lt;/code&amp;gt;という形式のURL（URIスキーム）を以下のように指定してZoteroを起動することができる（既に起動していた場合は、画面に変化が起こる）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;zotero.exe -url &amp;quot;zotero://url/here&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。&lt;br /&gt;
&lt;br /&gt;
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが [https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.js zotero/zotero&amp;amp;#45;protocol&amp;amp;#45;handler.js at master · zotero/zotero] の&amp;lt;code&amp;gt;scopeObject&amp;lt;/code&amp;gt;などと書いてあるあたりをよく読むと、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//select/library/collections/&amp;amp;#123;collection_key&amp;amp;#125;/items/&amp;amp;#123;item_key&amp;amp;#125;&amp;lt;/code&amp;gt;という形式で指定すればよいことがわかる（groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである）。&amp;lt;code&amp;gt;collection_key&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;item_key&amp;lt;/code&amp;gt;はどちらも&amp;lt;code&amp;gt;1A2B3C4D&amp;lt;/code&amp;gt;のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ&amp;lt;strong&amp;gt;ID&amp;lt;/strong&amp;gt;も割り当てられているがこちらは1～3桁くらいの数字でありkeyとは別なので注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;指定されたcitation-keyのアイテムをzoteroで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 指定されたCitation keyのアイテムをZoteroで開く ==&lt;br /&gt;
&lt;br /&gt;
前述の方法を応用して実装してみる。ここではCitation keyとしてBetter BibTeXのものを使うことを仮定する。&lt;br /&gt;
&lt;br /&gt;
まず、Citation keyからアイテムのキーを取得する部分を作る。Citation keyはBetter BibTeXが管理しているので（ここではデフォルトの&amp;amp;#126;/Zoteroに各種データがあると仮定して）&amp;amp;#126;/Zotero/better&amp;amp;#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション（複数ある場合は最初のもの）のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。&lt;br /&gt;
&lt;br /&gt;
Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797 SQLite Forum&amp;amp;#58; Option to open a database as read&amp;amp;#45;only despite locked.]にある通り、（Windowsなら）&amp;lt;code&amp;gt;sqlite3 &amp;amp;quot;file&amp;amp;#58;Zotero\\zotero.sqlite?mode&amp;amp;#61;ro&amp;amp;amp;nolock&amp;amp;#61;1&amp;amp;quot;&amp;lt;/code&amp;gt;のようにしてやると読み取り専用で開くことはできる（書き込まないのでこれで充分）。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。&lt;br /&gt;
&lt;br /&gt;
コード例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;python&amp;quot;&amp;gt;import sqlite3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
db = sqlite3.connect(&#039;file:&#039;+sys.argv[1]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur = db.cursor()&lt;br /&gt;
cur.execute(&#039;SELECT data FROM &amp;quot;better-bibtex&amp;quot; where name=&amp;quot;better-bibtex.citekey&amp;quot;&#039;)&lt;br /&gt;
d = json.loads(cur.fetchone()[0])&lt;br /&gt;
mydict = {}&lt;br /&gt;
for item in d[&amp;quot;data&amp;quot;]:&lt;br /&gt;
    mydict[item[&amp;quot;citekey&amp;quot;]] = item[&amp;quot;itemKey&amp;quot;]&lt;br /&gt;
myKey = mydict[sys.argv[3]]&lt;br /&gt;
&lt;br /&gt;
db2 = sqlite3.connect(&#039;file:&#039;+sys.argv[2]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur2 = db2.cursor()&lt;br /&gt;
cur2.execute(&amp;quot;SELECT itemID FROM items WHERE key=?&amp;quot;, (myKey, ))&lt;br /&gt;
item_id = cur2.fetchone()[0]&lt;br /&gt;
cur2.execute(&amp;quot;SELECT collectionID FROM collectionItems WHERE itemID=?&amp;quot;, (item_id, ))&lt;br /&gt;
# 所属する最初のコレクションIDを取得&lt;br /&gt;
collection_id = cur2.fetchone()[0]&lt;br /&gt;
# collectionIDからcollectionKeyを取得&lt;br /&gt;
cur2.execute(&amp;quot;SELECT key FROM collections WHERE collectionID=?&amp;quot;, (collection_id,))&lt;br /&gt;
collection_key =cur2.fetchone()[0]&lt;br /&gt;
print(collection_key)&lt;br /&gt;
subprocess.run(f&#039;&amp;quot;C:\Program Files (x86)\Zotero\zotero.exe&amp;quot; -url &amp;quot;zotero://select/library/collections/{collection_key}/items/{myKey}&#039;)&lt;br /&gt;
db.close()&lt;br /&gt;
db2.close()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;zoto.py&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記コードは以下のように起動できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;python &amp;quot;path\to\zoto.py&amp;quot; &amp;quot;%USERPROFILE%\Zotero\better-bibtex.sqlite&amp;quot; &amp;quot;%USERPROFILE%\Zotero\zotero.sqlite&amp;quot; %1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&lt;br /&gt;
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=359</id>
		<title>Windowsにおける仮想的ディスプレイ</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=359"/>
		<updated>2025-10-02T06:08:58Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;例えばZoomでプレゼンテーションをするときに、PowerPointの「発表者ツール」を使いたければ、普通は2つのディスプレイが必要である。しかしディスプレイが常に2つあるとは限らないので、画面共有に使用するだけの「仮想的なサブディスプレイ」があればいいのではないか、という発想がうまれる。他には、リモートのみで使用するPCや、ゲーム画面の配信などにおいても需要があるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策1-&amp;amp;#45;-ダミープラグ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策1 &amp;amp;#45; ダミープラグ ==&lt;br /&gt;
&lt;br /&gt;
そこそこ普及している、ハードウェア的な解決策である。端子に差し込むとディスプレイが接続しているものと誤認させることができる。EDIDエミュレータとも呼ぶ？価格は500&amp;amp;#45;1000円程度。4K対応かどうかなどスペックにより値段に多少の差はあるだろう。近年はHDMIが主流と思われるが、VGAのものもある（こちらは自作が可能との情報も）。&lt;br /&gt;
&lt;br /&gt;
金はかかるが、後者の解決策にないメリットとして、一気に複数のOSに対応できる（製品による？）というのがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策2-&amp;amp;#45;-ソフトウェア的に&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策2 &amp;amp;#45; ソフトウェア的に ==&lt;br /&gt;
&lt;br /&gt;
しかしPCを騙すためだけの虚構的な存在に金を払うのも考えれば面白くない話である。ソフトウェア的に解決できないだろうか。ということでこの記事ではWindowsに対するソフトウェア的解決策を紹介する。なおLinuxについてはxvfb?だとか、そういうのを使えばできそうな気がしたが今のところ手元ではできていない。できたら記事を書くかも。Macは持っていないので試せないが、[https://github.com/tSoniq/displayx https&amp;amp;#58;//github.com/tSoniq/displayx]とか、betterdisplayとかがあるらしい。PowerPointやゲーム実況という用途を考えるとWindowsが一番需要が大きそうではある。&lt;br /&gt;
&lt;br /&gt;
ソフトウェア的解決策が欲しいといってすぐソフトが出てくればいいが、調べてもあまり出てこない。比較的それっぽくて怪しくなさそうだったのが&lt;br /&gt;
&lt;br /&gt;
[https://www.amyuni.com/forum/viewtopic.php?t=3030 https&amp;amp;#58;//www.amyuni.com/forum/viewtopic.php?t&amp;amp;#61;3030]&lt;br /&gt;
&lt;br /&gt;
だが、それでもやはりちょっと素性が知れない。もう少し調べていくと、Indirect Display Driver (IDD)という技術を使うとそういうソフトウェアが書けるというMicrosoftのドキュメントが出てきた。そこからさらに調べてみるとこんなものがあった。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/roshkins/IddSampleDriver &amp;lt;span&amp;gt;https://github.com/roshkins/IddSampleDriver&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
これを試したら無事動いたので、ついでに解像度を変えてみたら、普通に8Kくらいまで動いた（ただしその分重くなる）。↑のレポジトリでも解像度増やしてというissueがあったので、forkして公開した。さらにver0.0.1.2では&amp;amp;quot;C&amp;amp;#58;\IddSampleDriver\option.txt”というファイルを設定することで解像度オプションやディスプレイの個数をユーザーが設定できるように変更した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/IddSampleDriver &amp;lt;span&amp;gt;https://github.com/ge9/IddSampleDriver&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
本家のreadmeで紹介された結果、どうやらゲーム配信関係のRedditとかに載ったみたいで、実質的にはほぼ何もしていないのに800以上のstarを獲得している。&lt;br /&gt;
&lt;br /&gt;
また、さらにこれをforkしたものとして[https://github.com/VirtualDrivers/Virtual-Display-Driver &amp;lt;span&amp;gt;https://github.com/VirtualDrivers/Virtual-Display-Driver&amp;lt;/span&amp;gt;]が作られ、これはすでに5000starを超える大きなプロジェクトになっている。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strong&amp;gt;こちらはHDRにも対応していて積極的に開発されているので、今は基本的にはこちらを使ったほうがいいだろう。&amp;lt;/strong&amp;gt;（以下の情報はIddSampleDriverなので古いかもしれない）&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
以下、このソフトの話を主にしていく。&lt;br /&gt;
&lt;br /&gt;
== インストール手順 ==&lt;br /&gt;
&lt;br /&gt;
Scoopを使う方法と使わない方法の2種類がある。いずれもリポジトリのREADME.mdに書いてある通りで、それほど難しくはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scoopを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scoopを使う ====&lt;br /&gt;
&lt;br /&gt;
筆者がかかわったものではないが、Scoopを用いてインストールができるようにしてくれた方がいるようである。インストールを行うスクリプトのソースコードは[https://github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver-ge9-np.json https&amp;amp;#58;//github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver&amp;amp;#45;ge9&amp;amp;#45;np.json]にある。&lt;br /&gt;
&lt;br /&gt;
==== 通常のインストール ====&lt;br /&gt;
&lt;br /&gt;
途中で、バッチファイルを用いて証明書（.cerという拡張子のファイル）を&amp;lt;em&amp;gt;ローカルコンピューター&amp;lt;/em&amp;gt;の「&amp;lt;em&amp;gt;信頼されたルート証明機関」に&amp;lt;/em&amp;gt;登録する必要がある。そのバッチファイルではcertutilが使用されている（ちなみに以前のリリースではcertmgrが使用されていた）が、証明書を開いて表示される画面からの操作などによっても可能である。&lt;br /&gt;
&lt;br /&gt;
登録を行わないと、デバイスマネージャで「このドライバーはデジタル署名されていません。」と警告が出て、最終的に「デバイスをインストール中にエラーが発生しました。」「ストアへドライバーを追加する際に問題が発生しました。」と言われて失敗する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/installing-test-certificates https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/install/installing&amp;amp;#45;test&amp;amp;#45;certificates]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://garafu.blogspot.com/2014/04/blog-post.html https&amp;amp;#58;//garafu.blogspot.com/2014/04/blog&amp;amp;#45;post.html]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発者向け情報 ==&lt;br /&gt;
&lt;br /&gt;
Indirect Display DriverについてはMicrosoft公式のドキュメントや公式サンプル[https://github.com/microsoft/windows-driver-samples/tree/master/video/IndirectDisplay https&amp;amp;#58;//github.com/microsoft/windows&amp;amp;#45;driver&amp;amp;#45;samples/tree/master/video/IndirectDisplay] を参照（IddSampleDriverはこれを編集してできたようである）。前述の通り自分は解像度を増やしただけなので技術的なことについては何もわかっていない。&lt;br /&gt;
&lt;br /&gt;
公式サンプルはなんといっても公式のものであるから、まずはこれをビルドできる状態にするのが確実だろう。以下の説明は2021年8月頃にWindows10で試したときのものである。ビルドしようとするとWindowsUserModeDriver10.0がないと言われるので、[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/download&amp;amp;#45;the&amp;amp;#45;wdk] を入れる。&lt;br /&gt;
&lt;br /&gt;
すると次は「Spectre軽減策」（セキュリティ関係？）に関するエラーが出た。そこでVisual Studioのインストール時の「個別のコンポーネント」→「コンパイラ、ビルドツール、およびランタイム」のところから「最新」「（ARMではなく）x86とx64」と書いてある「Spectre軽減ライブラリ」を入れる（細かい表示は正確に記録していないかもしれないor変わっているかもしれない）。「SDK、ライブラリ、およびフレームワーク」にあるMFCとかATLみたいなやつは要らなさそうっぽい。&lt;br /&gt;
&lt;br /&gt;
これでビルドが通った。exeを管理者権限で起動するとBluetoothのところのその他のデバイスとかに表示されるところまではいった。tmhがないとかSpectre関連のエラーとかwdfのエラーとか色々出ていたが全部大丈夫になった。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/win32/api/swdevice/nf-swdevice-swdevicecreate https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/windows/win32/api/swdevice/nf&amp;amp;#45;swdevice&amp;amp;#45;swdevicecreate]に書いてあるように、SwDeviceCreateを呼びだすには管理者権限が必要である。従って、IddSampleDriverのようなソフトウェアをインストールするには管理者権限が事実上必須ということになる。ただし、インストールされたIddSampleDriverというデバイス自体は一般ユーザーでも使用可能である。&lt;br /&gt;
&lt;br /&gt;
では次に本題のIddSampleDriverをビルドする。公式サンプルがビルドできている状況ならこちらも通るものと期待できる。少なくとも手元ではそうなった。逆にIddSampleDriverから始めてみても同様に、WindowsUserModeDriver10.0のエラー→Spectreのエラー、などとなった。&lt;br /&gt;
&lt;br /&gt;
以下、当時の元リポジトリをビルドした際のメモ&lt;br /&gt;
&lt;br /&gt;
* ソースコードに赤線は出ていたがコンパイルは通る。署名に関するエラー（file digestがなんとか）が出るのでプロジェクトのプロパティの下のほうのDriver SigningのFile Digest Algorithmに SHA256 と書く。&lt;br /&gt;
* 解像度やリフレッシュレートの設定が不適切だと、デバイスマネージャで何度か再読み込みされる感じの動作をしたあと自動的に停止され警告アイコンが表示される。&lt;br /&gt;
* 日付を超えるとタイムゾーン（筆者はJST&amp;amp;#61;UTC+9）の関係でInf2Catが失敗する。プロジェクトのプロパティからInf2Catのメニューに行き、General → Use Local Time を「はい (/uselocaltime)」に設定する。参考&amp;amp;#58; [https://monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html https&amp;amp;#58;//monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html]&lt;br /&gt;
** さらに、これを設定してもなぜか現地時間の21&amp;amp;#58;00～24&amp;amp;#58;00の間にビルドしたものは正常動作しなかった（ビルドは通るしデバイスマネージャでの警告アイコンも出ないのにサブディスプレイが出ない）ので、ビルド時はその範囲外になるようにPCの時計設定を適宜変更する（報告済み [https://github.com/roshkins/IddSampleDriver/issues/5 &amp;lt;span&amp;gt;https://github.com/roshkins/IddSampleDriver/issues/5&amp;lt;/span&amp;gt;]）&lt;br /&gt;
&lt;br /&gt;
自分でビルドしたやつのインストール時は、（おそらく自分のユーザー名を用いて署名が作られているため？）最初の一回のみ改めて.cerを登録する必要がある。二回目以降は、サブフォルダに生成されてるcat, dll, infをもってきて置き換えたあとデバイスマネージャから「ドライバーの更新」をすればよい。デバイスマネージャーは使ったフォルダをちゃんと覚えているようなので、頻繁に移動しなくていい安定した場所でビルドを行うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hdr対応について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HDR対応について ==&lt;br /&gt;
&lt;br /&gt;
Virtual&amp;amp;#45;Display&amp;amp;#45;DriverのほうではHDRに対応している。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VirtualDrivers/Virtual-Display-Driver/issues/32 https&amp;amp;#58;//github.com/VirtualDrivers/Virtual&amp;amp;#45;Display&amp;amp;#45;Driver/issues/32]や[https://github.com/roshkins/IddSampleDriver/issues/23 https&amp;amp;#58;//github.com/roshkins/IddSampleDriver/issues/23]で話題になっている通り、Windows 10ではHDRは動作しない。&lt;br /&gt;
&lt;br /&gt;
* HDRの基本についてはここがよさそう？ [https://zenn.dev/okuoku/scraps/ca346768627367 https&amp;amp;#58;//zenn.dev/okuoku/scraps/ca346768627367]&lt;br /&gt;
&lt;br /&gt;
=== その他参考情報 ===&lt;br /&gt;
&lt;br /&gt;
このIDDというのはUser&amp;amp;#45;modeで動作するやつなのだがKernel&amp;amp;#45;modeで動作するKMDODとかいうものもあるらしく、そっちの方が多くのことができるのかもしれない。前述の両リポジトリのHDR関連issueでも言及されている。ただし調べた感じ、ただちに使えそうなものは見つからなかった。まあWindowsのディスプレイドライバなんか趣味でそうそう書くもんではないのでしょうがない。&lt;br /&gt;
&lt;br /&gt;
一応適当に調べて出てきた参考リンクなど&lt;br /&gt;
&lt;br /&gt;
* IDDとKMDODに関する議論（2019年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/291368/wddm-display-only-driver-to-create-a-virtual-display-monitor https&amp;amp;#58;//community.osr.com/discussion/291368/wddm&amp;amp;#45;display&amp;amp;#45;only&amp;amp;#45;driver&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;monitor]&lt;br /&gt;
* KMDODで仮想ディスプレイを作れるかどうかについて(2017年)&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/286843/how-to-implement-virtual-display-adapter https&amp;amp;#58;//community.osr.com/discussion/286843/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter]&lt;br /&gt;
** そこで言及されているLin JiaBang氏のソフト（動作未確認）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/LinJiabang/virtual-display &amp;lt;span&amp;gt;https://github.com/LinJiabang/virtual-display&amp;lt;/span&amp;gt;]&lt;br /&gt;
* WDDMで仮想ディスプレイを作れるかどうかについて（2016年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/2d60c1c2-5198-47e2-b5d9-2ba28461e72e/how-to-implement-virtual-display-adapter-driver-on-windows-10?forum=wdk https&amp;amp;#58;//social.msdn.microsoft.com/Forums/vstudio/ja&amp;amp;#45;JP/2d60c1c2&amp;amp;#45;5198&amp;amp;#45;47e2&amp;amp;#45;b5d9&amp;amp;#45;2ba28461e72e/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter&amp;amp;#45;driver&amp;amp;#45;on&amp;amp;#45;windows&amp;amp;#45;10?forum&amp;amp;#61;wdk]&lt;br /&gt;
&lt;br /&gt;
== 課題 ==&lt;br /&gt;
&lt;br /&gt;
あくまで仮想的なディスプレイであるからその中身を目視で確認することはできない（ただし別途その内容をウインドウに表示するソフトなどは作れそう）。従って例えば、これを使って共有している間にZoomのミーティングコントロールが非表示になってミュートのon/offなどができなくなるなどの不便さはある。&lt;br /&gt;
&lt;br /&gt;
ちなみに、Windowsでのマルチモニター管理を切り替えるメニューのショートカットはWin+Pであるが、ここで「セカンドスクリーンのみ」を選ぶなどして仮想でないほうのディスプレイが真っ暗になってしまったときはWin+Pを押せば復帰できる。&lt;br /&gt;
&lt;br /&gt;
== 変更記録 ==&lt;br /&gt;
&lt;br /&gt;
もともとディスプレイは5個追加されるが、重過ぎるのでNUM_VIRTUAL_DISPLAYSを1に変更。&lt;br /&gt;
&lt;br /&gt;
解像度を大きくしたいのでソースコードを「1920」で検索し、3840x2160と2560x1440を追加する。&lt;br /&gt;
&lt;br /&gt;
まず s_KnownMonitorModes のところ。この際リフレッシュレートが60HzになるようにPixel Clock Rateをちゃんと計算する必要がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;{&lt;br /&gt;
      229008 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, 2560 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, (2560 + 40) * (1440 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 2560, 1440 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 2560 + 40, 1440 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
      509366 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, 3840 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, (3840 + 40) * (2160 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 3840, 2160 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 3840 + 40, 2160 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のようにする。Pixel Clock Rateの数値は多少のズレがあってもいいみたい？だけど気分的に少しだけ大きめに設定してある。&lt;br /&gt;
&lt;br /&gt;
そのすぐ下のEDIDのところはそのままでよさげ。&lt;br /&gt;
&lt;br /&gt;
そして、一番下のほうのTargetModesのところを変える。配列サイズの変更も忘れずに。いやvectorだから関係ないか。&lt;br /&gt;
&lt;br /&gt;
ちなみにs_KnownMonitorModesがノータッチだとここには1920x1280までしか書けないっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;edid編集に関してメモ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== EDID編集に関して（メモ） ==&lt;br /&gt;
&lt;br /&gt;
HDR機能の追加に使えるかと思ったが結局効果はなかった。&lt;br /&gt;
&lt;br /&gt;
Deltacast E&amp;amp;#45;EDID Editorがふつうに有能。ここに書いてあった&amp;amp;#58; [https://ameblo.jp/holycater/entry-12467348533.html https&amp;amp;#58;//ameblo.jp/holycater/entry&amp;amp;#45;12467348533.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.ninshoshiken.com/about-ajsc1-edid-editor/ https&amp;amp;#58;//www.ninshoshiken.com/about&amp;amp;#45;ajsc1&amp;amp;#45;edid&amp;amp;#45;editor/]&lt;br /&gt;
&lt;br /&gt;
[http://blawat2015.no-ip.com/~mieki256/diary/201602063.html http&amp;amp;#58;//blawat2015.no&amp;amp;#45;ip.com/&amp;amp;#126;mieki256/diary/201602063.html]&lt;br /&gt;
&lt;br /&gt;
[http://www.edidreader.com/ http&amp;amp;#58;//www.edidreader.com/]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=358</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=358"/>
		<updated>2025-10-02T06:08:55Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost &amp;lt;span&amp;gt;https://github.com/ginuerzh/gost&amp;lt;/span&amp;gt;], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 &amp;lt;span&amp;gt;https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17&amp;lt;/span&amp;gt;]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy &amp;lt;span&amp;gt;https://github.com/snail007/goproxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust &amp;lt;span&amp;gt;https://github.com/shadowsocks/shadowsocks-rust&amp;lt;/span&amp;gt;]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。ドメイン→IPを決め打ちする場合は多くのソフトウェアでできそうだが、任意ドメインに対してDNSで解決しつつ振り分けるのは対応していない場合もある。gostはこれにも対応している。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;は対応しているが、ngx_stream_ssl_preread_moduleとかが必要なので、環境によっては動かしづらいかもしれない。&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;は自分が試した限りでは動かせなかった。これらの汎用のプロキシサーバーの他に、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* Nginxでの使用例（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]とか[https://turgenev.hatenablog.com/entry/2025/04/27/215220 【広告ブロックDNS】特定ドメインへのTCP接続を途中で切断してAd-Shield対策 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy &amp;lt;span&amp;gt;https://github.com/dlundquist/sniproxy&amp;lt;/span&amp;gt;]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy &amp;lt;span&amp;gt;https://github.com/inetaf/tcpproxy&amp;lt;/span&amp;gt;]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy &amp;lt;span&amp;gt;https://github.com/ameshkov/sniproxy&amp;lt;/span&amp;gt;]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy &amp;lt;span&amp;gt;https://github.com/puxxustc/sniproxy&amp;lt;/span&amp;gt;]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDP（ただし筆者が念頭に置いているのはAssociateのみで、Bindに関してはほぼ調べていない）に対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh &amp;lt;span&amp;gt;https://github.com/ge9/socks-with-udp-over-ssh&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
* このツールでは、DNSリクエストを解釈してサーバー側（サーバー側から見えている外部のDNSを指定してもよい）で解決を行う機能も実装してある。この機能は”fake dns”と名付けているが、shadowsocks&amp;amp;#45;rustのfake dnsやtun2proxyのvirtual dnsはこれとは異なる機能のようである。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy &amp;lt;span&amp;gt;https://github.com/3proxy/3proxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 &amp;lt;span&amp;gt;https://github.com/dizda/fast-socks5&amp;lt;/span&amp;gt;] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 &amp;lt;span&amp;gt;https://github.com/txthinking/socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、現在もメンテされているgo製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 &amp;lt;span&amp;gt;https://github.com/ge9/socks5&amp;lt;/span&amp;gt;]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 &amp;lt;span&amp;gt;https://github.com/armon/go-socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 &amp;lt;span&amp;gt;https://github.com/whyvl/wireproxy/issues/15&amp;lt;/span&amp;gt;]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 &amp;lt;span&amp;gt;https://github.com/things-go/go-socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 &amp;lt;span&amp;gt;https://github.com/things-go/go-socks5/pull/63&amp;lt;/span&amp;gt;]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 &amp;lt;span&amp;gt;https://github.com/ge9/go-socks5&amp;lt;/span&amp;gt;] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 &amp;lt;span&amp;gt;https://github.com/haxii/socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 &amp;lt;span&amp;gt;https://github.com/wzshiming/socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 &amp;lt;span&amp;gt;https://github.com/whyvl/wireproxy/issues/15&amp;lt;/span&amp;gt;]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 &amp;lt;span&amp;gt;https://github.com/haochen233/socks5&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 &amp;lt;span&amp;gt;https://github.com/whyvl/wireproxy/issues/15&amp;lt;/span&amp;gt;]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。VPNと同等の動作で、基本的には管理者権限（Linuxの場合、最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
以下のいずれも、ドメイン解決にはプロキシが適用されない（Linux向けの2つはできなくはないかもしれないが、しづらい）ことに注意。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy &amp;lt;span&amp;gt;https://github.com/heiher/hev-socks5-tproxy&amp;lt;/span&amp;gt;] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre &amp;lt;span&amp;gt;https://github.com/wiresock/proxifyre&amp;lt;/span&amp;gt;] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
上記と似ているが、VPNとして動作するもの。プロセスが特定しづらい場合・特定のIPアドレス範囲だけで十分な場合などに効果を発揮する。&lt;br /&gt;
&lt;br /&gt;
以下は特筆しない限りUDP Associateに対応。もちろん、pingなどは通らない。&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy &amp;lt;span&amp;gt;https://github.com/tun2proxy/tun2proxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel &amp;lt;span&amp;gt;https://github.com/heiher/hev-socks5-tunnel&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun &amp;lt;span&amp;gt;https://github.com/heiher/sockstun&amp;lt;/span&amp;gt;]もここから。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 &amp;lt;span&amp;gt;https://github.com/rofl0r/proxychains-ng/issues/336&amp;lt;/span&amp;gt;]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 &amp;lt;span&amp;gt;https://github.com/rofl0r/proxychains-ng/issues/103&amp;lt;/span&amp;gt;]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover &amp;lt;span&amp;gt;https://github.com/hdrover/discord-drover&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy &amp;lt;span&amp;gt;https://github.com/runetfreedom/discord-voice-proxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;localhostlanなどへのアクセス制限&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== localhost・LANなどへのアクセス制限 ==&lt;br /&gt;
&lt;br /&gt;
典型的な設定例として、localhostやプライベートIPへのアクセスを制限する設定をSquid・Dante・3proxyそれぞれに関して紹介しておく。&lt;br /&gt;
&lt;br /&gt;
プロキシ側で設定せず、cgroupなどを使ってファイアウォール側で制御する方法もある。&lt;br /&gt;
&lt;br /&gt;
==== squid ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;to_localhost&amp;lt;/code&amp;gt;はbuilt&amp;amp;#45;inとして定義されていて、&amp;lt;code&amp;gt;localnet&amp;lt;/code&amp;gt;（&amp;amp;#61;srcがlocalnet）についてもUbuntuパッケージで提供されるsquid.confには入っているのだが、localnetがdstであるものとなるとACLが定義されていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;deny to_localhost&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;deny to_linklocal&amp;lt;/code&amp;gt;は定義済みという前提で、以下のように書くとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;acl to_localnet dst 0.0.0.1-0.255.255.255&lt;br /&gt;
acl to_localnet dst 10.0.0.0/8&lt;br /&gt;
acl to_localnet dst 100.64.0.0/10&lt;br /&gt;
acl to_localnet dst 172.16.0.0/12&lt;br /&gt;
acl to_localnet dst 192.168.0.0/16&lt;br /&gt;
acl to_localnet dst fc00::/7&lt;br /&gt;
&lt;br /&gt;
http_access deny to_localnet&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;deny * * 127.0.0.0/8,0.0.0.1-0.255.255.255,10.0.0.0/8,100.64.0.0/10,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16 * * * *&lt;br /&gt;
allow *&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dante ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。squid・3proxyの場合と違って0.0.0.0もblockしてしまっているが、そもそも使わないので問題ないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;client pass {&lt;br /&gt;
  from: 0/0  to: 0/0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 127.0.0.0/8 # localhost&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/8 # RFC 1122 &amp;quot;this&amp;quot; network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 10.0.0.0/8        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 100.64.0.0/10     # RFC 6598 shared address space (CGN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 169.254.0.0/16    # RFC 3927 link-local (directly plugged) machines&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 172.16.0.0/12     # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 192.168.0.0/16        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks pass {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/0&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;natが介在する場合などのudp-associateの動作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== NATが介在する場合などのUDP Associateの動作 ====&lt;br /&gt;
&lt;br /&gt;
OpenSSHの項目でも関連することを述べたが、UDP&amp;amp;#45;over&amp;amp;#45;TCPの性能劣化を避けるため、UDP Associateは「サーバー側がクライアント側に対してUDP通信で使うための中継ポートを通知する」という動作を伴う。この際、ネットワーク上でクライアント側からサーバーが直接見えていればよいが、NATを介している場合、クライアントから見たときのサーバーのIPとサーバー自身から見たときのサーバーのIP（中継ポート通知に含まれるのはこれ）が異なることがあり、通信が成立しなくなってしまう（SSHのポート転送を普通に使うだけではUDP Associateが使えないのも直接にはこれが原因）。&lt;br /&gt;
&lt;br /&gt;
ただし、[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]にも書いた通り、Proxifyreやhev&amp;amp;#45;socks5&amp;amp;#45;tproxyなどは中継ポート通知のIP部分を無視するため、ポート番号が変わらないNATであれば問題なく動作する（redsocksはダメ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
透過SOCKSプロキシの場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]）（さらに、繰り返しになるが付け加えておくと、普通にセットアップした場合はDNSにプロキシは使われない）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 &amp;lt;span&amp;gt;https://github.com/FelisCatus/SwitchyOmega/issues/1379&amp;lt;/span&amp;gt;]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる（これは[https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ FAQ]にも書いてある）一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 &amp;lt;span&amp;gt;https://github.com/FelisCatus/SwitchyOmega/issues/2304&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことが多くなるだろう。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 &amp;lt;span&amp;gt;https://github.com/semigodking/redsocks/issues/210&amp;lt;/span&amp;gt;]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 &amp;lt;span&amp;gt;https://github.com/ginuerzh/gost/issues/96&amp;lt;/span&amp;gt;]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 &amp;lt;span&amp;gt;https://github.com/txthinking/socks5/issues/15&amp;lt;/span&amp;gt;]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 &amp;lt;span&amp;gt;https://github.com/things-go/go-socks5/issues/29&amp;lt;/span&amp;gt;]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy &amp;lt;span&amp;gt;https://github.com/KaranGauswami/socks-to-http-proxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel &amp;lt;span&amp;gt;https://github.com/prof7bit/udp-reverse-tunnel&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy &amp;lt;span&amp;gt;https://github.com/vi/wgslirpy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy &amp;lt;span&amp;gt;https://github.com/whyvl/wireproxy&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 &amp;lt;span&amp;gt;https://github.com/whyvl/wireproxy/issues/30&amp;lt;/span&amp;gt;]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
&lt;br /&gt;
== その他の話題 ==&lt;br /&gt;
&lt;br /&gt;
==== ドメインごとにプロキシを変更できるブラウザ拡張のiframeにおける動作 ====&lt;br /&gt;
&lt;br /&gt;
FoxyProxyやSwitchyOmega(ZeroOmega)など、ドメインごとに自動でプロキシを切り替えてくれるブラウザ拡張はChromium系にもFirefoxにもいくつかあるが、これらはあくまでコンテンツのオリジンを元にプロキシを適用しており、ブラウザのタブを見ているわけではない。つまり、foo.comのページを開いていて、そこにbar.comのコンテンツがiframeで埋め込まれている場合、iframeの内部は、bar.comに対して使用するものと指定されたプロキシを使用して処理される。&lt;br /&gt;
&lt;br /&gt;
一応、[https://superuser.com/questions/250172/disable-enable-the-proxy-on-a-tab-by-tab-basis-in-firefox Disable/enable the proxy on a tab by tab basis in Firefox]によると、Firefoxのcontainer&amp;amp;#45;proxyというのがこれに近い機能を実質的に実現してくれるらしい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AEGUI%EF%BC%88X11/Wayland%EF%BC%89&amp;diff=357</id>
		<title>LinuxのGUI（X11/Wayland）</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AEGUI%EF%BC%88X11/Wayland%EF%BC%89&amp;diff=357"/>
		<updated>2025-10-02T06:08:53Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;wayland&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wayland ==&lt;br /&gt;
&lt;br /&gt;
とりあえずはGNOMEでの設定内容のみ。&lt;br /&gt;
&lt;br /&gt;
* gnomeパッケージ自体を入れる必要はない（ゲームとか無駄なものが入る）&lt;br /&gt;
** gdm(3)は最低限必要&lt;br /&gt;
** waylandを有効にするために多分mutterが要る&lt;br /&gt;
** gnome&amp;amp;#45;shell&amp;amp;#45;extensionsも（gnome shell extensionsを使うなら）要る（なぜかgnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerのdependenciesに入っていないため（バグ報告した&amp;amp;#58; [https://bugs.launchpad.net/ubuntu/+source/gnome-shell-extension-manager/+bug/1999001 Bug &amp;amp;#35;1999001 “gnome&amp;amp;#45;shell&amp;amp;#45;extensions is not in dependencies” &amp;amp;#58; Bugs &amp;amp;#58; gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;manager package &amp;amp;#58; Ubuntu]））&lt;br /&gt;
** gnome&amp;amp;#45;sessionはいらないかも&lt;br /&gt;
** [https://itsfoss.com/install-gnome-linux-mint/ https&amp;amp;#58;//itsfoss.com/install&amp;amp;#45;gnome&amp;amp;#45;linux&amp;amp;#45;mint/] にあるvanilla&amp;amp;#45;gnomeでもまだ余分なものが入っている気がする&lt;br /&gt;
* ここ参考になる [https://gihyo.jp/admin/serial/01/ubuntu-recipe/0717 https&amp;amp;#58;//gihyo.jp/admin/serial/01/ubuntu&amp;amp;#45;recipe/0717]&lt;br /&gt;
&lt;br /&gt;
指紋認証関連で弾かれる。pamとfprintdの連携がうまくいってない感があったので&amp;lt;code&amp;gt;libpam&amp;amp;#45;fprintd&amp;lt;/code&amp;gt;を入れたら治った。&lt;br /&gt;
&lt;br /&gt;
[https://sites.google.com/site/zoom2writej/ubuntu/ibus https&amp;amp;#58;//sites.google.com/site/zoom2writej/ubuntu/ibus]&lt;br /&gt;
&lt;br /&gt;
* USB&amp;amp;#45;Cのディスプレイを起動時に認識しない。刺し直すと認識する。なんでだろう。→なんかこれはシャットダウンして待ったりすると治るタイプのやつ。ハードウェア的な問題かな。dmesg &amp;amp;#45;ewとかで見れたりはする。Bad usb cable?とかなんとか言われてた気がする&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nvidia&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NVIDIA ===&lt;br /&gt;
&lt;br /&gt;
nvidiaが入っている状態だとちょっとめんどくてデフォルトだとXorgにされる。&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/k0kubun/items/c1162098cbd7eba1bed0 https&amp;amp;#58;//qiita.com/k0kubun/items/c1162098cbd7eba1bed0]&lt;br /&gt;
&lt;br /&gt;
に書いてあるとおり&amp;lt;code&amp;gt;nvidia&amp;amp;#45;drm.modeset&amp;amp;#61;1&amp;lt;/code&amp;gt;をするといける。（それだけだとだめだったという情報もあるっちゃあるがこっちでは大丈夫だった）&lt;br /&gt;
&lt;br /&gt;
* GRUB_CMDLINE_LINUX_DEFAULTに入れるとリカバリモードのオプションには追加されない[https://gihyo.jp/admin/serial/01/ubuntu-recipe/0743 第743回　Ubuntuの標準ブートローダーであるGRUBを改めて見直す | gihyo.jp]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NVIDIA上のmpv/celluloid&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
手元では&amp;lt;code&amp;gt;gpu&amp;amp;#45;context&amp;amp;#61;x11vk&amp;lt;/code&amp;gt;が効果あり。mpvはこれだけでいけた。&lt;br /&gt;
&lt;br /&gt;
celluloidの場合、さらに環境変数の&amp;lt;code&amp;gt;__EGL_VENDOR_LIBRARY_FILENAMES&amp;amp;#61;/usr/share/glvnd/egl_vendor.d/50_mesa.json&amp;lt;/code&amp;gt;が必要。参考&amp;amp;#58; [https://github.com/mpv-player/mpv/issues/9393 &amp;lt;span&amp;gt;https://github.com/mpv-player/mpv/issues/9393&amp;lt;/span&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
* applicationsの.desktopのほうでは、&amp;lt;code&amp;gt;env __EGL_VENDOR_LIBRARY_FILENAMES&amp;amp;#61;/usr/share/glvnd/egl_vendor.d/50_mesa.json celluloid &amp;amp;#45;&amp;amp;#45;mpv&amp;amp;#45;gpu&amp;amp;#45;context&amp;amp;#61;x11vk %U&amp;lt;/code&amp;gt;としておけばよい。&lt;br /&gt;
&lt;br /&gt;
ただ、x11vkでperformanceが悪いというissueもある。[https://github.com/mpv-player/mpv/issues/10326 &amp;lt;span&amp;gt;https://github.com/mpv-player/mpv/issues/10326&amp;lt;/span&amp;gt;] 見た感じこちらでは問題ない。&lt;br /&gt;
&lt;br /&gt;
x11eglだと&amp;lt;code&amp;gt;libEGL warning&amp;amp;#58; DRI3&amp;amp;#58; Screen seems not DRI3 capable&amp;lt;/code&amp;gt;と言われるが動いてはいるっぽい。&lt;br /&gt;
&lt;br /&gt;
他にもいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.archlinux.org/title/mpv https&amp;amp;#58;//wiki.archlinux.org/title/mpv]&lt;br /&gt;
&lt;br /&gt;
gnome&amp;amp;#45;session&amp;amp;#45;inhibitとかいうのは電源関連なのでそのさきの話かな。&lt;br /&gt;
&lt;br /&gt;
==== 日本語入力 ====&lt;br /&gt;
&lt;br /&gt;
ibus&amp;amp;#45;mozcは廃止される？とかなんとか。Waylandに対応したfcitx5を使うのがよさそう。&lt;br /&gt;
&lt;br /&gt;
全体的にはここ [https://gihyo.jp/admin/serial/01/ubuntu-recipe/0689 https&amp;amp;#58;//gihyo.jp/admin/serial/01/ubuntu&amp;amp;#45;recipe/0689] （前述の第717回の記事でも引用されている）が参考になるかと。&lt;br /&gt;
&lt;br /&gt;
基本的にはfcitx5&amp;amp;#45;diagnoseを使って赤文字のところ（問題点）を順番に直していくのがよい。&lt;br /&gt;
&lt;br /&gt;
まずGNOMEがめっちゃibus使おうとしてしまうらしいのでibus&amp;amp;#45;daemonを除去する必要があるらしい。そこでibusパッケージをremoveする。&lt;br /&gt;
&lt;br /&gt;
次に環境変数の&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;GTK_IM_MODULE=fcitx&lt;br /&gt;
QT_IM_MODULE=fcitx&lt;br /&gt;
XMODIFIERS=@im=fcitx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
が必要らしい。/etc/environmentでもいいが、ユーザーごとにしたければ（Waylandの場合だと）&amp;lt;code&amp;gt;&amp;amp;#126;/.config/environment.d/&amp;amp;#42;.conf&amp;lt;/code&amp;gt;に書くといいらしい。（参考&amp;amp;#58; [https://blog.vikke.name/2020/01/27/wayland%E3%81%A7%E3%81%AExprofile%E3%82%84xsession%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/ https&amp;amp;#58;//blog.vikke.name/2020/01/27/waylandでのxprofileやxsessionの代わりに環境変数を設定する/] 及びそこで引用されている[https://wiki.gnome.org/Initiatives/Wayland/SessionStart https&amp;amp;#58;//wiki.gnome.org/Initiatives/Wayland/SessionStart]）&lt;br /&gt;
&lt;br /&gt;
さらにgnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerを入れてkimpanelを追加する。これでいけるはず&lt;br /&gt;
&lt;br /&gt;
* gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerのバージョンをどうにかしたような気もするが詳細忘れ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;一応ibus使用時のメモ&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/spumoni/items/f1e5023829c575af4dd0 Ubuntu 21.04でキーボードがus配列に変わってしまう問題 &amp;amp;#45; Qiita]や[https://golang.hateblo.jp/entry/ubuntu22.04-keyboard-layout-mozc Ubuntu 22.04 でキーボードレイアウトおかしくなる問題。 &amp;amp;#45; golangの日記]とかに書いてあるようにibus&amp;amp;#45;mozcがjp配置を使うようにして（初期設定だとusになってしまう）、&amp;lt;code&amp;gt;ibus write&amp;amp;#45;cache&amp;lt;/code&amp;gt; と&amp;lt;code&amp;gt;ibus restart&amp;lt;/code&amp;gt;（ibusに接続できませんと言われたら&amp;lt;code&amp;gt;ibus&amp;amp;#45;daemon &amp;amp;#45;&amp;amp;#45;xim &amp;amp;#45;d &amp;amp;#45;r&amp;lt;/code&amp;gt;が有効かも）をする。いや普通に&amp;lt;code&amp;gt;ibus&amp;amp;#45;daemon &amp;amp;#45;&amp;amp;#45;xim &amp;amp;#45;d &amp;amp;#45;r&amp;lt;/code&amp;gt;だけでいいっぽい&lt;br /&gt;
&lt;br /&gt;
=== システムトレイ ===&lt;br /&gt;
&lt;br /&gt;
MEGAなどが正しく動作しなかった。[https://github.com/JetBrains/compose-jb/issues/1847 &amp;lt;span&amp;gt;https://github.com/JetBrains/compose-jb/issues/1847&amp;lt;/span&amp;gt;]に書いてあるとおり、extension managerから[https://extensions.gnome.org/extension/615/appindicator-support/ https&amp;amp;#58;//extensions.gnome.org/extension/615/appindicator&amp;amp;#45;support/] を入れるとうまく動作するようになる。&lt;br /&gt;
&lt;br /&gt;
* Linux Mint 21.1にしてから動かなくなった気がする&lt;br /&gt;
* &amp;lt;code&amp;gt;gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;appindicator&amp;lt;/code&amp;gt;というパッケージもある？&lt;br /&gt;
[[Category:IT]][[Category:Linux]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=356</id>
		<title>Windowsの右クリックメニューから複数ファイルをまとめて開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=356"/>
		<updated>2025-09-01T01:32:12Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;複数のファイルを別々にではなく&amp;lt;strong&amp;gt;一度にまとめて&amp;lt;/strong&amp;gt;開きたいということがある。すなわち”app.exe file1” “app.exe file2”…をそれぞれ実行するのではなく、”app.exe file1 file2 …”を実行したい。例えば複数の音楽ファイルを連続再生したいときなどである。&lt;br /&gt;
&lt;br /&gt;
ただ、エクスプローラ上で複数ファイルを選択して開く（右クリックで「開く」を選ぶorエンターキー）と、別々に実行されてしまう。では、右クリックメニューからこれを実行するにはどうすればいいか？というのがこの記事のテーマである。&lt;br /&gt;
&lt;br /&gt;
ついでに、パス長さ制限を超えるファイルやフォルダにおける機能制限も解決する。  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows10以前の右クリックメニューに戻す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windows10以前の右クリックメニューに戻す ==&lt;br /&gt;
&lt;br /&gt;
まず、Windows11に移行すると右クリックメニューの項目数が大幅に削られており、とても使いにくいので、Windows10までの仕様に戻す必要がある。[https://pc-karuma.net/right-click-context-menu-back-on-windows-11 Windows 11 &amp;amp;#45; 右クリックメニューを旧仕様に戻す方法 &amp;amp;#45; PC設定のカルマ]などに従って修正しよう。コマンド例は以下。これはユーザーごとの設定なので、&amp;lt;strong&amp;gt;管理者権限は不要&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&amp;quot; /f /ve&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ファイルを開く操作ならダブルクリックでできるわけで、それでもあえてファイルを右クリックするユーザーの層を考えれば、使用頻度の高いメニューに絞る必要がないことは明らかである。右クリックメニューは動作が重いという問題点も指摘されてきたが、それなら項目数を削る以外の方法でパフォーマンスを改善するのが筋だろう。そもそも、Windows 11の右クリックメニューもそれほど快適な動作ではない。&lt;br /&gt;
&lt;br /&gt;
なおバージョン22H2からはShift+右クリックで旧仕様のメニューが出るようになったようなので、それで十分という人は設定しなくてもよい。&lt;br /&gt;
&lt;br /&gt;
ちなみにこれ以降も同じだが、&amp;lt;code&amp;gt;HKEY_CURRENT_USER&amp;lt;/code&amp;gt;以下はユーザー別設定なのでPC自体の再起動をしなくてもログアウト（サインアウト）→ログイン（サインイン）で全て反映されるはず。また今回の例に関しては、実際にはexplorerの再起動で十分である。&lt;br /&gt;
&lt;br /&gt;
=== 動画の右クリックメニューの順番がおかしい ===&lt;br /&gt;
&lt;br /&gt;
動画ファイル（mp4やmkvなど）に関して、右クリックメニューの順番がおかしくなるという問題がある。具体的には、全ファイル共通のメニュー（「お気に入りに追加」など）とClipchampのメニューが普通の「開く」よりも上に表示されてしまう。また単一ファイル選択時だと（関連付けがすでに設定されているにもかかわらず）「プログラムから開く」が太字になってしまっている。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはどうやらClipchampのメニューが悪いらしく、[https://www.elevenforum.com/t/add-or-remove-edit-with-clipchamp-context-menu-in-windows-11.6882/ Add or Remove Edit with Clipchamp Context Menu in Windows 11 Tutorial | Windows 11 Forum]（[https://www.elevenforum.com/t/clipchamp-context-menu-removal.6150/ Clipchamp context menu removal | Windows 11 Forum]に書いてあった）や[https://www.naporitansushi.com/clipchamp-context-menu-disable/# Windowsの右クリックの「Clipchampで編集」を削除する方法 | ナポリタン寿司のPC日記]に書いてある通り、Clipchampのメニューを非表示にすると治る。コマンド例は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked&amp;quot; /v {8AB635F8-9A67-4698-AB99-784AD929F3B4} /f&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* HKLMでも設定できる。また、「デバイス キャスト」を非表示にする場合はUUIDを&amp;lt;code&amp;gt;&amp;amp;#123;7AD84985&amp;amp;#45;87B4&amp;amp;#45;4a16&amp;amp;#45;BE58&amp;amp;#45;8B72A5B390F7&amp;amp;#125;&amp;lt;/code&amp;gt;に変える。&lt;br /&gt;
&lt;br /&gt;
Clipchampを表示したまま順番を治す方法は不明だが、自分でメニューを作ればできるかもしれない。Clipchampのメニューの実装に使われていると思われるIContextMenuについては後でも述べているのでそちらも参照。おそらくClipchampによるこのインターフェースの実装にバグがあるためにこのような挙動をしているのであろう。&lt;br /&gt;
&lt;br /&gt;
以下に修正後の正しい表示を載せておく。いずれの例でも関連づけはデフォルトのメディア プレイヤーが使われているものと仮定している（書いていて気付いたが、同一アプリにもかかわらず「プレーヤー」「プレイヤー」の表記ゆれがある）。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 不完全な解決策 ==&lt;br /&gt;
&lt;br /&gt;
本題に入る。まずは、不完全ではあるがそこそこ簡単な解決策を紹介する。それは右クリックメニューにある「送る」を使う方法である。エクスプローラのアドレスバーに&amp;lt;code&amp;gt;shell&amp;amp;#58;sendto&amp;lt;/code&amp;gt;と入力すると「送る」メニューの元になっているフォルダを開くことができる。ここにショートカットやファイルを追加しておけば、それが右クリックメニューに表示され、選択されたファイルをまとめてコマンド引数として渡してくれる。ショートカットを編集すればオプションも渡せる（あるいはバッチファイルを突っ込んでもよい）。&lt;br /&gt;
&lt;br /&gt;
* 今後紹介する方法にも共通するが、ファイルの順番としては、メインとして選択されたもの（右クリックされたもの）から下方向に進んでいき、下端まで達したら一番上に戻ってそれから選択されたものの直前まで進む。例えばファイルが”0”から”9”までの10個あるフォルダで全選択をして”5”を右クリックして「送る」を使うと、5 6 7 8 9 0 1 2 3 4の順番で渡される。&lt;br /&gt;
&lt;br /&gt;
しかしこの「送る」には弱点があり、&amp;amp;#91;ref&amp;amp;#93;で紹介したように、この「送る」メニューは260文字の長さ制限を超えるパスをもつファイルに対してはうまく機能しない。音楽ファイルなんかはアーティスト名も曲名も色々入って長大な名前になりがちで、実際に自分がこれで困ることになった。&lt;br /&gt;
&lt;br /&gt;
もう一つ、「送る」メニューは拡張子に関連付けられないという問題がある。つまり、音声ファイルを一度に開くためだけのコマンドも、画像ファイルを一度に開くためだけのコマンドも、全てのファイルを対象とした「送る」メニューにまとめて入れざるを得ない。メニュー数が無駄に増えればそれだけ管理・操作もしづらくなる。ついでに言えば、「送る」を一旦クリックしてから中の項目を選ぶ手間もなかなかバカにできないところがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;前提知識-&amp;amp;#45;-メニューを管理するレジストリ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 前提知識 &amp;amp;#45; メニューを管理するレジストリ ==&lt;br /&gt;
&lt;br /&gt;
右クリックメニュー関連の設定はレジストリを使って管理されている。この記事では上記「送る」の問題を解決する方法をこの後で2つ紹介するが、いずれもレジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;という名前のキー（設定内容に応じて色々な所に設置されている）を編集する必要がある。それにあたって、前提知識としてレジストリの内容をある程度理解しておく必要があるだろう。&lt;br /&gt;
&lt;br /&gt;
この話題に関しては比較的多くのサイトで解説があるが、Windowsのバージョンごとにかなり頻繁に仕様が変わっているようで、不十分なサイトも多い。最も優れているのは[https://www.pg-fl.jp/program/winreg/classes.htm Windowsレジストリ解剖記]で、かなり量は多いが、バージョンによる挙動の違いまで細かく示されている。&lt;br /&gt;
&lt;br /&gt;
この記事に必要な操作を行うためには&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の場所だけわかっていればいちおう十分だが、以下の内容くらいは覚えておいたほうがよい。&lt;br /&gt;
&lt;br /&gt;
* HKEY_CURRENT_USERはHKCUと略され、ユーザーごとの設定を管理する。原則、変更はユーザー権限のみで可能。色々いじっても比較的安全。&lt;br /&gt;
* HKEY_LOCAL_MACHINEはHKLMと略され、システム全体（全ユーザー対象）の設定を管理する。変更には管理者権限が必要。設定は慎重に。&lt;br /&gt;
* HKEY_CLASSES_ROOTはHKCRと略され、関連付け専用のもので、&amp;lt;strong&amp;gt;HKCU\Software\ClassesとHKLM\Software\Classesの内容を合わせたものが表示される&amp;lt;/strong&amp;gt;。関連づけの設定を確認するにはここを見るのがいいが、設定を変更する際にはここをいじるとHKLMのほうが変わってしまうことがあるので&amp;lt;strong&amp;gt;HKCU\Software\Classesを変更したほうがよい&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
以下では、設定方法を①ProgIDを使うもの②完全に独自のメニューを追加するもの と大きく二つに分けて記述する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;progidを使うもの&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ProgIDを使うもの ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
特定の拡張子をもつファイルをダブルクリックやEnterで開くときに使われるプログラム、あるいは「既定のプログラム」あるいは「ファイルを開くプログラムの選択」のようなダイアログが表示されるときに表示されるプログラムは、この&amp;lt;strong&amp;gt;ProgID&amp;lt;/strong&amp;gt;を用いて管理されている。この方法のメリットは、何より「ダブルクリックまたはEnterキー一発で起動できる」という操作性である。また、Windows11以前のメニューに戻さなくても使いやすい。&lt;br /&gt;
&lt;br /&gt;
* 複数選択した際は「送る」と同様の順番で渡されるが、右クリックをしない場合は”メインとして選択されたファイル”がどれであるかが若干分かりづらい。基本的には最後に（左）クリックされたものになるはずで、よく見るとそれだけ少し太い（濃い）枠で表示されていることがわかる。なので音楽再生時など複数ファイルを上のものから順にすべて渡したいときは、「&amp;lt;strong&amp;gt;先に一番下にあるファイルをクリックしてから、一番上にあるファイルをShift+ダブルクリック（あるいはShift+クリックしたあとEnter）する&amp;lt;/strong&amp;gt;」というのが有効である。&lt;br /&gt;
&lt;br /&gt;
一方で、設定のしくみはやや煩雑である。具体的には、拡張子.xxxに対して&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xxx\UserChoice&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
というキーがあって、ここの&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;の値を&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;としたときの&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value\shell\open\command&amp;lt;/code&amp;gt;の内容に従ってアプリケーションが起動される。&lt;br /&gt;
&lt;br /&gt;
Windows10以降では&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するためには普通の管理者権限やSYSTEMよりもさらに上位のTrustedInstaller権限が必要である。AdvancedRunなどを使ってTrustedInstaller権限で変更することは一応できたが、ハッシュ値の生成までちゃんとやっていないので自動で修正されてしまった（ここが解決できるかどうかは未調査）。従って、任意のコマンドを設定したい際は、まず&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するところだけエクスプローラーのダイアログを使い、その後で&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value&amp;lt;/code&amp;gt;の中身を好きに変えるほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
例えば新たなメニューを追加したい場合なら、以下のようにするとよい。&lt;br /&gt;
&lt;br /&gt;
* 今まで使われていない（乱数値など）名前をもつダミーのexeファイル（実行ファイルとして正しく機能する必要はなく、空のファイルでもいいし、拡張子がexeでなくてもよい）を用意する（ここでは&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;とする）&lt;br /&gt;
* 関連付けたい拡張子のファイルの右クリックメニューから「プログラムを開く」を選択し、&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;を選んで関連づける&lt;br /&gt;
** これによりレジストリキー&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe&amp;lt;/code&amp;gt;が作られた上で&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;Applications\dummy.exe&amp;lt;/code&amp;gt;が書き込まれる&lt;br /&gt;
* &amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe\shell\open&amp;lt;/code&amp;gt;の中身を自由に変更する。&lt;br /&gt;
&lt;br /&gt;
=== 完全に独自のメニューを実装する ===&lt;br /&gt;
&lt;br /&gt;
これは、「PowerShellをここで開く」「VS Codeで開く」のように完全に独自の右クリックメニューを追加するものである。設定は意外と簡単である。また、フォルダに対する右クリックメニューや全ファイルに共通の右クリックメニューを追加するにはこの方法しかない。ただし、Windows10以前のメニューに戻さないと「その他のオプション」を押す手間がかかるので注意。&lt;br /&gt;
&lt;br /&gt;
拡張子ごとの設定は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations&amp;lt;/code&amp;gt;にある（編集時は&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;を使うのがいいだろう）（比較的新しいWindowsだと&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;キー自体が存在しないことがあるが、自分で作ればちゃんと動作する）。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーは&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations\.xxx\shell\yourcommandname\command&amp;lt;/code&amp;gt;のような場所に作られることになる。&lt;br /&gt;
&lt;br /&gt;
また、全てのファイルを対象にするメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\&amp;amp;#42;&amp;lt;/code&amp;gt;、フォルダを右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory&amp;lt;/code&amp;gt;、ドライブ（C&amp;amp;#58;\など）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Drive&amp;lt;/code&amp;gt;、フォルダ（・ドライブ）の背景（何もないところ）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory\Background&amp;lt;/code&amp;gt;以下でそれぞれ管理されている。また、&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\AllFilesystemObjects&amp;lt;/code&amp;gt;というのもあり、これはディレクトリとファイルの両方に適用される（ドライブやフォルダ背景には影響なし）。&lt;br /&gt;
&lt;br /&gt;
* 一覧は[https://learn.microsoft.com/ja-jp/windows/win32/shell/reg-shell-exts ここ]かな？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;複数種類に一括で追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 複数種類に一括で追加？ ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;という値があり、これに&amp;lt;code&amp;gt;video&amp;lt;/code&amp;gt;などと指定されている場合は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\video&amp;lt;/code&amp;gt;にある設定が反映される（これによって複数種類のファイルに共通するメニューが作れる）…というような情報もあったのだが、手元のWindows 11では全く反映されなかった。（追記&amp;amp;#58; [https://www.pg-fl.jp/program/winreg/classes.htm#reg_hkcr_systemfileassociations Windows レジストリ 解剖記&amp;amp;#58; HKEY_CLASSES_ROOT &amp;amp;#45; Programming Field]に、&amp;lt;code&amp;gt;image&amp;lt;/code&amp;gt;のような定義済みの名前以外には無効と記載あり）&lt;br /&gt;
&lt;br /&gt;
そもそも&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;に複数種類が指定できるか不明だったりと色々と意義が怪しいので諦めて各拡張子ごとに追加するのがよいのではないかと思う。CLSIDの部分は共通化されているわけなのでそれほど非効率な二重管理ということにもならないだろう。（そもそもこの辺のWindowsの仕様はころころ変わるっぽいのであまり頑張ってもしょうがないかも？）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;directorybackgroundの表示&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Directory\Backgroundの表示 ===&lt;br /&gt;
&lt;br /&gt;
エクスプローラーの左側のエリアにあるフォルダやドライブを右クリックしたときのメニューには、なぜかDirectory\Backgroundの内容も表示されてしまう。そのうえ、これらには正しくパラメータが渡されない（commandに直接書くときは&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;などが入っていると起動せず、COM使用（少なくともDelegateExecute）で受け取る方法も不明）。&lt;br /&gt;
&lt;br /&gt;
ただ、DirectoryやDriveに同名のメニューが登録されている場合はそちらが優先される。しかし、これを利用してメニューを非表示にすることはできない。（DirectoryやDriveのほうにLegacyDisableを書いたら、そもそもそちらが無かったのと同じになるっぽい）&lt;br /&gt;
&lt;br /&gt;
実際には、Directory\Backgroundに設定するメニューはDirectoryにもDriveにも等しくあったほうがいい場合が多いと思うので、そのように設定するとよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== その他設定項目 ===&lt;br /&gt;
&lt;br /&gt;
本筋とは関係ないので詳細は省くが、その他にもこれらのキーでは様々な設定ができる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;によるアイコンの設定&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;によるキーの設定（「&amp;amp;quot;編集(&amp;lt;u&amp;gt;E&amp;lt;/u&amp;gt;)&amp;amp;quot;のEみたいなやつ」）&lt;br /&gt;
* &amp;lt;code&amp;gt;MUIVerb&amp;lt;/code&amp;gt;（多分、言語設定ごとの表示文字列の切り替えとかができるようになるやつ）&lt;br /&gt;
* &amp;lt;code&amp;gt;AppliesTo&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DefaultAppliesTo&amp;lt;/code&amp;gt;による表示条件の設定&lt;br /&gt;
** AQS書式というのが使用可能で、かなり柔軟な指定ができる（特定フォルダ内のみに表示するなど）。ただしあまり情報がなく、[https://www.pg-fl.jp/program/winreg/classes.htm Windows レジストリ 解剖記]でもそこまで詳細な解説はない。そこからもリンクされている[https://learn.microsoft.com/ja-jp/windows/win32/search/-search-3x-advancedquerysyntax?redirectedfrom=MSDN MSの公式ドキュメント]を読むのが早そう。あと、Backgroundメニューではそもそも背景フォルダに関する情報が全く渡されてこないようで（ただしどこかに書いてあったのではなく実験の結果）、使い物にならない。&lt;br /&gt;
*** Backgroundでは使えなかったという投稿の例&lt;br /&gt;
**** [https://superuser.com/questions/1020415/windows-explorer-context-menu-to-a-especific-folder-background Windows Explorer&amp;amp;#58; Context menu to a especific folder (background) &amp;amp;#45; Super User]&lt;br /&gt;
**** [https://stackoverflow.com/questions/47325736/windows-context-menu-directory-background-appliesto shell &amp;amp;#45; Windows context menu directory\background AppliesTo &amp;amp;#45; Stack Overflow]&lt;br /&gt;
* &amp;lt;code&amp;gt;HasLUAShield&amp;lt;/code&amp;gt;による「管理者アイコン」の表示（&amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;との併用可）&lt;br /&gt;
** これも実は上と同様にAQS書式で管理者アイコンの表示条件を設定できる&lt;br /&gt;
** このアイコン自体はSystem32のimageres.dllとかUserAccountControlSettings.exeとかに入っている&lt;br /&gt;
* &amp;lt;code&amp;gt;SubCommands&amp;lt;/code&amp;gt;によるサブメニューの登録&lt;br /&gt;
** 手元のWindows11で試した限り、&amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Drive&amp;lt;/code&amp;gt;ではうまくいくが&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;だとサブメニューが出ない？&lt;br /&gt;
* &amp;lt;code&amp;gt;ExtendedSubCommandsKey&amp;lt;/code&amp;gt;値による他の&amp;lt;code&amp;gt;shell&amp;lt;/code&amp;gt;キーへの参照によるサブメニューの登録&lt;br /&gt;
** かなり強力で、循環参照も作れる。&lt;br /&gt;
** 例&amp;amp;#58; [http://nonsubject.arinco.org/2011/08/ Nonsubject&amp;amp;#58; 8月 2011]&lt;br /&gt;
** 一つのルートメニューが持てるサブメニュー上限は16個までという制限がある。[https://stackoverflow.com/questions/48625223/is-there-a-maximum-right-click-context-menu-items-limit https&amp;amp;#58;//stackoverflow.com/questions/48625223/is&amp;amp;#45;there&amp;amp;#45;a&amp;amp;#45;maximum&amp;amp;#45;right&amp;amp;#45;click&amp;amp;#45;context&amp;amp;#45;menu&amp;amp;#45;items&amp;amp;#45;limit]&lt;br /&gt;
** これは&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;でも有効。&lt;br /&gt;
* &amp;lt;code&amp;gt;Extended&amp;lt;/code&amp;gt;によってShift+右クリックしたときのみ表示させる&lt;br /&gt;
* 設定例&amp;amp;#58; [https://www.tenforums.com/tutorials/178668-add-remove-open-windows-terminal-administrator-context-menu.html Add or Remove &amp;amp;#39;Open in Windows Terminal as administrator&amp;amp;#39; context menu | Tutorials]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;contextmenuhandlersicontextmenuを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ContextMenuHandlers（IContextMenu）を用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
先ほどのClipchampのメニュー項目などはここまで述べたようにレジストリ内に静的に設定されているものではなくCOM(Component Object Model)を用いて外部のDLLの関数から動的に追加されているものである（ただDLLの指定自体はレジストリ内のInProcServer32のようなキーにあるはず）。Clipchamp以外だと7&amp;amp;#45;ZipやPDF XChange Editorなどのメニューはこれを用いて実装されている。レジストリの&amp;lt;code&amp;gt;XXX\shellex\ContextMenuHandlers&amp;lt;/code&amp;gt;といったキー以下に設定されているものはこれに分類される。&lt;br /&gt;
&lt;br /&gt;
詳しくはIContextMenuなどのキーワードで検索すると出てくる[https://learn.microsoft.com/en-us/windows/win32/shell/shortcut-menu-using-dynamic-verbs Customizing a Shortcut Menu Using Dynamic Verbs &amp;amp;#45; Win32 apps | Microsoft Learn]などを読むとよさそうだが、実装はかなり難解である。Clipchampもこの部分で不適切な実装をしたために順番がおかしくなったのではないかと思われる。&lt;br /&gt;
&lt;br /&gt;
動作確認できたサンプルとしては、[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb]はIContextMenuを使って実装されており、dllをビルドしてCLSIDのInProcServer32でそれを指定するとちゃんと右クリックメニューが追加される。&lt;br /&gt;
&lt;br /&gt;
また、メニューを追加する関数であるQueryContextMenuが呼ばれる時点で、引数となっているファイルの情報がわかる（Initialize関数においてIDataObjectが渡されているのでそれをクラスのフィールドなどとして持っておけばよい）ので、特定の拡張子のファイルのみに対してメニューを表示することもできる。もちろんファイルの内容まで読み取ってからメニューを表示するといったこともできるが、そこまですると右クリックするだけで動作が重くなるといった副作用が大きくなるのでやめた方が無難だろう。ただ、スタートメニューへのピン留め&amp;lt;code&amp;gt;&amp;amp;#123;a2a9545d&amp;amp;#45;a0c2&amp;amp;#45;42b4&amp;amp;#45;9708&amp;amp;#45;a0b2badd77c8&amp;amp;#125;&amp;lt;/code&amp;gt;やPDF XChange Editor(9.3や10.2.1で確認)のメニューは実際にそのような挙動をする（余談だが、InfoTipの表示もexplorerが操作しづらくなる原因なので&amp;lt;code&amp;gt;HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;ShowInfoTip&amp;lt;/code&amp;gt;を0にしたほうがいい）（サムネイルなどはバックグラウンドで並列に走るので操作にはあまり影響がない）。またエラーが発生した場合はexplorer自体が強制終了することもあり、全体的に実装は慎重に行ったほうがよい。&lt;br /&gt;
&lt;br /&gt;
==== コード例 ====&lt;br /&gt;
&lt;br /&gt;
拡張子が.tで始まるファイル（&amp;amp;#42;.txt, &amp;amp;#42;.ttfなど）のみにメニューを追加するサンプル（から抜粋）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;IFACEMETHODIMP CNonDefaultDropMenuVerb::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT /*idCmdLast*/, UINT /*uFlags*/)&lt;br /&gt;
{&lt;br /&gt;
    FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };&lt;br /&gt;
    STGMEDIUM medium;&lt;br /&gt;
    HRESULT hr = _pdtobj-&amp;gt;GetData(&amp;amp;fmte, &amp;amp;medium);&lt;br /&gt;
    if (SUCCEEDED(hr))&lt;br /&gt;
    {&lt;br /&gt;
        HDROP hdrop = (HDROP)medium.hGlobal;&lt;br /&gt;
        WCHAR szFile[MAX_PATH];&lt;br /&gt;
        DragQueryFile(hdrop, 0, szFile, ARRAYSIZE(szFile));&lt;br /&gt;
        const WCHAR* ext = wcsrchr(szFile, L&#039;.&#039;);&lt;br /&gt;
        ReleaseStgMedium(&amp;amp;medium);&lt;br /&gt;
        if (ext &amp;amp;&amp;amp; *(ext+1) != L&#039;t&#039;) {&lt;br /&gt;
            return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    WCHAR szMenuItem[80];&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKDROP, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKDROP, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKNETRESOURCES, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKNETRESOURCES, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(2));  // indicate that we added 2 verbs.&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 特定の拡張子に対して追加できるのは以下で知った&lt;br /&gt;
** できるという情報&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://stackoverflow.com/questions/43769772/how-to-add-context-menu-to-one-specific-file registry &amp;amp;#45; How to add context menu to one specific File &amp;amp;#45; Stack Overflow]&lt;br /&gt;
** 実際のコード&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/nyfair/freeimagerip/blob/master/plugin/FIShellExt/Thumb.cc freeimagerip/Thumb.cc at master · nyfair/freeimagerip]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icontextmenuの今後について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== IContextMenuの今後について ====&lt;br /&gt;
&lt;br /&gt;
Windowsの右クリックメニューが重いと良く言われるのはこのような高い自由度をもつIContextMenuに起因するものであると思われる。Windows11ではIContextMenuよりIExplorerCommandがよいというのを見かけた（[https://twitter.com/kenichiuda/status/1417266893581295651 https&amp;amp;#58;//twitter.com/kenichiuda/status/1417266893581295651]や、そこで引用されている[https://twitter.com/madonomori/status/1417265763363168263 https&amp;amp;#58;//twitter.com/madonomori/status/1417265763363168263]）。[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb]も見てみる必要があるかも。&lt;br /&gt;
&lt;br /&gt;
ただまあMicrosoftのことなのでIContextMenuもあと10年くらいは使えるだろう。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/apps/get-started/make-apps-great-for-windows#8-optimize-your-apps-context-menu-extensions-and-share-targets Windows 11 でアプリをすぐれたものにするためにできることトップ 11 &amp;amp;#45; Windows apps | Microsoft Learn] を読んだら、Windows 11の（新しい）右クリックメニューに表示するためにはIExplorerCommandを使わなければならない（IContextMenuは不可）と明確に書いてあった。また、IExplorerCommandのサンプル（[https://learn.microsoft.com/ja-jp/windows/win32/shell/samples-explorercommandverb エクスプローラー コマンド動詞のサンプル &amp;amp;#45; Win32 apps | Microsoft Learn]）を使ってみたが、IExplorerCommandState（CommandStateHandler）のほうは動作しているように見えるものの肝心のIExplorerCommand（ExplorerCommandHandler）は全く反応しなかった（右クリックを一度でも行うとdllへの上書きアクセスが禁止されるので読み込まれてはいるようだが、コンストラクタや&amp;lt;code&amp;gt;QueryInterface&amp;lt;/code&amp;gt;にデバッグ用のメッセージボックスを入れても表示されない）。&lt;br /&gt;
&lt;br /&gt;
==== サブメニュー ====&lt;br /&gt;
&lt;br /&gt;
IContextMenuは自由度が高いのでサブメニューなども実装できるはず（7&amp;amp;#45;Zipなどもそうしていると思われる）。またこのような記事もあった&amp;amp;#58; [http://nonsubject.arinco.org/2014/06/cascading-desktopbackground-menus.html デスクトップのシェルメニューをサブメニューにする | Nonsubject]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows11の右クリックメニューへの追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows11の右クリックメニューへの追加 ===&lt;br /&gt;
&lt;br /&gt;
これはどうやらますます面倒になりそうで、リリース済のWindowsストアアプリをインストールするか開発者モードを有効にしないと自分の好きなメニューを追加できない（多分）上、アプリ1つにつき1メニューしか追加できないらしい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windows 11の右クリックメニューに追加してくれるソフト&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/ikas-mc/ContextMenuForWindows11 https://github.com/ikas-mc/ContextMenuForWindows11]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;フォルダ背景を右クリックしたメニューに追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/44 https://github.com/ikas-mc/ContextMenuForWindows11/issues/44]）（いや、使ってみたら普通にできてるっぽい？）、アプリ1つにつき1メニューしか追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/45 https://github.com/ikas-mc/ContextMenuForWindows11/issues/45]）（これはWindows側がそういう仕様っぽいので厳しそう）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Microsoftの関連するサンプル&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/microsoft/AppModelSamples/tree/master/Samples/SparsePackages AppModelSamples/Samples/SparsePackages at master · microsoft/AppModelSamples]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Meryへの追加要望&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.haijin-boys.com/discussions/6746 Windows 11の新コンテキストメニューにMeryのコマンドを追加したい]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策①comを利用する&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策①COMを利用する ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
まずは、COMを用いて実装するという方法がある。基本的にはこちらが綺麗な解決策である。&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandというインターフェースを具体的に実装している[https://learn.microsoft.com/en-us/windows/win32/shell/samples-executecommandverb Microsoftのサンプル]があったので、それを参考に、「取得したファイル・フォルダの情報を引数または標準入力として渡しつつ指定されたコマンドを起動する」というプログラムを作成した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]&lt;br /&gt;
&lt;br /&gt;
COMを使っていることからわかるように、コマンドラインを介さず直接Explorerからデータが送られてくるので、他の方法に共通してみられるパス長さやファイル個数の制限が（事実上）皆無であり、非常に強力である。&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
=== 使い方 ===&lt;br /&gt;
&lt;br /&gt;
詳しい使い方は上記レポジトリのREADMEも参照。&lt;br /&gt;
&lt;br /&gt;
==== 基本 ====&lt;br /&gt;
&lt;br /&gt;
引数となる（実際に起動したい）コマンドはレジストリキー&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\CLSID\&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;\LocalServer32&amp;lt;/code&amp;gt;の既定の値で設定する。&lt;br /&gt;
&lt;br /&gt;
その上で該当メニューに対応する&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キー（レジストリの各所にある）に&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;という値を作成して&amp;lt;code&amp;gt;&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;&amp;lt;/code&amp;gt;を書き込むことで起動できる（&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の既定値よりも&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;が優先される）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;idroptargetを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== IDropTargetを用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandではなくIDropTargetというインターフェースを用いてもほぼ同じことができそうであった。対応するサンプルは[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb]である。IExecuteCommandとの機能的な違いはあまりよくわからないが、[https://learn.microsoft.com/en-us/windows/win32/shell/samples-droptargetverb https&amp;amp;#58;//learn.microsoft.com/en&amp;amp;#45;us/windows/win32/shell/samples&amp;amp;#45;droptargetverb]を読む限り、DropTargetのほうが古くからあるようである。CLSIDの登録までは同じだが、&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;のかわりに&amp;lt;code&amp;gt;DropTarget&amp;lt;/code&amp;gt;キーを使用し、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値のかわりに&amp;lt;code&amp;gt;CLSID&amp;lt;/code&amp;gt;値を使う（ソースを読めばわかる）。&lt;br /&gt;
&lt;br /&gt;
== 解決策②プロセス間通信で頑張る ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
「プロセス間通信を使って頑張る」という方法もある。要するに、コマンドとしては別々に渡されたとしても、既に立ち上がっているプロセスがあるときはそちらに投げて終了するようにすれば、一つのプロセスでまとめて開けるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分を代わりにやってくれるものとしては[https://github.com/zenden2k/context-menu-launcher https://github.com/zenden2k/context-menu-launcher]がある。これを少し改善したフォークとして[https://github.com/KnIfER/SingleInstance-Launcher https://github.com/KnIfER/SingleInstance-Launcher]があり、さらに自分が64bit版のビルドを加えたものが[https://github.com/ge9/SingleInstance-Launcher https://github.com/ge9/SingleInstance-Launcher]にある。&lt;br /&gt;
&lt;br /&gt;
ただ、これはCOMを使う方法とは違っていくつかの欠点がある。&lt;br /&gt;
&lt;br /&gt;
* ファイル個数の上限&lt;br /&gt;
** ProgIDを使って開く場合には、選択個数がデフォルトで15個までに設定されており、これはMultipleInvokePromptMinimum値（詳しくは他サイト）の変更により増やせるが確実ではない（上限に諸説あり）。&lt;br /&gt;
** 独自メニューの場合は、&amp;amp;quot;MultiSelectModel&amp;amp;quot;を&amp;amp;quot;Player&amp;amp;quot;にすることでファイル数上限が100個になるが、それより大きくはできない。&lt;br /&gt;
* 長さ制限（260文字）を超えるパスをもつフォルダでは失敗する（詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] を参照）。&lt;br /&gt;
* プロセス間通信を使っているため、起動時にラグがあったりすると、ごく稀に渡されたファイルの順番が乱れることがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;singleinstance&amp;amp;#45;launcher-&amp;amp;#45;-基本的な使い方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== SingleInstance&amp;amp;#45;Launcher &amp;amp;#45; 基本的な使い方 ===&lt;br /&gt;
&lt;br /&gt;
上記GitHubリポジトリから実行ファイルをダウンロードしてどこか分かりやすい場所に置く。インストールなどは不要である。筆者がリリースした実行ファイルを信用できない・改変したいなどの場合はソースコードをどうぞ。言語はC++。ファイルの順番が乱れにくくなる改善など大歓迎。&lt;br /&gt;
&lt;br /&gt;
README.mdにもあるが起動に用いる基本的な構文（レジストリに登録する値）は以下のようである（※ここでは64bit版を使うものとして説明しているが、32bit版でも全く同様）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&amp;quot;C:\path\to\singleinstance_x64.exe&amp;quot; &amp;quot;%1&amp;quot; &amp;quot;C:\Program Files\path\to\app.exe&amp;quot; &amp;quot;$files&amp;quot; --si-timeout 1000 --option-to-app-1 --option-to-app-2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;amp;quot;C&amp;amp;#58;\path\to\singleinstance_x64.exe&amp;amp;quot;、&amp;amp;quot;%1&amp;amp;quot;、&amp;amp;quot;C&amp;amp;#58;\Program Files\path\to\app.exe&amp;amp;quot;、&amp;amp;quot;$files&amp;amp;quot;の順番はおそらくこの通りである必要がある。その後にあるものはapp.exeにオプションとしてそのまま渡されるが、&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;si&amp;amp;#45;timeout n&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に限り&amp;lt;/strong&amp;gt;、singleinstance_x64.exeが解釈し、app.exeに渡されない。このオプションはSingleInstance&amp;amp;#45;Launcherに対して次のファイルが渡されてくるのを待つタイムアウト期間をミリ秒で指定するものである。短すぎると、右クリックメニューの処理が遅い場合に途中で打ち切られてしまう可能性がある。長すぎると、その期間待つまでapp.exeは呼ばれないため、タイムラグが長く不便に感じる可能性がある。特に動作が重いPCでなければ1000（1秒）くらいにしておけば十分だろう。もう少し短くてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
%1や$filesの両側にダブルクォーテーションがないと、空白を含むファイル名を正しく扱えない。GitHubのサンプルでは付いていないものもあるので注意。&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=355</id>
		<title>デュアルブート</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=355"/>
		<updated>2025-09-01T01:32:05Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
WindowsとLinuxのデュアルブートにおいて役に立つ情報を記述する。古いメモを多く含む。[[Linuxのインストール|Linuxのインストール]]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsのプロダクトキー関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsのプロダクトキー関連 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|デュアルブート}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bitlocker ==&lt;br /&gt;
&lt;br /&gt;
とにかく前もって&amp;lt;strong&amp;gt;回復キーを保存しておくこと！！&amp;lt;/strong&amp;gt;逆に回復キーさえあればBitlockerで大きなトラブルになることは多くない。&lt;br /&gt;
&lt;br /&gt;
* [https://www.pcdock24.com/blog/?p=53931 BitLockerとは【BitLockerの要件と自動有効化の問題点】｜パソコン修理パソコンドック24] によるとローカルアカウントでBitlockerの有効/無効を確認するときはdiskmgmtから行かなきゃいけないらしい。&lt;br /&gt;
* Bitlockerを有効にしたあとにwinを起動すると再起動ループにハマることがある。解決法(Manage&amp;amp;#45;bdeを使う)→[https://community.spiceworks.com/how_to/124388-stop-a-bitlocker-boot-loop Stop a BitLocker boot loop &amp;amp;#45; Windows Forum &amp;amp;#45; Spiceworks]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsパーティションntfsのマウント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsパーティション（NTFS）のマウント ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
==== remove_hiberfileについて ====&lt;br /&gt;
&lt;br /&gt;
マウントが成功するにはWindowsが完全シャットダウンされている必要がある（またはそれが望ましい）。ただ、[https://unix.stackexchange.com/questions/107978/cant-access-windows-drive-windows-is-hibernated-refused-to-mount https&amp;amp;#58;//unix.stackexchange.com/questions/107978/cant&amp;amp;#45;access&amp;amp;#45;windows&amp;amp;#45;drive&amp;amp;#45;windows&amp;amp;#45;is&amp;amp;#45;hibernated&amp;amp;#45;refused&amp;amp;#45;to&amp;amp;#45;mount]にある通り、windowsを正しくシャットダウンしてもなぜか「ハイバーネートされててマウントできません」的なのが出ることがあるので、マウントオプションにremove_hiberfileを追加するとよい。&lt;br /&gt;
&lt;br /&gt;
* 高速スタートアップを無効にしているにもかかわらず完全シャットダウンされていないことがある気がしたので、Windowsでシャットダウン時に実行するスクリプトとして完全シャットダウンコマンドを追加したりした&lt;br /&gt;
* デスクトップPCではだいたい不要？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker無し&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker無し ===&lt;br /&gt;
&lt;br /&gt;
普通にntfs&amp;amp;#45;3gを使う。数字など適宜読み替えること。主にWindowsのDドライブ想定。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;ntfs-3g -o remove_hiberfile /dev/nvme0n1p5 /media/win&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstabの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;/dev/sda2     /media/ddrive ntfs-3g noauto,rw,nofail 0  0&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker有り&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker有り ===&lt;br /&gt;
&lt;br /&gt;
ntfs&amp;amp;#45;3gの前にDislockerで暗号化を解除する。参考→[http://www7390uo.sakura.ne.jp/wordpress/archives/270 http&amp;amp;#58;//www7390uo.sakura.ne.jp/wordpress/archives/2]&lt;br /&gt;
&lt;br /&gt;
dislocker&amp;amp;#45;fileの方式だと一旦復号したのをファイルに書き出して静的にマウントするので、（事実上）readonlyとなる。よってdislocker&amp;amp;#45;fuseを使う→[https://www.systutorials.com/docs/linux/man/1-dislocker-fuse/ https&amp;amp;#58;//www.systutorials.com/docs/linux/man/1&amp;amp;#45;dislocker&amp;amp;#45;fuse/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/dl-fuse&lt;br /&gt;
$ sudo mount -o loop,rw /media/dl-fuse/dislocker-file /media/win/&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstab例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  0 0&lt;br /&gt;
/media/bitlocker/dislocker-file   /media/win10   ntfs-3g   rw,nofail,remove_hiberfile,permissions 0  2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;と、二行に分けて記載する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;permissions については後述&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セキュリティ問題 ====&lt;br /&gt;
&lt;br /&gt;
recovery&amp;amp;#45;passwordを暗号化されていないパーティションに書いてしまうと結局Bitlockerの意味が全くなくなってしまうので、Linux側でもBitlockerのような暗号化パーティション（LUKSとか？）やユーザーログイン時に復号される暗号化フォルダ（ecryptfsとか）といったディスク上で暗号化される領域に書いておく必要がある（もちろん毎回パスワードの類を打ち込むのでよければそれでもいい）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;permissions-inheritについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== permissions, inheritについて ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tuxera/ntfs-3g/wiki/File-Ownership-and-Permissions https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/wiki/File&amp;amp;#45;Ownership&amp;amp;#45;and&amp;amp;#45;Permissions] 詳しくはこちらも参照。&lt;br /&gt;
&lt;br /&gt;
まず、マウントオプションとして&amp;lt;strong&amp;gt;permissions&amp;lt;/strong&amp;gt;を指定しない限り、ntfs&amp;amp;#45;3gでマウントしたファイルは全てパーミッション・所有者が固定（uid, gid, umaskなどで指定）となり、個別のファイルについて変更することはできない。&lt;br /&gt;
&lt;br /&gt;
そして、この場合、ntfs&amp;amp;#45;3g経由で作成したファイルはWindows側で見るとすべてAdministratorの所有となり、さらにEveryoneにフルコントロール権限が付与される（この動作を変更するのは筆者の知る限り不可能）。&lt;br /&gt;
&lt;br /&gt;
Linuxではフォルダの実行権限（x）が無ければその中に含まれたファイルにはアクセスが通らず、パスを推測することも不可能だが、Windowsではたとえ一切権限のないフォルダであっても中にあるファイル・フォルダのパスがわかれば直接パスを打つことでアクセスが通ってしまうようである（試した限り）。そのため、permissions無しでntfs&amp;amp;#45;3gで作成したファイルはパスさえわかればWindows上の全ユーザーが閲覧・編集・削除できる状態ということになる。&lt;br /&gt;
&lt;br /&gt;
従って、Gitを使用する場合や複数ユーザーで使用したい場合などパーミッション管理が必要なデータを扱う場合はもちろん、単に中にあるデータを保護したいという場合でもpermissionsオプションを指定することが必須になる。&lt;br /&gt;
&lt;br /&gt;
次に、permissionsを指定して、かつUserMappingを指定しない場合、Linux上でrootが所有するファイルをWindows側で見ると、全てAdministratorsの所有物になり（ここはpermissionsがない場合と同じ）、そのアクセス権はLinux上での見え方と概ね一致するように設定されるようである。他のユーザーが所有するファイルにはS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000というような上位桁が円周率に由来する（この部分はハードコードされている）SIDが割り当てられ、こちらもアクセス権が適切に設定される。UserMappingを指定することで、このSIDの部分の割り当てを変更することができる。&lt;br /&gt;
&lt;br /&gt;
Windowsに挙動を近づけるための他のオプションとしては&amp;lt;strong&amp;gt;inherit&amp;lt;/strong&amp;gt;というのもあり、これは新規作成時に上位フォルダの権限を継承するものである。しかし、これは&amp;lt;u&amp;gt;所有者を継承するオプションではない&amp;lt;/u&amp;gt;（そして、所有者が違えばまともに継承もされない）。&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/tuxera/ntfs-3g/issues/90 https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/issues/90] では、UserMappingがなくても所有者が継承されるようになるパッチが示されているが、これを使うとpermissionsは動かなくなる（chmodなどが使えない）。自力で変えようとしてみたが、うまくいかなかった。&lt;br /&gt;
&lt;br /&gt;
以上のことから、Windowsの一般ユーザーフォルダの内容などをLinuxから良い感じに（Windows側の権限設定を汚染せずに）使えるようにするには、明示的なUserMappingが事実上必須であることがわかる。&lt;br /&gt;
&lt;br /&gt;
一方で、Administrator所有・全ユーザー閲覧可能（あるいは不可能）、といった、Windows側の全ての一般ユーザーに対して共通のアクセス権を適用する設定であれば、UserMappingを使用しなくても簡単に設定が可能である。個人用PCかつ、画像・動画などのメディアファイルやLinuxでしか使用しない大きめのソフトウェアを入れておく用途であれば、こちらで問題ないだろう。&lt;br /&gt;
&lt;br /&gt;
Linux側で別ユーザーの所有に見せたい場合は、上記のS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000のようなSIDが見えてしまう状態でもよければ（かつ、権限設定にも問題がなければ）それでもいいし、下記のbindfsと併用する方法もある。いずれにしても、Linux側で全員が読み取り・書き込み・実行が可能なファイルは、Linux側での親フォルダの権限によらず、Windows側では（パスさえわかれば）対応する権限でアクセスができてしまうということに注意が必要である。&lt;br /&gt;
&lt;br /&gt;
また、Windowsではファイルの新規作成時には必ず実行権限が付加されるので、Linux側でそれを見た場合も実行可能になる（実行権限を外すと.exeなどが実行できなくなる）。従って、GitのレポジトリのフォルダをWindows/Linux間で共用するようなことをすると、Windows側では実行権限無しで（これがデフォルトであるため）コミットされたファイルがLinux側では実行権限有りに見えるため差分が出てしまうといったことが発生する。これはUserMappingでも解決はできないので、Gitリポジトリのあるフォルダを共用するのは不可能である。&lt;br /&gt;
&lt;br /&gt;
結局、後述のbindfsと組み合わせると、以下のようにするのが良さそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;大元のntfsパーティションは、permissionsでマウント。UserMappingを使ってもよい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Linux側でパーミッションを変更できる必要がなく、Windows側と共用したいものについては、bindfsで再マウントし、create&amp;amp;#45;with&amp;amp;#45;perms&amp;amp;#61;a+rwxによってWindows側でアクセスに制約が出ないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;より完全なオプションとしては、以下のような感じ？&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;map=root/myname:@root/@myname,perms=a+rwx,create-with-perms=a+rwx,chown-ignore,chgrp-ignore,chmod-ignore&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Gitのようにパーミッションを変更できる必要があるものは、改めてこれも別のbindfsとして再マウントする。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;あるいはbindfsを1つにまとめてcreate&amp;amp;#45;with&amp;amp;#45;perms&amp;amp;#61;+rw（xは指定しない）にするのもいけるかもしれないが、本当にうまくいくかどうか…&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== bindfs ====&lt;br /&gt;
&lt;br /&gt;
既存のディレクトリを、所有ユーザーやパーミッションを変更してマウントしてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --mirror=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
または&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --force-user=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
この2つの違いは不明&lt;br /&gt;
&lt;br /&gt;
作成した&lt;br /&gt;
&lt;br /&gt;
sudoがないと&amp;lt;code&amp;gt;fusermount&amp;amp;#58; option allow_other only allowed if &amp;amp;#39;user_allow_other&amp;amp;#39; is set in /etc/fuse.conf&amp;lt;/code&amp;gt;とか言われたりする&lt;br /&gt;
&lt;br /&gt;
fstabの例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;/media/win /home/myname/.mnt_win fuse.bindfs nofail,map=root/myname:@root/@myname,create-with-perms=g-w 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linuxだとrootのデフォルトのumaskが022で一般ユーザーが002なせいで一般ユーザーが作ったファイルが775とか664になってしまったりするがg&amp;amp;#45;wをつけることによって755とか644になる（もちろんchmodすれば変えられる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;minecraft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Minecraft ==&lt;br /&gt;
&lt;br /&gt;
.minecraftフォルダをWindowsとLinuxで共有したはいいが、（それ自体.minecraftの中にある）ゲームディレクトリの指定も共有することを考えると、両OSでパスの仕様がやや異なるのが問題になる。&lt;br /&gt;
&lt;br /&gt;
例えば以下ではWindowsのルートが/media/winにマウントされているとする。&lt;br /&gt;
&lt;br /&gt;
まずLinuxのランチャーは相対パスどころかシンボリックリンクすら変換して普通の絶対パスにしてしまう（設定を書き換えてしまう）っぽいので、linuxでは絶対パス指定で/media/win/Users/pathのようにする。で、この書き方をするとWindowsでは相対パスと解釈されるのだが、基準となるフォルダが謎で、「PLAY」を押した時のチェック時は.minecraftが基準なのだが、実際に見られるのはランチャーがあるフォルダが基準（＝こっちになかった場合ゲームディレクトリが新たに作られる）&lt;br /&gt;
&lt;br /&gt;
* ストアアプリ版の（新しい方の？）Minecraftランチャーでは、この「ランチャーがあるフォルダ」は&amp;lt;code&amp;gt;AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local&amp;lt;/code&amp;gt; あたりである。&lt;br /&gt;
&lt;br /&gt;
従って、ランチャーのフォルダと.minecraft内の両方にmediaというフォルダを作って中にwinという名前でC&amp;amp;#58;\へのジャンクション置くとうまくいく。&lt;br /&gt;
&lt;br /&gt;
.minecraftの中にはゲームディレクトリ専用のフォルダを作り、その中にmain, snapshotなど用途に応じたフォルダを作っておくとよい&lt;br /&gt;
&lt;br /&gt;
== google&amp;amp;#45;drive&amp;amp;#45;ocamlfuse ==&lt;br /&gt;
&lt;br /&gt;
labelを使うと複数アカウントをマウントできる。デフォルトのラベル名はdefault&lt;br /&gt;
&lt;br /&gt;
しばらく使っていないと起動時におそらく認証の失敗が原因でマウントポイントのあるフォルダに対するlsがしばらく一切反応しなくなる（&amp;amp;#126;/.gdfuse内の該当ラベル名のフォルダを削除して最初からやり直せば治る）。よってマウントポイントをホームディレクトリ直下に作るのは避けたほうがよい（gdfというフォルダを作っている）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mega&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MEGA ==&lt;br /&gt;
&lt;br /&gt;
Winが完全にはシャットダウンされていない状態でLinuxを起動するとCドライブ上のMEGAのフォルダが読めずに同期が無効になってしまう。MEGA自身のかわりに、Cが読める状態でのみMEGAを起動するシェルスクリプト（mega&amp;amp;#45;mounted.sh）をスタートアップに登録しておく。Cが読めなかった場合にはdialogコマンドで通知ダイアログを表示する。（このスクリプトではC自身のかわりにC&amp;amp;#58;\Windowsをみている）（gdialogは一部のディストリにしか入っていないかもしれない。実際にコマンド打ってみてどんな表示になるかも含めて確かめておいたほうがよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if [ -d /media/win-rw/Windows ]; then&lt;br /&gt;
megasync&lt;br /&gt;
else&lt;br /&gt;
gdialog --title &amp;quot;Warning&amp;quot; --infobox &amp;quot;MEGAsync is not started because Windows partition is not mounted&amp;quot; 0 0&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bluetooth機器&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bluetooth機器 ==&lt;br /&gt;
&lt;br /&gt;
同じBluetooth機器を同じPCのWindowsとLinux双方にペアリングするというもの。自分はマウスでしかやったことがない。意外と難しいが何とかなる。&lt;br /&gt;
&lt;br /&gt;
==== 参考 ====&lt;br /&gt;
&lt;br /&gt;
* [https://orumin.blogspot.com/2019/02/bluetooth.html https&amp;amp;#58;//orumin.blogspot.com/2019/02/bluetooth.html]&lt;br /&gt;
* [https://qiita.com/yoko-yan/items/9b0235678fd804b4fe0d https&amp;amp;#58;//qiita.com/yoko&amp;amp;#45;yan/items/9b0235678fd804b4fe0d]&lt;br /&gt;
* Bluetooth Low Energyという仕様もあるらしく、自分のマウスはこっちだった。これに関しては[http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html http&amp;amp;#58;//aimingoff.way&amp;amp;#45;nifty.com/blog/2018/09/windows&amp;amp;#45;linux&amp;amp;#45;b.html]を参照。割と情報が少ないので感謝。&lt;br /&gt;
** &amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx&amp;lt;/code&amp;gt;を見るためにpstoolsをダウンロードして&amp;lt;code&amp;gt;PsExec64 &amp;amp;#45;s &amp;amp;#45;i regedit&amp;lt;/code&amp;gt;とする必要があることに注意。なお、セキュリティソフトによってPsexecが脅威と見なされ強制削除されてしまうときは代わりにフリーソフトのAdvancedRunを使うとよい。&lt;br /&gt;
** まとめ&lt;br /&gt;
*** CSRKをLocalSignatureKey&lt;br /&gt;
*** LTKをLongTermKey&lt;br /&gt;
*** EDIVをEdiv（16進→10進に変換）&lt;br /&gt;
*** ERandをRandに（&amp;lt;strong&amp;gt;バイト&amp;lt;/strong&amp;gt;(2文字のかたまり)&amp;lt;strong&amp;gt;をすべて逆順にしてから&amp;lt;/strong&amp;gt;10進変換）。ちなみにこれを間違えた結果、マウスを動かすたびにbluetoothアイコンが白↔黒と高速で切り替わる謎のバグっぽい現象が起こったことがあった。&lt;br /&gt;
*** 小文字を大文字に変える必要はない。また、IRKをIdentityResolvingKeyに書くのも不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;マルチデバイス対応マウスlogicool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== マルチデバイス対応マウス（Logicool） ====&lt;br /&gt;
&lt;br /&gt;
マルチデバイス対応（切り替えボタンがあるやつ）のマウス（LogicoolのM595）を使ったら、&amp;lt;strong&amp;gt;登録情報を一旦削除して再接続するごとにMacアドレスがひとつインクリメント&amp;lt;/strong&amp;gt;されて困った。Linuxで接続→Winで接続→Linuxで上記の書き換え、とやったあと、フォルダ名を変更（1を足せばよいはずだが正確にはWinの情報を見るのがよい）するとうまくいった。[https://twitter.com/e9g/status/1381111849664409600 自分のツイート]にも記録あり&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=354</id>
		<title>Windowsにおける仮想的ディスプレイ</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=354"/>
		<updated>2025-09-01T01:31:55Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;例えばZoomでプレゼンテーションをするときに、PowerPointの「発表者ツール」を使いたければ、普通は2つのディスプレイが必要である。しかしディスプレイが常に2つあるとは限らないので、画面共有に使用するだけの「仮想的なサブディスプレイ」があればいいのではないか、という発想がうまれる。他には、リモートのみで使用するPCや、ゲーム画面の配信などにおいても需要があるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策1-&amp;amp;#45;-ダミープラグ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策1 &amp;amp;#45; ダミープラグ ==&lt;br /&gt;
&lt;br /&gt;
そこそこ普及している、ハードウェア的な解決策である。端子に差し込むとディスプレイが接続しているものと誤認させることができる。EDIDエミュレータとも呼ぶ？価格は500&amp;amp;#45;1000円程度。4K対応かどうかなどスペックにより値段に多少の差はあるだろう。近年はHDMIが主流と思われるが、VGAのものもある（こちらは自作が可能との情報も）。&lt;br /&gt;
&lt;br /&gt;
金はかかるが、後者の解決策にないメリットとして、一気に複数のOSに対応できる（製品による？）というのがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策2-&amp;amp;#45;-ソフトウェア的に&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策2 &amp;amp;#45; ソフトウェア的に ==&lt;br /&gt;
&lt;br /&gt;
しかしPCを騙すためだけの虚構的な存在に金を払うのも考えれば面白くない話である。ソフトウェア的に解決できないだろうか。ということでこの記事ではWindowsに対するソフトウェア的解決策を紹介する。なおLinuxについてはxvfb?だとか、そういうのを使えばできそうな気がしたが今のところ手元ではできていない。できたら記事を書くかも。Macは持っていないので試せないが、[https://github.com/tSoniq/displayx https&amp;amp;#58;//github.com/tSoniq/displayx]とか、betterdisplayとかがあるらしい。PowerPointやゲーム実況という用途を考えるとWindowsが一番需要が大きそうではある。&lt;br /&gt;
&lt;br /&gt;
ソフトウェア的解決策が欲しいといってすぐソフトが出てくればいいが、調べてもあまり出てこない。比較的それっぽくて怪しくなさそうだったのが&lt;br /&gt;
&lt;br /&gt;
[https://www.amyuni.com/forum/viewtopic.php?t=3030 https&amp;amp;#58;//www.amyuni.com/forum/viewtopic.php?t&amp;amp;#61;3030]&lt;br /&gt;
&lt;br /&gt;
だが、それでもやはりちょっと素性が知れない。もう少し調べていくと、Indirect Display Driver (IDD)という技術を使うとそういうソフトウェアが書けるというMicrosoftのドキュメントが出てきた。そこからさらに調べてみるとこんなものがあった。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/roshkins/IddSampleDriver https://github.com/roshkins/IddSampleDriver]&lt;br /&gt;
&lt;br /&gt;
これを試したら無事動いたので、ついでに解像度を変えてみたら、普通に8Kくらいまで動いた（ただしその分重くなる）。↑のレポジトリでも解像度増やしてというissueがあったので、forkして公開した。さらにver0.0.1.2では&amp;amp;quot;C&amp;amp;#58;\IddSampleDriver\option.txt”というファイルを設定することで解像度オプションやディスプレイの個数をユーザーが設定できるように変更した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/IddSampleDriver https://github.com/ge9/IddSampleDriver]&lt;br /&gt;
&lt;br /&gt;
本家のreadmeで紹介された結果、どうやらゲーム配信関係のRedditとかに載ったみたいで、実質的にはほぼ何もしていないのに800以上のstarを獲得している。&lt;br /&gt;
&lt;br /&gt;
また、さらにこれをforkしたものとして[https://github.com/VirtualDrivers/Virtual-Display-Driver https://github.com/VirtualDrivers/Virtual-Display-Driver]が作られ、これはすでに5000starを超える大きなプロジェクトになっている。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strong&amp;gt;こちらはHDRにも対応していて積極的に開発されているので、今は基本的にはこちらを使ったほうがいいだろう。&amp;lt;/strong&amp;gt;（以下の情報はIddSampleDriverなので古いかもしれない）&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
以下、このソフトの話を主にしていく。&lt;br /&gt;
&lt;br /&gt;
== インストール手順 ==&lt;br /&gt;
&lt;br /&gt;
Scoopを使う方法と使わない方法の2種類がある。いずれもリポジトリのREADME.mdに書いてある通りで、それほど難しくはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scoopを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scoopを使う ====&lt;br /&gt;
&lt;br /&gt;
筆者がかかわったものではないが、Scoopを用いてインストールができるようにしてくれた方がいるようである。インストールを行うスクリプトのソースコードは[https://github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver-ge9-np.json https&amp;amp;#58;//github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver&amp;amp;#45;ge9&amp;amp;#45;np.json]にある。&lt;br /&gt;
&lt;br /&gt;
==== 通常のインストール ====&lt;br /&gt;
&lt;br /&gt;
途中で、バッチファイルを用いて証明書（.cerという拡張子のファイル）を&amp;lt;em&amp;gt;ローカルコンピューター&amp;lt;/em&amp;gt;の「&amp;lt;em&amp;gt;信頼されたルート証明機関」に&amp;lt;/em&amp;gt;登録する必要がある。そのバッチファイルではcertutilが使用されている（ちなみに以前のリリースではcertmgrが使用されていた）が、証明書を開いて表示される画面からの操作などによっても可能である。&lt;br /&gt;
&lt;br /&gt;
登録を行わないと、デバイスマネージャで「このドライバーはデジタル署名されていません。」と警告が出て、最終的に「デバイスをインストール中にエラーが発生しました。」「ストアへドライバーを追加する際に問題が発生しました。」と言われて失敗する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/installing-test-certificates https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/install/installing&amp;amp;#45;test&amp;amp;#45;certificates]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://garafu.blogspot.com/2014/04/blog-post.html https&amp;amp;#58;//garafu.blogspot.com/2014/04/blog&amp;amp;#45;post.html]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発者向け情報 ==&lt;br /&gt;
&lt;br /&gt;
Indirect Display DriverについてはMicrosoft公式のドキュメントや公式サンプル[https://github.com/microsoft/windows-driver-samples/tree/master/video/IndirectDisplay https&amp;amp;#58;//github.com/microsoft/windows&amp;amp;#45;driver&amp;amp;#45;samples/tree/master/video/IndirectDisplay] を参照（IddSampleDriverはこれを編集してできたようである）。前述の通り自分は解像度を増やしただけなので技術的なことについては何もわかっていない。&lt;br /&gt;
&lt;br /&gt;
公式サンプルはなんといっても公式のものであるから、まずはこれをビルドできる状態にするのが確実だろう。以下の説明は2021年8月頃にWindows10で試したときのものである。ビルドしようとするとWindowsUserModeDriver10.0がないと言われるので、[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/download&amp;amp;#45;the&amp;amp;#45;wdk] を入れる。&lt;br /&gt;
&lt;br /&gt;
すると次は「Spectre軽減策」（セキュリティ関係？）に関するエラーが出た。そこでVisual Studioのインストール時の「個別のコンポーネント」→「コンパイラ、ビルドツール、およびランタイム」のところから「最新」「（ARMではなく）x86とx64」と書いてある「Spectre軽減ライブラリ」を入れる（細かい表示は正確に記録していないかもしれないor変わっているかもしれない）。「SDK、ライブラリ、およびフレームワーク」にあるMFCとかATLみたいなやつは要らなさそうっぽい。&lt;br /&gt;
&lt;br /&gt;
これでビルドが通った。exeを管理者権限で起動するとBluetoothのところのその他のデバイスとかに表示されるところまではいった。tmhがないとかSpectre関連のエラーとかwdfのエラーとか色々出ていたが全部大丈夫になった。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/win32/api/swdevice/nf-swdevice-swdevicecreate https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/windows/win32/api/swdevice/nf&amp;amp;#45;swdevice&amp;amp;#45;swdevicecreate]に書いてあるように、SwDeviceCreateを呼びだすには管理者権限が必要である。従って、IddSampleDriverのようなソフトウェアをインストールするには管理者権限が事実上必須ということになる。ただし、インストールされたIddSampleDriverというデバイス自体は一般ユーザーでも使用可能である。&lt;br /&gt;
&lt;br /&gt;
では次に本題のIddSampleDriverをビルドする。公式サンプルがビルドできている状況ならこちらも通るものと期待できる。少なくとも手元ではそうなった。逆にIddSampleDriverから始めてみても同様に、WindowsUserModeDriver10.0のエラー→Spectreのエラー、などとなった。&lt;br /&gt;
&lt;br /&gt;
以下、当時の元リポジトリをビルドした際のメモ&lt;br /&gt;
&lt;br /&gt;
* ソースコードに赤線は出ていたがコンパイルは通る。署名に関するエラー（file digestがなんとか）が出るのでプロジェクトのプロパティの下のほうのDriver SigningのFile Digest Algorithmに SHA256 と書く。&lt;br /&gt;
* 解像度やリフレッシュレートの設定が不適切だと、デバイスマネージャで何度か再読み込みされる感じの動作をしたあと自動的に停止され警告アイコンが表示される。&lt;br /&gt;
* 日付を超えるとタイムゾーン（筆者はJST&amp;amp;#61;UTC+9）の関係でInf2Catが失敗する。プロジェクトのプロパティからInf2Catのメニューに行き、General → Use Local Time を「はい (/uselocaltime)」に設定する。参考&amp;amp;#58; [https://monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html https&amp;amp;#58;//monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html]&lt;br /&gt;
** さらに、これを設定してもなぜか現地時間の21&amp;amp;#58;00～24&amp;amp;#58;00の間にビルドしたものは正常動作しなかった（ビルドは通るしデバイスマネージャでの警告アイコンも出ないのにサブディスプレイが出ない）ので、ビルド時はその範囲外になるようにPCの時計設定を適宜変更する（報告済み [https://github.com/roshkins/IddSampleDriver/issues/5 https://github.com/roshkins/IddSampleDriver/issues/5]）&lt;br /&gt;
&lt;br /&gt;
自分でビルドしたやつのインストール時は、（おそらく自分のユーザー名を用いて署名が作られているため？）最初の一回のみ改めて.cerを登録する必要がある。二回目以降は、サブフォルダに生成されてるcat, dll, infをもってきて置き換えたあとデバイスマネージャから「ドライバーの更新」をすればよい。デバイスマネージャーは使ったフォルダをちゃんと覚えているようなので、頻繁に移動しなくていい安定した場所でビルドを行うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hdr対応について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HDR対応について ==&lt;br /&gt;
&lt;br /&gt;
Virtual&amp;amp;#45;Display&amp;amp;#45;DriverのほうではHDRに対応している。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VirtualDrivers/Virtual-Display-Driver/issues/32 https&amp;amp;#58;//github.com/VirtualDrivers/Virtual&amp;amp;#45;Display&amp;amp;#45;Driver/issues/32]や[https://github.com/roshkins/IddSampleDriver/issues/23 https&amp;amp;#58;//github.com/roshkins/IddSampleDriver/issues/23]で話題になっている通り、Windows 10ではHDRは動作しない。&lt;br /&gt;
&lt;br /&gt;
* HDRの基本についてはここがよさそう？ [https://zenn.dev/okuoku/scraps/ca346768627367 https&amp;amp;#58;//zenn.dev/okuoku/scraps/ca346768627367]&lt;br /&gt;
&lt;br /&gt;
=== その他参考情報 ===&lt;br /&gt;
&lt;br /&gt;
このIDDというのはUser&amp;amp;#45;modeで動作するやつなのだがKernel&amp;amp;#45;modeで動作するKMDODとかいうものもあるらしく、そっちの方が多くのことができるのかもしれない。前述の両リポジトリのHDR関連issueでも言及されている。ただし調べた感じ、ただちに使えそうなものは見つからなかった。まあWindowsのディスプレイドライバなんか趣味でそうそう書くもんではないのでしょうがない。&lt;br /&gt;
&lt;br /&gt;
一応適当に調べて出てきた参考リンクなど&lt;br /&gt;
&lt;br /&gt;
* IDDとKMDODに関する議論（2019年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/291368/wddm-display-only-driver-to-create-a-virtual-display-monitor https&amp;amp;#58;//community.osr.com/discussion/291368/wddm&amp;amp;#45;display&amp;amp;#45;only&amp;amp;#45;driver&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;monitor]&lt;br /&gt;
* KMDODで仮想ディスプレイを作れるかどうかについて(2017年)&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/286843/how-to-implement-virtual-display-adapter https&amp;amp;#58;//community.osr.com/discussion/286843/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter]&lt;br /&gt;
** そこで言及されているLin JiaBang氏のソフト（動作未確認）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/LinJiabang/virtual-display https://github.com/LinJiabang/virtual-display]&lt;br /&gt;
* WDDMで仮想ディスプレイを作れるかどうかについて（2016年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/2d60c1c2-5198-47e2-b5d9-2ba28461e72e/how-to-implement-virtual-display-adapter-driver-on-windows-10?forum=wdk https&amp;amp;#58;//social.msdn.microsoft.com/Forums/vstudio/ja&amp;amp;#45;JP/2d60c1c2&amp;amp;#45;5198&amp;amp;#45;47e2&amp;amp;#45;b5d9&amp;amp;#45;2ba28461e72e/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter&amp;amp;#45;driver&amp;amp;#45;on&amp;amp;#45;windows&amp;amp;#45;10?forum&amp;amp;#61;wdk]&lt;br /&gt;
&lt;br /&gt;
== 課題 ==&lt;br /&gt;
&lt;br /&gt;
あくまで仮想的なディスプレイであるからその中身を目視で確認することはできない（ただし別途その内容をウインドウに表示するソフトなどは作れそう）。従って例えば、これを使って共有している間にZoomのミーティングコントロールが非表示になってミュートのon/offなどができなくなるなどの不便さはある。&lt;br /&gt;
&lt;br /&gt;
ちなみに、Windowsでのマルチモニター管理を切り替えるメニューのショートカットはWin+Pであるが、ここで「セカンドスクリーンのみ」を選ぶなどして仮想でないほうのディスプレイが真っ暗になってしまったときはWin+Pを押せば復帰できる。&lt;br /&gt;
&lt;br /&gt;
== 変更記録 ==&lt;br /&gt;
&lt;br /&gt;
もともとディスプレイは5個追加されるが、重過ぎるのでNUM_VIRTUAL_DISPLAYSを1に変更。&lt;br /&gt;
&lt;br /&gt;
解像度を大きくしたいのでソースコードを「1920」で検索し、3840x2160と2560x1440を追加する。&lt;br /&gt;
&lt;br /&gt;
まず s_KnownMonitorModes のところ。この際リフレッシュレートが60HzになるようにPixel Clock Rateをちゃんと計算する必要がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;{&lt;br /&gt;
      229008 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, 2560 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, (2560 + 40) * (1440 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 2560, 1440 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 2560 + 40, 1440 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
      509366 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, 3840 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, (3840 + 40) * (2160 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 3840, 2160 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 3840 + 40, 2160 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のようにする。Pixel Clock Rateの数値は多少のズレがあってもいいみたい？だけど気分的に少しだけ大きめに設定してある。&lt;br /&gt;
&lt;br /&gt;
そのすぐ下のEDIDのところはそのままでよさげ。&lt;br /&gt;
&lt;br /&gt;
そして、一番下のほうのTargetModesのところを変える。配列サイズの変更も忘れずに。いやvectorだから関係ないか。&lt;br /&gt;
&lt;br /&gt;
ちなみにs_KnownMonitorModesがノータッチだとここには1920x1280までしか書けないっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;edid編集に関してメモ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== EDID編集に関して（メモ） ==&lt;br /&gt;
&lt;br /&gt;
HDR機能の追加に使えるかと思ったが結局効果はなかった。&lt;br /&gt;
&lt;br /&gt;
Deltacast E&amp;amp;#45;EDID Editorがふつうに有能。ここに書いてあった&amp;amp;#58; [https://ameblo.jp/holycater/entry-12467348533.html https&amp;amp;#58;//ameblo.jp/holycater/entry&amp;amp;#45;12467348533.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.ninshoshiken.com/about-ajsc1-edid-editor/ https&amp;amp;#58;//www.ninshoshiken.com/about&amp;amp;#45;ajsc1&amp;amp;#45;edid&amp;amp;#45;editor/]&lt;br /&gt;
&lt;br /&gt;
[http://blawat2015.no-ip.com/~mieki256/diary/201602063.html http&amp;amp;#58;//blawat2015.no&amp;amp;#45;ip.com/&amp;amp;#126;mieki256/diary/201602063.html]&lt;br /&gt;
&lt;br /&gt;
[http://www.edidreader.com/ http&amp;amp;#58;//www.edidreader.com/]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=353</id>
		<title>Windowsでエクスプローラーからフォルダを各種ターミナルで開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=353"/>
		<updated>2025-09-01T01:31:51Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Explorerの右クリックメニューやアドレスバーからフォルダを各種ターミナルで開くための設定方法の紹介。cmd.exe, powershell（pwsh含む）, Cygwin, Git Bashの4つに対応。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
&lt;br /&gt;
* [[Windowsの右クリックメニューから複数ファイルをまとめて開く|Windowsの右クリックメニューから複数ファイルをまとめて開く]] のように、レジストリでフォルダ・フォルダ背景の右クリックメニューを編集できる。&lt;br /&gt;
** Windows10までの右クリックメニューに戻そう。&lt;br /&gt;
** &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定値に直接コマンドを書く方法と、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値（など）を使ってCOMを通じて実行する方法（このために[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]（使い方はレポジトリの説明を参照）を作った）がある。&lt;br /&gt;
** HKLMにあるマシン全体の設定は、それ自体は管理者権限（あるいはTrustedInstallerなどさらに上の権限）がないと書き換えられないが、&amp;lt;strong&amp;gt;HKCUに値があればそちらが優先される&amp;lt;/strong&amp;gt;ので、自分だけに関する設定変更ならユーザー権限だけで可能である。&lt;br /&gt;
** &amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;の直下に&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という名前でキーを作った場合は、自動的に&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の内容が管理者権限で実行される。ただ、&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という固定のただ一つの名前しか使えないため、例えば管理者としてコマンドプロンプトを開くメニューとPowerShellを開くメニューを共存させることができない。そのためこの記事では&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;キーを使用するのではなくコマンドの中で明示的に管理者としての実行を行っている。&lt;br /&gt;
* Explorerのアドレスバー（address bar, location barなど）にcommandと入力してEnterを押すと、そのフォルダをカレントディレクトリとして&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;というコマンドが実行される。&lt;br /&gt;
** このアドレスバーの仕様はおそらく「ファイル名を指定して実行」とほぼ同じ。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;で（メインとして）指定するファイルはフルパスなら必ず動作し、Pathが通っているまたはApp Pathsに登録されているならファイル名だけでよく、さらにbatやexeの場合は拡張子も省略できる。さらに、ほとんど知られていないが実は&amp;lt;strong&amp;gt;App Pathsの値には実行ファイル以外も書ける&amp;lt;/strong&amp;gt;ようである。&lt;br /&gt;
** つまり、パスの通っているフォルダにあるimage.pngはフルパスを打たなくても「image.png」で開けるし、さらにはApp Pathsの&amp;lt;code&amp;gt;openimage.exe&amp;lt;/code&amp;gt;というキーにimage.pngのフルパスを書けば&amp;lt;code&amp;gt;openimage&amp;lt;/code&amp;gt;と打つだけで（実際にはそのような実行ファイルは全く存在しないにもかかわらず）image.pngが開くようになる。当然、vbsなども拡張子無しで呼び出せることになる。&lt;br /&gt;
&lt;br /&gt;
== ポイント ==&lt;br /&gt;
&lt;br /&gt;
==== パス名のルール ====&lt;br /&gt;
&lt;br /&gt;
* Windowsではパスの長さが260文字以下という制限がある。詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] 参照。&lt;br /&gt;
** 制限を超えるような長いパスは&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;というプレフィックスを付けて（UNCパスの一種として）扱われる。&lt;br /&gt;
*** このようなフォルダをカレントディレクトリとしてコマンドを実行することはできないので、アドレスバーに打ち込む方式は使えない（System32をカレントディレクトリとして実行される）。wt &amp;amp;#45;dなどにも指定できない。&lt;br /&gt;
*** 右クリックメニューでは、commandの既定の値に直接書く方式の場合は、&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を設定しないと呼び出されなくなる。&lt;br /&gt;
*** シンボリックリンク/ジャンクションでパスを短くしてやれば普通に扱えるようになる&lt;br /&gt;
* 普通に入力できる文字でWindowsのファイル名に使えないのは、&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#58;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;の9個（エクスプローラーの画面で入れようとすると表示される）。&lt;br /&gt;
** その他、ヌル文字やタブスペースのような0x20未満の制御文字も使えない（はず）。&lt;br /&gt;
*** これらを含むファイルはGit Bash/Cygwinを使っても作れない。&lt;br /&gt;
*** NTFS自体の制限はおそらく&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;だけで、それ以外に関してはLinux上で作ってからWindowsで見ると見られることもある。中身の閲覧などは不可。&lt;br /&gt;
* また、末尾が空白またはピリオドのファイルも禁止で、Explorerやcmdでは作れない（自動で除去される）。&lt;br /&gt;
** これらはGit Bash/Cygwinなら作れる。前者はエクスプローラーで閲覧など多少の操作ができるが後者はほとんど何もできず、DelegateExecuteの右クリックメニューでもピリオドが外れた名前しか取得できない。&lt;br /&gt;
* 先頭が空白のファイルはExplorerだと作れないがcmdなら作れる。禁止ではないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
* Git BashではWindowsの実行ファイルにスラッシュ付きオプションを渡すときはスラッシュを2つにする必要がある。&amp;lt;code&amp;gt;cmd //c&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;bcdedit //v&amp;lt;/code&amp;gt;など。&lt;br /&gt;
* printf関数の%qオプションを使うと、文字列を&amp;lt;strong&amp;gt;エスケープされた状態にして&amp;lt;/strong&amp;gt;返してくれる。これはshからの呼び出し先の別のshで再びフォルダ名をcdなどの引数として利用したいときに使える。&lt;br /&gt;
** bash（POSIX互換ではない）の組み込みコマンドのprintfと、独立実行ファイル（GNU Coreutilsの一部）である/bin/printfがある。基本的な趣旨としては同一のコマンドだが、組み込みコマンドのほうは入力に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が含まれていない限り結果にも&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が使われることはないようで、このおかげで意図しない動作を回避できることがある。今回扱う例に関しては前者が後者の上位互換であるということになる。後者を使っているものはそれでも動いたものである。&lt;br /&gt;
** そもそも%qは組み込みコマンドのほうにしかないという話もある。環境によって違いそう。&lt;br /&gt;
* &amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くような長いパスをカレントディレクトリにしていても、Git Bash/Cygwinに付属の（というかMSYS/Cygwin向けにコンパイルされた？）exeなら実行できる。&lt;br /&gt;
* Git Bashの(ba)shは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけて起動してもカレントディレクトリが維持されるが、&amp;lt;s&amp;gt;Cygwinの(ba)shは&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;をつけると強制的にホームディレクトリに移動する。&amp;lt;/s&amp;gt;&lt;br /&gt;
** 2024/4頃、Cygwinの挙動が変化し、カレントディレクトリが維持されるようになっていることに気付く。変わっていた方のバージョンは3.5.3、変わっていない方は3.3.6であった。&lt;br /&gt;
** ところで、[https://superuser.com/questions/345964/start-bash-shell-cygwin-with-correct-path-without-changing-directory Start bash shell (cygwin) with correct path without changing directory &amp;amp;#45; Super User]の通り、&amp;lt;code&amp;gt;CHERE_INVOKING&amp;lt;/code&amp;gt;という変数を1に設定しておけばカレントディレクトリは維持される。&lt;br /&gt;
* Git Bashにおいては環境変数を正しく設定するため&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;の時点で環境変数&amp;lt;code&amp;gt;MSYSTEM&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;にしておく必要がある。[[Windowsでのターミナル環境|Windowsでのターミナル環境]] 参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershellpwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell/pwsh ====&lt;br /&gt;
&lt;br /&gt;
* バージョン5まで（Windows PowerShell）はpowershell.exe、6以降（PowerShell Core, PowerShell）はpwsh.exeと実行ファイル名が違う&lt;br /&gt;
** 以後、「powershell(.exe)」と「pwsh(.exe)」で呼び分ける。ただし手元ではpowershellの5.1とpwshの7.2～7.3くらいでしか試していないので、一部バージョンではまた違う可能性もある。&lt;br /&gt;
** pwshは必ずしもWindowsに標準では入っていないので、以下の例でもあまり依存しないように気を付ける。&lt;br /&gt;
** 基本、シングルクォートで囲えばほとんどの特殊文字が無効になり、シングルクォート自体を書くときは2つ並べる。ただし注意点として、驚くべきことにpowershell/pwshでは「&amp;lt;strong&amp;gt;全角のシングルクォート&amp;lt;/strong&amp;gt;（U+2018&amp;amp;#45;U+201B、&amp;lt;code&amp;gt;‘&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‚&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‛&amp;lt;/code&amp;gt;の4つ）」も通常のシングルクォートと同じ効力があるので、同じようにエスケープする必要がある（参照&amp;amp;#58; [https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-02?view=powershell-7.2 https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/powershell/scripting/lang&amp;amp;#45;spec/chapter&amp;amp;#45;02?view&amp;amp;#61;powershell&amp;amp;#45;7.2]）。掲載したスクリプトでは省略しているがやることは同じ。&lt;br /&gt;
* powershell.exe&lt;br /&gt;
** &amp;amp;#45;Commandがなくても付けたのと同じ扱いになる？&lt;br /&gt;
*** 逆に、&amp;amp;#45;Commandを付けなければいけないという点を除いてはpwshがpowershellの上位互換という感覚である（新しいのでそれはそう）。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダの扱いにバグがあり、cmdなどでこれらのフォルダをカレントディレクトリとした状態で5系のPowerShellを起動すると&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;amp;gt;&amp;lt;/code&amp;gt;をカレントディレクトリとして起動される（たとえば&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#93;&amp;amp;#91;&amp;lt;/code&amp;gt;なら前者、&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;なら後者）。&lt;br /&gt;
** &amp;amp;#45;Fileを使用してスクリプトを実行するとき、ダブルクォーテーションで囲われていない &amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt; が引数に含まれているとエラーになるバグがある。&lt;br /&gt;
* powershell.exe・pwsh.exe共通&lt;br /&gt;
** 連続した&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;があるフォルダに関する挙動にバグがある。コンソールプログラムを実行しても新規ウインドウで開かれる、そこをカレントディレクトリとしたときにファイルをmvできないなど。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダに関しても、絶対パス指定したりきちんとエスケープしたりすれば操作自体はできる（場合もある）。&lt;br /&gt;
*** エスケープはいずれも直前に&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;を付ける。&lt;br /&gt;
*** これらを特殊文字として扱いたくないときは&amp;lt;code&amp;gt;&amp;amp;#45;LiteralPath&amp;lt;/code&amp;gt;を付けると良い場合もある。&lt;br /&gt;
** UNCパスをカレントディレクトリにすることができるが、&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;lt;/code&amp;gt;とかいう謎のプレフィックスが付く。&lt;br /&gt;
** 末尾が空白のフォルダについてはcdできず、Cygwinなどでそのようなフォルダをカレントディレクトリとして起動したとしても&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\PowerShell\7&amp;lt;/code&amp;gt;に移動してしまう。&lt;br /&gt;
** 8.3形式のパスを強制的に長い名前に戻してcdしてしまう。その結果、長いフォルダをカレントディレクトリとして外部プログラムを実行できなくなる。&lt;br /&gt;
* PSModulePath環境変数の関係な気がするが、pwshの中でcmdを起動してその中でpowershellを起動したりするとPSReadLineモジュールが読み込めない（&amp;lt;code&amp;gt;PSReadline モジュールを読み込めません。コンソールは PSReadline なしで実行されています。&amp;lt;/code&amp;gt;）とか言われたりする&lt;br /&gt;
&lt;br /&gt;
==== 環境変数への置換 ====&lt;br /&gt;
&lt;br /&gt;
cmdなどを使うと&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で囲われた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が置換される。&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はファイル名にも普通に使える文字なので、注意が必要となる&lt;br /&gt;
&lt;br /&gt;
* 該当の名前の環境変数が定義されていたときのみ置換が行われ、定義されていなければそのままになる。&lt;br /&gt;
* &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;の置換は必ずしも&amp;lt;strong&amp;gt;cmdだけで行われるわけではない&amp;lt;/strong&amp;gt;。「ファイル名を指定して実行」、VBSのWscript.Shellのrun、conhost、wtの引数などでも行われる。しかしCreateProcessやShellExecute(Ex)やレジストリ値では行われない（無理やりREG_EXPAND_SZにしたら展開されるが、後述の&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;との適用順などは不明）。&lt;br /&gt;
* 一般には、環境変数には英数字とアンダースコアしか使えないとの説明もよくあるが、実際にはほとんどの記号が有効である。従って、&amp;lt;code&amp;gt;^%PATH^%&amp;lt;/code&amp;gt;のようなキャレットによるエスケープはcmd向けにはある程度有効だが、&amp;lt;code&amp;gt;PATH^&amp;lt;/code&amp;gt;という環境変数が定義されているとうまく動かない。&lt;br /&gt;
* （そういう変数が定義されていることは現実にほとんどないだろうし、それが保証できるなら以下の部分を読む必要はない）&lt;br /&gt;
&lt;br /&gt;
これを防ぐ方法はいくつかある。ちなみに、&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;でのエスケープというのはバッチファイルの中だけの話で、今回の場面では以下より簡単なエスケープ方法は多分ないと思う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;既に定義されているかもしれない環境変数をバックアップし、一時的にその中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変えて使用することでリテラル文字としての&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を表現し、後で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;すなわち、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;のような変数の中身をバックアップし、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変え、未知の文字列中の&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をすべて&amp;lt;code&amp;gt;%MY_PERCENT%&amp;lt;/code&amp;gt;にすることで&amp;lt;strong&amp;gt;この部分が置換によって&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に変わるのを利用して&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をそのまま渡すということである（環境変数の置換は左から順に行われるため、たとえば&amp;lt;code&amp;gt;%MY_PERCENT%PATH%MY_PERCENT%&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;が置換されることはない）。受け渡しが終わったら&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を復元する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、変数のバックアップとリストアを同じプロセス・スクリプト内で行える（&amp;lt;strong&amp;gt;呼び出した後に元に戻ってくる&amp;lt;/strong&amp;gt;）場面で有用である。呼び出し先プロセスでリストアすることも不可能ではないと思うが、環境変数には任意の文字が入る可能性があることを考えるとエスケープが大変困難になることが予想される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;VAR1, VAR2, VAR3, …のような無限個の変数を最初からチェックし、最初の未定義の変数を上記と同様に使用し、後で未設定にする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ほぼ上記と同じだが、内容のリストアでなく未設定にするだけなので、呼び出し先プロセスでも容易に行える。ただし実装が面倒である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;へと置換して、置換のプロセスを抜けた段階で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これは、&amp;lt;strong&amp;gt;最初の文字以外に&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;が含まれる&amp;lt;/strong&amp;gt;環境変数名は（実際に環境変数が設定されていたとしても絶対に）置換されないことがわかったためである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%&amp;amp;#61;%&amp;lt;/code&amp;gt;（あるいは、&amp;lt;code&amp;gt;%&amp;amp;#61;VAR%&amp;lt;/code&amp;gt;など）は少なくともcmdの対話シェル上だと置換されてしまうので&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;へのエスケープだと不十分に見えるが、実際には&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;一つでも問題なく動く場合もあった。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;しかし、動かないときもあるので、多くの例では&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にエスケープしている。&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;になっているものは、試した限りはそれでも問題なく動いているものである。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables Environment Variables &amp;amp;#45; Win32 apps | Microsoft Learn]では「&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;は環境変数に使えない」と書かれていて、ダイアログからでも設定はできないが、レジストリだと無理やり設定できる。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ユーザー環境変数に設定する分にはとりあえず問題なさそうだが、システム環境変数にレジストリから&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;（と、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を名前に含むいくつかの変数。どれが原因かは正確にはわからない）を無理やり追加したら&amp;lt;strong&amp;gt;0xc000021のブルースクリーンでWindowsが起動しなくなった&amp;lt;/strong&amp;gt;（Linuxからchntpwで該当の変数を全て削除したら治った）のでこれはやってはいけない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみに、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はUnix側では特殊文字ではないので、printfとの適用順はあまり気にする必要はない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;この方法のメリットは、一度置換してしまえばその文字列を何度使いまわしても変化がないことが保証されることと、未定義の変数の探索や変数のリストアが必要ないことである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;要は&amp;lt;code&amp;gt;%(&amp;amp;#61;を含まない文字列)%&amp;lt;/code&amp;gt;を含まない文字列だけを値にとる単射を構成すればいいだけなので、base64エンコーディングのようにしても構わない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただ、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に置換するという操作はPowerShellやshにとっては容易でもcmdにとっては不可能に近いので、最終的な呼び出し先がcmdであるときには採用しづらい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、今回の記事ではcmdやvbsのRunを経由してコマンドを実行しているものが多くあるが、&amp;lt;strong&amp;gt;このスクリプトの内容自体もエスケープが必要&amp;lt;/strong&amp;gt;である。つまり、例えば&amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt;の内側に&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;,&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;というPowershellコードが含まれるなら、&amp;lt;code&amp;gt;&amp;amp;#39;,&amp;amp;#39;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;という環境変数が定義されていた時にその部分が置換されてしまう。これを回避するのはそこまで難しくなく、この例であれば&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;),&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;のように&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を含む無意味なコードを挿入すればよい。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をいったん&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にしている部分に関しては、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#61;&amp;amp;#61;&amp;lt;/code&amp;gt;にすることで問題を避けられるだろう。無駄に複雑になるのでスクリプト例ではそのような措置はしていない。&lt;br /&gt;
&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
* UNCパス（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;だけでなく普通のUNCパスも含む）をカレントディレクトリにすることはできない（rdなど一部コマンドでの取り扱いは可能）。&lt;br /&gt;
* 末尾が空白のフォルダにcdすることはできないが、Cygwinなどでそのようなフォルダをカレントディレクトリとした状態でcmdを起動した場合は、そのフォルダをカレントディレクトリとして起動する（外部プログラムの起動はできないがcdなどの内部コマンドは有効で、一度でも出たら戻れない）。&lt;br /&gt;
* 各種のパース規則が本当に謎。特に引用符周りは地獄である。[https://thinca.hatenablog.com/entry/20100210/1265813598 cmd.exe のコマンドラインの仕様を解析してみた &amp;amp;#45; 永遠に未完成]を読むとわかるが、例えば「ファイル名を指定して実行」で以下の挙動を確かめよう。&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;と出る&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c &amp;amp;amp; d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;echo &amp;amp;quot;a b&amp;amp;quot;c&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;d&amp;amp;quot;&amp;lt;/code&amp;gt;がそれぞれ別々に実行される&lt;br /&gt;
** すなわち、&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が一見特殊文字でないかのような振る舞いをする（そのまま出力される）割に、その前後で特殊文字の扱いが切り替わっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
* 以下、wtと略す（実行ファイル名がwt.exeなため）。パスが通っているものと仮定する。&lt;br /&gt;
* wtでは&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;が特殊文字になるようで、&amp;lt;code&amp;gt;\&amp;amp;#59;&amp;lt;/code&amp;gt;とエスケープが必要。[https://github.com/microsoft/terminal/issues/13264 https://github.com/microsoft/terminal/issues/13264] かな？&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;も&amp;lt;code&amp;gt;\&amp;amp;quot;&amp;lt;/code&amp;gt;にする必要がある。一方で、単一の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;は（うしろに&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;などがなければ）そのまま&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;になるようである。大丈夫なのか…？&lt;br /&gt;
* 起動時にカレントディレクトリがユーザーフォルダ（%USERPROFILE%）になる&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#45;d&amp;lt;/code&amp;gt;オプションで明示的に指定することができる&lt;br /&gt;
&lt;br /&gt;
==== 連続空白 ====&lt;br /&gt;
&lt;br /&gt;
空白が連続するファイル名の対応は割と厄介である。Windows側では引数を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;で囲うことで、またsh側では適宜&amp;lt;code&amp;gt;IFS&amp;amp;#61;&amp;lt;/code&amp;gt;と設定することで対処できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Unicode対応 ====&lt;br /&gt;
&lt;br /&gt;
* UTF8を使おう&lt;br /&gt;
* &amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が一応使えるが、一旦シェル内部に入らないと使えないのでやや不便&lt;br /&gt;
** 使わなくても大丈夫なときもある。あまりちゃんと理解できていないが、経験上、powershellで&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;変数を用いて標準入力を受け取る際には&amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が必要そう。&lt;br /&gt;
* /bin/printfやprintfの実行時には&amp;lt;code&amp;gt;LANG&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;en_US.UTF8&amp;lt;/code&amp;gt;とかに設定する。&lt;br /&gt;
** Cygwinなら不要？&lt;br /&gt;
&lt;br /&gt;
==== デバッグ時 ====&lt;br /&gt;
&lt;br /&gt;
* 管理者権限のものを試すときでもまず&amp;lt;code&amp;gt;&amp;amp;#45;Verb Runas&amp;lt;/code&amp;gt;を外して動作確認するとよい。&lt;br /&gt;
* 後述のwaitrunも役に立つだろう。&lt;br /&gt;
* 特殊文字に関しては、最初は空白のないフォルダ、次に空白のあるフォルダや連続空白のあるフォルダ、次にシングルクォートや&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;を含むフォルダなどとだんだん難しくしていくとよい。&lt;br /&gt;
* それとは別に、Unicode対応、&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;（ドライブ直下）対応、259文字のフォルダ対応（後述）などをチェックする&lt;br /&gt;
* 難しい例は、例えば&amp;lt;code&amp;gt;z  𠮷𠮷%PATH%  &amp;amp;#39;  &amp;amp;#39;&amp;amp;#39;  `  `` $PATH &amp;amp;amp; &amp;amp;amp;&amp;amp;amp;   %%PATH%%&amp;amp;#91;&amp;amp;#93; &amp;amp;#93; &amp;amp;#91;  ^  ^^   &amp;amp;#39;  &amp;amp;#59;  &amp;amp;#59;&amp;amp;#59;  𩸽𩸽!PATH!&amp;amp;#35;$%&amp;amp;amp;&amp;amp;#39;()&amp;amp;#61;&amp;amp;#126;&amp;amp;#123;`+&amp;amp;#125;_,.&amp;amp;#93;&amp;amp;#91;&amp;amp;#59;@^&amp;amp;#45; &amp;amp;#45; ‘ ’ ‚ ‛&amp;lt;/code&amp;gt;のような感じ（適当）。こんなファイル名を現実に見ることはないが、エクスプローラー上で普通に入力できる内容である。&lt;br /&gt;
** 「𠮷」はBMP外かつJIS外の漢字としては最も変換で出しやすいのでテストに重宝する。（𩸽はBMP外だがJIS外ではない（第4水準））&lt;br /&gt;
&lt;br /&gt;
==== その他 ====&lt;br /&gt;
&lt;br /&gt;
* デフォルトシェルは、通常ユーザーはwtでも管理者の場合はconhostに設定されているっぽい？&lt;br /&gt;
* &amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のようなドライブ直下のパスは末尾に&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を付けなければいけないことが多い。たとえばwt &amp;amp;#45;dの引数にする場合など。またcmdでcdコマンドや&amp;lt;code&amp;gt;CD&amp;lt;/code&amp;gt;環境変数を見るときもドライブ直下のときだけは&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;が付いて返ってくる。&lt;br /&gt;
** ただ、wt &amp;amp;#45;d に&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;lt;/code&amp;gt;が渡されるように見えるのになぜか動いているものもある。未調査。&lt;br /&gt;
* shやcmdなどの中に一旦入ってしまうと一部の環境変数などが書き換わってしまうかもしれないが、多少は許容することとする。&lt;br /&gt;
* コマンド例は網羅的でない可能性があり、色々な書き方を提示しようとあえて統一していないところもある。現実にはもっと簡単なやり方があるかもしれない。あくまで一例ということで。&lt;br /&gt;
* CygwinとGit Bashはほぼ同じなのでGit Bashを主に載せてCygwinは適宜差分のみ記述する。&lt;br /&gt;
* shは、特にベースのシェルとして使うにはエスケープの方式などでWindowsと相性が悪く使いづらい感じがする。逆にcmdは内部コマンドは地獄だがベースのシェルとしては意外と副作用が少なく、そう悪くはない。&lt;br /&gt;
* 以下の例ではCygwinやGit Bashの実行ファイルにはPATHを通していないことを想定している。&amp;lt;code&amp;gt;C&amp;amp;#58;\cygwin64&amp;lt;/code&amp;gt;あたりは適当に読み替えていただきたい。&lt;br /&gt;
* 2021年途中ごろまで、wtなどのストアアプリ系？の実行ファイル（Explorer上で0バイトになってるエイリアス）をGit Bashから実行できない（Permission deniedとなる）バグがあった。 [https://github.com/git-for-windows/git/issues/2675 https://github.com/git-for-windows/git/issues/2675]&lt;br /&gt;
* ネットワークドライブは各ユーザー対象に割り当てられているせいなのか、&amp;lt;strong&amp;gt;管理者として実行すると利用できない&amp;lt;/strong&amp;gt;らしい。割り当てられる前のネットワークパス自体は有効。&lt;br /&gt;
* wtを管理者権限で呼び出すときに（確率的に）ウインドウが最前面にならないことがある。chcpの有無で変わったりするなど詳細不明。conhostだとならない気がする。startrunなどを介して実行すると必ず最前面に出るようになるっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;準備&amp;amp;#58;-win&amp;amp;#45;console&amp;amp;#45;delegator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 準備&amp;amp;#58; win&amp;amp;#45;console&amp;amp;#45;delegator ==&lt;br /&gt;
&lt;br /&gt;
cmdやPowerShellやCygwinのbashなどのシェルを使えば、スクリプトを起動して複雑なコマンドを呼び出せたり、パイプ実行が可能になったりと色々便利だが、それだけのためには大仰すぎて、特殊文字の扱いなどがかえって仇になることもある。&lt;br /&gt;
&lt;br /&gt;
そこで、シェル関連の操作に汎用的に使えるコマンドをいくつか作成して公開した。[https://github.com/ge9/win-console-tools https://github.com/ge9/win-console-tools]&lt;br /&gt;
&lt;br /&gt;
* 以前はC++で書いていた（[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]）が、C&amp;amp;#35;のほうが文字列の扱いなどが簡明。&lt;br /&gt;
&lt;br /&gt;
ただし、これはあくまで筆者が独自に作ったものであり、Windows標準のもので何とかしようとするのが面白いところでもあるので、それほど積極的には使わない。今後出てくる例はすべて、これらを一切使わなくても（余計な環境変数が設定されてしまうかもしれないという点をのぞけば）同等の機能が実現できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられた引数を特定の文字列とつなげて実行してくれるプログラム。この実行ファイル自体の名前を適宜変更して使用し、「特定の文字列」は別のファイルから読ませる。使用例は[[Windowsでのターミナル環境|Windowsでのターミナル環境]] を参照。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;amp;#45;gui&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;runotherとほぼ同じだが、コンソールアプリケーションではなくWindowsアプリケーション（黒いウインドウが出ない、cmd上で実行したときに終了待ちが行われないなど）。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;evalrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行し、その出力をそのままコマンドラインとして実行するコンソールアプリケーション。（テキストファイルからのコマンドラインの読み込みなどに使える）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;startrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインをWindowsのデフォルトシェルで起動するだけのWindowsアプリケーション。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;waitrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行したあとキー入力を待ってから終了するコンソールアプリケーション。一瞬でウインドウが消えてしまうときのデバッグに使いやすい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;hiderun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;コンソールウインドウ非表示の状態で与えられたコマンドを実行するWindowsアプリケーション。（GUIアプリケーションなどを与えた場合は非表示にならないかも）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;vbsのvbHideでも非表示にできるが、コンソールウインドウの表示位置をみると非表示のウインドウが一つ挟まっていることが分かるのに対して、こちらの場合はそうならない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを最初の&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;とそれ以降の2つに区切ってそれぞれコマンドとしてパイプでつなげて実行するコンソールアプリケーション。ただし最初のコマンドのほうに&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;自体を入力したいときは&amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;でエスケープする。また2つ目のコマンドの先頭の空白は除去される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperunex&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;piperunと似ているが、2つだけでなく3つ以上の任意個のパイプ実行を一度に行う。一見便利だが、コマンドの後ろ側に未知の文字列が渡される場合、&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;をエスケープする必要が生じる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun piperunex command1 || command2 || ... || commandN | unknown_commandline&amp;lt;/code&amp;gt;のように外側を&amp;lt;code&amp;gt;piperun&amp;lt;/code&amp;gt;で囲うと安全。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;adminrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを管理者として実行するWindowsアプリケーション。&amp;lt;code&amp;gt;ShellExecuteEx&amp;lt;/code&amp;gt;では実行ファイルパスと引数は別々に指定しなければいけないので最低限の引数の解析を行っている。PowerShell経由で管理者権限で実行するときのような面倒なエスケープが全て不要になるため非常に使いやすいが、この記事ではこれに依存しないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみにこういうのもある。[https://github.com/mattn/sudo mattn/sudo&amp;amp;#58; sudo for windows] これは、通常のUACのように別ウインドウで実行するのではなく、localhostのランダムなポートを使い、自分自身にポート番号を渡しつつ管理者権限で呼び出すことで標準入出力を転送し、元の端末でそれを読み書きできるという点で、linuxのsudoに近い。しかし標準入出力を介しているので、&amp;lt;code&amp;gt;cmd /c for /?&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cmd /c pause&amp;lt;/code&amp;gt;の挙動が変わってしまうという問題がある。また、呼び出し元でchcp 65001をしていると文字化けする。また、コマンドライン引数を一旦配列に分割してから組み直しているので情報が一部落ちている。あと、セキュリティ的にも懸念があるかもしれないが、これはそもそもLinuxのsudo自体がまずどうなの？という気持ちになった。（未解決）（参照&amp;amp;#58; [https://twitter.com/e9g/status/1687385469921931264?s=20 https&amp;amp;#58;//twitter.com/e9g/status/1687385469921931264?s&amp;amp;#61;20]）&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;uacrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startrunと同じだが、コンパイル時のマニフェスト設定でこのプログラム自体の実行に管理者権限を要求するようにしたので、adminrunと同じように使える（管理者権限で実行する対象が渡されたコマンドではなくuacrun自体になるという違いはある）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pecho&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドライン引数をそのままコンソールに出力する。→WindowsでUnicode文字（特にU+10000以上）を正しく表示（&amp;amp;amp;ファイルに書き込み）するには、「出力先がコンソールならWriteConsoleW、そうでなければWriteFileを使用する」といった非常に面倒な実装が必要であり（参照&amp;amp;#58; [https://twitter.com/mattn_jp/status/542581083242364928 https&amp;amp;#58;//twitter.com/mattn_jp/status/542581083242364928] など）、C++やC&amp;amp;#35;では扱いづらい。そこでrustを用いて実装した。→[https://github.com/ge9/pure-echo-win pure&amp;amp;#45;echo&amp;amp;#45;win]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;printcd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;カレントディレクトリをコンソールに出力する。（ちなみにpwdの由来はprint working directoryなのでそれに倣った）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;注意&amp;amp;#58;-当初は後述のnoworkingdirectoryを知らなかったので1の方法に頼っていたが実際には2の方法のほうが簡明なのでそちらを使うことを勧める1と11は残しておくが読む必要はあまりない&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 注意&amp;amp;#58; 当初は後述のNoWorkingDirectoryを知らなかったので1.の方法に頼っていたが、実際には2.の方法のほうが簡明なので、そちらを使うことを勧める。1.（と1.1.）は残しておくが、読む必要はあまりない。 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1標準入力から受け取る場合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.標準入力から受け取る場合 ==&lt;br /&gt;
&lt;br /&gt;
まず「標準入力からディレクトリのフルパスを受け取り、そのディレクトリで各種ターミナルを起動するコマンド」を紹介する。&lt;br /&gt;
&lt;br /&gt;
そのようなコマンドを仮に&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;とすると、ExecuteCommand&amp;amp;#45;Pipeを使用して、レジストリ（該当CLSIDのLocalServer32の既定の値）に以下のように書くことで、CLSIDが右クリックメニューのDelegateExecute値に使えるようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\ExecuteCommand4000.exe h openterm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;はコンソールウインドウを非表示にするExecuteCommand&amp;amp;#45;Pipeのオプションである。&lt;br /&gt;
&lt;br /&gt;
また、この&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分は非常に長くなることがあり、その場合レジストリに書いて直接編集するのは手間がかかる（操作もしづらいし、更新を即座に反映させるために「&amp;lt;code&amp;gt;LocalServer32&amp;lt;/code&amp;gt;」キーの名前などを変えて戻す必要もあって面倒）。そこで、runotherを使ってtxtに&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の内容をそのまま書くことで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分にそのexeの名前だけを書けばよくなる。&lt;br /&gt;
&lt;br /&gt;
また、いくつかはCygwin/Git Bash向けに冒頭でcygpathによる変換を入れているが、これを取り除けば、Cygwin/Git Bash用のパスを受け取って動作するコマンドということになる。&lt;br /&gt;
&lt;br /&gt;
では以下で、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分についてそれぞれ紹介する。&lt;br /&gt;
&lt;br /&gt;
* 直接コマンド記入でも&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を指定すれば&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;に対応できるというのをこのセクションの大部分を書き終えてから知ったので、&amp;lt;strong&amp;gt;このセクションは内容の多さの割には実際の必要性はそこまで大きくないかもしれない&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git&amp;amp;#45;bashexeで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;で開く ====&lt;br /&gt;
&lt;br /&gt;
この場合shの感覚で&amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;に引数を渡せば勝手にminttyのウインドウで開いてくれるので最も楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.utf8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Git BashのcygpathでGit Bash用のパスに変換&lt;br /&gt;
* printfでエスケープ、utf8を設定&lt;br /&gt;
* git&amp;amp;#45;bash.exeに渡す&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-①startrunを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ①startrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\Git\bin&amp;lt;/code&amp;gt;のbashではなく/usr/binのbash.exeを使う。以後同じ。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-②cmdのstartを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ②cmdのstartを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/\\^/^^/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;amp;/^&amp;amp;amp;/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125; ^| sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* この場合、cmdによる環境変数への置換を避ける必要があるほか、キャレットによるエスケープにも対応する必要がある。&lt;br /&gt;
* Git Bashからcmdを実行しているので&amp;lt;code&amp;gt;//c&amp;lt;/code&amp;gt;のところのスラッシュは2つ。&lt;br /&gt;
&lt;br /&gt;
==== conhostで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; conhost &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conhostによる環境変数の置換を抑制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminalで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminalで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8 printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g) \\&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記に加えてセミコロンへの対応が必要なのと、こっちは/bin/printfじゃなくて組み込みのprintfでこうしないとだめだった。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Cygwin ====&lt;br /&gt;
&lt;br /&gt;
付属のminttyを使うものだけはGit Bashと割と差があるので載せる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\mintty.exe&amp;amp;quot; &amp;amp;#45;e &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-startrun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, startrun ====&lt;br /&gt;
&lt;br /&gt;
* パスのエスケープがおかしい気がするが、なぜか動いている&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun powershell  &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;quot;&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;&amp;amp;#39;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-cmdのstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, cmdのstart ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;\&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;\&amp;amp;#39;.Replace(\&amp;amp;#39;&amp;amp;#61;^%\&amp;amp;#39;,\&amp;amp;#39;%\&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] でも書いた通り、Windows側は&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのフォルダだけは（その必要があるにもかかわらず）8.3形式を使った短いパスにして渡してくれない。そこで、パス長さが258を超えていればcmdに渡して8.3形式の名前に変換する処理をPowerShell側で行う。この際はエスケープされていない正確なパス名をcmdに渡さなければならないので&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の値を一時的に&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に設定する方法をとっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;念のため再確認しておくが、この&amp;lt;code&amp;gt;&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;&amp;lt;/code&amp;gt;の部分は&amp;lt;code&amp;gt;&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;などと変えておかないと、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;が定義されていた場合に正しく動作しない。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cmdでは&amp;lt;strong&amp;gt;ちょうど258文字&amp;lt;/strong&amp;gt;のフォルダでもdirが失敗するなど挙動が不自然であるため、もう少し保守的に&amp;lt;strong&amp;gt;257&amp;lt;/strong&amp;gt;を超えていれば短くするという仕様でもいいかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（追記）8.3形式のパスを取得するのは普通にPowerShell内でもできるらしい…。以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; (New&amp;amp;#45;Object &amp;amp;#45;ComObject Scripting.FileSystemObject).GetFolder($mypath).ShortPath&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
259文字のフォルダを無視するなら以下のように簡潔に済む。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command wt &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39; $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
これは案外難しい。なぜなら、cmd内でcdさせるのは%のエスケープの関係で難しく（cmd内で&amp;amp;#61;を含む文字列を置換することがどうやってもできなさそう（外部プログラムを呼び出すのも難しそうだった）なので、未定義の変数を探索するやり方しかない）、Start&amp;amp;#45;Processの&amp;amp;#45;WorkingDirectoryやCygwinのshは8.3形式に対応していないからである。要は「与えられたディレクトリ（8.3形式のパスが含まれるかもしれない）をカレントディレクトリとして与えられたコマンドを実行する」だけやってくれるプログラムがあればよく、これ自体はそう難しくないことのはずだが、現状、Windows標準環境でこれができるのは自前でプログラムをコンパイルする以外だと（pwshを入れていいならpwshと）&amp;lt;strong&amp;gt;vbsしかない&amp;lt;/strong&amp;gt;ようである。結局、この部分をついでにやってくれるWindows Terminalのほうが楽ということになる。&lt;br /&gt;
&lt;br /&gt;
たとえば以下のようなvbsを用意する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Set objShell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)&lt;br /&gt;
objShell.CurrentDirectory = WScript.Arguments(1)&lt;br /&gt;
objShell.Run(WScript.Arguments(0)),,False&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;startatdir.vbs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のように書ける。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なお&amp;lt;code&amp;gt;startatdir.vbs&amp;lt;/code&amp;gt;のパス指定はフルパスが必要そう（ただしここはcmd /cの中なので&amp;lt;code&amp;gt;%USERPROFILE%&amp;lt;/code&amp;gt;とかを使って書いてもよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11標準入力から受け取る場合-&amp;amp;#45;-管理者権限あり&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.1.標準入力から受け取る場合 &amp;amp;#45; 管理者権限あり ==&lt;br /&gt;
&lt;br /&gt;
上記の続きで、こちらは管理者権限ありのもの。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39; &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39;, &amp;amp;#39;&amp;amp;quot;`&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe`&amp;amp;quot;&amp;amp;quot;&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;i&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start&amp;amp;#45;Process自体がstartみたいなものなので、引数にコンソールアプリケーションを指定したらデフォルトシェルで開かれる。&lt;br /&gt;
* 最後のところ、「&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;」のかわりに「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 とか「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 でも動くのは謎。シングルクォーテーションのエスケープ規則がわからない。参考→[https://twitter.com/e9g/status/1678283164689760256 https&amp;amp;#58;//twitter.com/e9g/status/1678283164689760256]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF&amp;amp;#45;8 printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39; , &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39; &amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== adminrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; /bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; adminrun wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; &amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#123;&amp;amp;#125;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cygwin系なしで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;set&amp;amp;#45;location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;literalpath&amp;amp;#39;,  (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;) &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
再び、startatdir.vbsを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;gt; nul &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59; $bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。259文字のフォルダを無視するなら以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2直接コマンド記入の右クリックメニュー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2.直接コマンド記入の右クリックメニュー ==&lt;br /&gt;
&lt;br /&gt;
レジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定の値に直接コマンドを記入する方式である。&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、右クリックメニューを&amp;lt;strong&amp;gt;押した時点&amp;lt;/strong&amp;gt;でのフォルダ（フォルダを右クリックするメニューからだと&amp;lt;strong&amp;gt;対象フォルダの親&amp;lt;/strong&amp;gt;、フォルダ背景を右クリックするメニューなら対象フォルダ）をカレントディレクトリとしてコマンドが起動される。そのため&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けなければならないような長大なパスのフォルダでは動作しない。しかし、&amp;lt;code&amp;gt;shell\xxxx&amp;lt;/code&amp;gt;キーに&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;値&amp;lt;/strong&amp;gt;を設定することで、カレントディレクトリが必ず&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32&amp;lt;/code&amp;gt;に設定されるようになるので動くようになる。&lt;br /&gt;
&lt;br /&gt;
対象のディレクトリはどう取得するかというと、レジストリに書き込んだ値のうち&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という部分が対象ディレクトリに書き換えられて&amp;lt;/strong&amp;gt;コマンドが実行される。この&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;もC&amp;amp;#58;などの場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;になる。コマンドの中で&amp;lt;strong&amp;gt;そのまま%という文字を使いたい場合はバッチファイルと同様に%%とエスケープする必要がある&amp;lt;/strong&amp;gt;ようである（これはどこにも書いてない？）。&lt;br /&gt;
&lt;br /&gt;
しかし、こうして渡される（特殊文字を含むかもしれない）ディレクトリ名を完璧に取得するのは意外と難しい。cmdに解釈させると&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換されてしまうし、シングルクォートとバッククォートが両方含まれているのでpowershellやshに渡すのも簡単ではない。&lt;br /&gt;
&lt;br /&gt;
コツは、powershell &amp;amp;#45;commandやsh &amp;amp;#45;cの中に直接書くのではなく、&amp;lt;strong&amp;gt;スクリプトへのコマンドライン引数として渡した上で、スクリプト内で引数として取得する&amp;lt;/strong&amp;gt;ことである。それぞれ、基本形（そのまま出力するだけ）は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;powershell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;というトークンを入れることでその後のパラメータの解析を行わないようにできる。args&amp;amp;#91;0&amp;amp;#93;は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;になるのでargs&amp;amp;#91;1&amp;amp;#93;を使う。レジストリに書く際は&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をエスケープして&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%%&amp;lt;/code&amp;gt;。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;でも同様のことができる？&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;0&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;（args&amp;amp;#91;&amp;lt;strong&amp;gt;0&amp;lt;/strong&amp;gt;&amp;amp;#93;になっていることに注意）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;というか、&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;で書き進めてしまったが、本当は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;のほうが安定するかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;あるいは&amp;lt;code&amp;gt;$MyInvocation.Line&amp;lt;/code&amp;gt;を使う方法もある。この場合、powershellへの引数が全て（この例なら&amp;lt;code&amp;gt;&amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; ...&amp;lt;/code&amp;gt;のところから）取得されるので、目当ての部分を取り出すためにここでは最後から2番目の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;と最後の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;の間を取得するという風にしている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39; &amp;amp;#59; Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;昔のPowerShell（2くらい）で試してみたらこちらでないと&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;あたりの処理がうまくいかない場合があった。argsを使うものからの書き換えは容易である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;sh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;sh &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;最後が&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;lt;/code&amp;gt;と閉じられていないのはミスではなく、&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;としてしまうと&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のときに&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;が渡されてしまうのでそれを避けるためである（これはかなりトリッキーなのでもう少し真面目にやってもいいかなとは思う）。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UNCパスの最初の&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;が&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;に変わってしまう（手元では、Cygwinの場合は&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみで発生している？）という問題があり、適宜置換する必要がある。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの書き方はいわゆる「ワンライナー」的なものであるが、もちろん外部にスクリプトファイルを用意してもよい。&lt;br /&gt;
&lt;br /&gt;
また、外部にスクリプトを用意してよいという条件であれば、&amp;lt;strong&amp;gt;vbsも使用可能&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この場合、まずレジストリには&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wscript &amp;amp;quot;C&amp;amp;#58;\path\to\script.vbs&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などと書く。スクリプトの内容は上記のレジストリの内容をほぼそのままWscript.ShellでRunすればよいが、&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;のかわりにWscript.Arguments(0)を挿入するのと、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;にエスケープしなくてよいのと、VBSなので文字列内の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;は&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えなければならない。これに加え、Runの引数に含まれる&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換の対象となるため、対象フォルダの文字列については&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;への置換でエスケープして、呼び出し先のpowershellなどで元に戻す。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;必要に応じてRunのオプションでvbHideを指定する。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;というか別に258文字を超えていたら云々みたいな処理も全部vbs側でやってしまってもよい（面倒なのでそういう例は載せていない）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
バッチファイルに渡すのは、バッチファイルをcmdが呼び出す時点で&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のようなファイル名の環境変数は既に展開されてしまうので、どうやっても不可能。&lt;br /&gt;
&lt;br /&gt;
他には、（hiderunと）piperunとpechoを併用するという方法もあり、それらの実行ファイルを用意する必要があるという以外は綺麗にできる方法である。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、一旦取得できてしまえばあとは前述の&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込むだけでよい。ただ、実際にはわざわざ&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込まなくても（パイプを使わなくても）もっと簡単に起動できることもあるのでそちらを中心に紹介する。&lt;br /&gt;
&lt;br /&gt;
* commandの最初で指定する（メインの）実行ファイル（先ほどなら&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;）をファイル名単体で書く場合は、それが（メニューをHKCUで設定するならHKCUの（最近のWindowsならHKLMのでも可？）、HKLMで設定するならHKLMの）&amp;lt;strong&amp;gt;App Pathsキー&amp;lt;/strong&amp;gt;に登録されていなければならない（&amp;lt;strong&amp;gt;PATHは通っていなくてもいい&amp;lt;/strong&amp;gt;）。登録されていない場合はフルパスで指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
=== 設定例 ===&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限なし ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考までに、Windowsにもともと入っているメニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell.exe &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これだとシングルクォートと連続スペースに対応できない。連続スペースだけなら&amp;lt;code&amp;gt;&amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;%V&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えると解決できる。&amp;lt;code&amp;gt;%$&amp;amp;#91;&amp;amp;#93;`&amp;lt;/code&amp;gt;あたりは見た感じ問題なし。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;以下の解決策でもまだ不完全 [https://superuser.com/questions/1310258/open-powershell-window-here-file-explorer-context-menu-command-breaks-with-fol &amp;amp;quot;Open PowerShell window here&amp;amp;quot; File Explorer context&amp;amp;#45;menu command breaks with folder names with apostrophes (single quotes) &amp;amp;#45; Super User]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この問題は[https://github.com/PowerShell/PowerShell/issues/6598 https://github.com/PowerShell/PowerShell/issues/6598]や[https://github.com/PowerShell/PowerShell/pull/6660 https://github.com/PowerShell/PowerShell/pull/6660] で扱われており、結局pwshでは&amp;amp;#45;WorkingDirectoryというパラメータが追加された。[https://github.com/PowerShell/PowerShell/issues/14091 https://github.com/PowerShell/PowerShell/issues/14091]にある以下の文字列をレジストリに書いたところ、正しく動作したので、pwshではこれでよい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh.exe &amp;amp;#45;NoExit &amp;amp;#45;RemoveWorkingDirectoryTrailingCharacter &amp;amp;#45;WorkingDirectory &amp;amp;quot;%V!&amp;amp;quot; &amp;amp;#45;Command &amp;amp;quot;$host.UI.RawUI.WindowTitle &amp;amp;#61; &amp;amp;#39;PowerShell 7 (x64)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;wt powershell &amp;amp;#45;noexit &amp;amp;#45;Command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;wtで。標準入力のときとほぼ同じ。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windowsにもともと入っているメニューでは以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cmd.exe /s /k pushd &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くパスを除いて）ほとんどの場合に正しく機能するが、&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のような文字列が含まれているフォルダではうまくいかない。ちなみにpushdによりUNCパスには自動的にネットワークドライブが割り当てられる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;mintty（git&amp;amp;#45;bash.exe使用）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;ちなみに、Git Bashのインストーラにより設定される「Git Bash Here」メニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;quot;&amp;amp;#45;&amp;amp;#45;cd&amp;amp;#61;%v.&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、特殊文字にはすべて対応しているが、（NoWorkingDirectoryをつけたとしても）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;で始まるパスではうまくいかない。最後の「.」はよくわからないがこれを付けておくと&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;cd&amp;lt;/code&amp;gt;がうまくやってくれるっぽい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;export MSYSTEM&amp;amp;#61;MINGW64&amp;amp;#59;exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe\&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;置換の対象を&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみとするためsedの引数に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が増えている&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;環境変数の置換を抑止する必要がある。デフォルトシェルで起動するならこれは不要（で、wtでないので&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;のエスケープも不要）で、以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MyInvocationを使う例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;vbsの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;次の節で解説する「（自分が起動された）カレントディレクトリでの起動」にも対応している（引数がない場合）。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Dim curDir&lt;br /&gt;
&lt;br /&gt;
Set ws = CreateObject(&amp;quot;Wscript.Shell&amp;quot;)&lt;br /&gt;
Dim dir&lt;br /&gt;
If WScript.Arguments.Count = 0 Then&lt;br /&gt;
   dir = ws.CurrentDirectory&lt;br /&gt;
Else&lt;br /&gt;
   dir = Wscript.Arguments(0)&lt;br /&gt;
End If&lt;br /&gt;
dir = Replace(dir,&amp;quot;%&amp;quot;,&amp;quot;==%&amp;quot;)&lt;br /&gt;
ws.run &amp;quot;powershell -Command &amp;quot;&amp;quot;&amp;amp; {Start-Process -Verb Runas -Filepath wt -Argumentlist powershell, -noexit, -command, Set-Location, -LiteralPath, (&#039;\&amp;quot;&amp;quot;&#039;&#039;&#039;+($args[1].Trim(&#039;\&amp;quot;&amp;quot;&#039;) -replace &#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;&#039; -replace &#039;;&#039;, &#039;\;&#039; )+&#039;&#039;&#039;.Replace(&#039;&#039;==%&#039;&#039;,&#039;&#039;%&#039;&#039;)\&amp;quot;&amp;quot;&#039;)}&amp;quot;&amp;quot; --% &amp;quot;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;amp;dir&amp;amp;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;, vbHide&lt;br /&gt;
&lt;br /&gt;
Set objShell = Nothing&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この場合も&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。デフォルトシェルなら、startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;理論上はワンライナーでも書けるが、エスケープが面倒すぎるのでファイルに書いたほうがよいだろう。まずレジストリの中身は以下のようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\path\to\gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;で、&amp;lt;code&amp;gt;gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;lt;/code&amp;gt;の中身は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
IFS=&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
echo $*|/bin/sed &#039;s/\\/\\\\/&#039;|/bin/cygpath -f -|printf %q $(/bin/cat) |/bin/sed &amp;quot;s/&#039;/&#039;&#039;/g;s/%/==%/g;s/;/\\\\;/g&amp;quot;|/bin/xargs -d &#039;\n&#039; -I {} powershell -Command Start-Process -Filepath wt -ArgumentList &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\env.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &#039;&amp;quot;MSYSTEM=MINGW64&amp;quot;&#039; , &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\sh.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &amp;quot;&#039;--login&#039;&amp;quot;, &amp;quot;&#039;-c&#039;&amp;quot;, &amp;quot;&#039;&amp;quot;&#039;&amp;quot;IFS=\;cd $(echo {}| /bin/sed s/==%/%/g) \; exec bash&amp;quot;&#039;&amp;quot;&#039;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cygwinも同様である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-codeのメニューおまけ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== VS Codeのメニュー（おまけ） ====&lt;br /&gt;
&lt;br /&gt;
「Code で開く」メニューのcommand値は以下のように設定されている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Microsoft VS Code\Code.exe&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは特殊文字などに関しても問題なく動作するうえ、実はそのまま&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付いたパスにも適用可能である。従って、&amp;lt;code&amp;gt;VSCode&amp;lt;/code&amp;gt;キーに&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;値を設定する（設定の書き換えまたはHKCUによるオーバーライド）だけで、長大フォルダでもVS Codeが使えるようになる。ターミナルの起動には失敗してしまうがファイル・フォルダの作成・編集などの基本操作がGUIでできるので意外と便利（もちろん、他のBetter Explorer的なツールを使う手もあるだろう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-エクスプローラーのアドレスバーから&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. エクスプローラーのアドレスバーから ==&lt;br /&gt;
&lt;br /&gt;
このときは、末尾が空白のパスや&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が必要な長大パスやちょうど259文字のフォルダはそもそも対応していないので考えなくてよい。しかし通常のネットワークファイル向けのUNCパス（&amp;lt;code&amp;gt;\\192.168.1.1\disk&amp;lt;/code&amp;gt;など）に対応する必要はあるので、cmdをベースにすることはできない（cmdの中に入った時点でカレントディレクトリが変わってしまう）。また&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;が含まれるパスをカレントディレクトリにできないことから、powershell.exeもベースとしては使えない。&lt;br /&gt;
&lt;br /&gt;
なので、パイプを使って先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;にむけて流し込もうと思ったら選択肢はpwsh.exeかpiperunかCygwin系だけである。それぞれの書き方は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pwsh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;上とほぼ変わっていないが、pwshはディレクトリの取得だけで使っているので&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;のところで環境変数が汚染されるのを防げる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin/Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cmd //c \&amp;amp;quot;chcp 65001 &amp;amp;gt; nul\&amp;amp;quot;| pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | openterm&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;一つ問題があり、hiderunを使う（コンソールを非表示にする）とchcpが効かないようで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;でPowerShellの&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使っているとUnicode文字が化けてしまう。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分で先頭にcygpathが入っているものを使うときは、そちらのcygpathとこちらでのcygpath &amp;amp;#45;wは打ち消し合って無駄なので消してよい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このほかにvbs(wscript)もカレントディレクトリの取得のところは問題なくやってくれるので、それをさっきのWscript.Arguments(0)のかわりに使えばよい。&lt;br /&gt;
&lt;br /&gt;
最初に表示されるコンソールを非表示にしたければ、&amp;lt;code&amp;gt;hiderun&amp;lt;/code&amp;gt;を付けてrunother経由で実行するのが手軽だが、前述の通りvbsも拡張子無しで呼び出せるように設定できるので、そうした上でvbHideで隠してもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;管理者権限なし-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 管理者権限なし ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
これは普通にcmdと打てばよい。&lt;br /&gt;
&lt;br /&gt;
（デフォルトシェルがconhostだとして）wtで開きたいときは、&amp;amp;#59;をエスケープして&amp;amp;#45;dで渡す。以下の通りbatファイルを作ってpathを通す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wtではなくconhostの場合はconhost cmdだけでよい。batにするなら&amp;lt;code&amp;gt;start &amp;amp;quot;&amp;amp;quot; conhost cmd&amp;lt;/code&amp;gt;でよい。&lt;br /&gt;
&lt;br /&gt;
コンソール非表示ならcmd /cをつけてhiderunする。runotherで、txtの中身は以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
pwshはそのままpwshと打てばよい。powershell及びwtやconhostを明示的に指定する場合について以下で述べる。&lt;br /&gt;
&lt;br /&gt;
たとえばwtでpwshなら、runotherを使って、txtの内容は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command wt &amp;amp;#45;d $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellの場合は&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;に対応するため起動後に移動する。runotherでpiperunを使って、txtは以下。最終的に起動する方のpowershellで&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に戻している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pwshが使えるならprintcdのかわりに&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;でもよい。&lt;br /&gt;
&lt;br /&gt;
以下はpiperunを使わずshでやる例。前述の通りパイプからPowerShell側で&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使って受け取ると文字化けするので引数として渡す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$(pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath \(\&amp;amp;quot;&amp;amp;#39;$WD&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;,&amp;amp;#39;%&amp;amp;#39;)\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
Git Bashは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけてもカレントディレクトリを維持するので単純である。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinは起動後にcdする。そのかわり&amp;lt;code&amp;gt;export MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;が不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/bash &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#39;$(/bin/printf %q `pwd`)&amp;amp;#39;&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printfで一旦エスケープしたものをcdの後につなげてそのまま渡している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;wtで&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;あれ、wtなのにカレントディレクトリ維持されてる…？wt cmdではダメなのだが…&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;WD&amp;amp;#61;$(printf %q `pwd` | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59;  s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#39;$WD&amp;amp;#39;|sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 管理者権限あり ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
runotherを使って以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;gt; nul &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TrimEnd(&amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;のところは&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;の末尾のバックスラッシュへの対応である（&amp;lt;code&amp;gt;wt &amp;amp;#45;d &amp;amp;quot;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;は通らないので一見ダメそうだが、なぜかこれで動く。原因不明。）。&lt;br /&gt;
&lt;br /&gt;
batならそのまま以下の通り（黒い画面が一瞬出てしまう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
別解としてパイプを使わないものも載せておこう。cmdでは特殊文字ではないので&amp;lt;code&amp;gt;&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;に変えるのは簡単である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$args&amp;amp;#91;0&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;&amp;amp;#39;%CD&amp;amp;#58;&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下もうまくいく。cmdの&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に関する仕様により、例えばStart&amp;amp;#45;Processの直前に&amp;lt;code&amp;gt;echo &amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59;&amp;lt;/code&amp;gt;のような&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を奇数個含む文字列を入れると動かなくなる。argsを使うとバッククォートがうまくいかなかったのでMyInvocationを使ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl&amp;amp;#61;$MyInvocation.Line.Split(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%CD%\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
UNC非対応でよく、かつ（&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;をカレントディレクトリとして起動できる）pwshでよければ、上記のcmdをpwshに変えればよい。powershellならSet&amp;amp;#45;Locationで移動が必要。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UNC対応なら、管理者でないときと同じで、PSReadLineのエラーを回避するためpwshを一貫して使うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellならpiperunを使う。カレントディレクトリの取得にpwshを使っているがprintcdでもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;FilePath wt &amp;amp;#45;ArgumentList powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
shなら以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$( pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, \(\&amp;amp;quot;&amp;amp;#39;\\\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;$WD&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\\\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash ====&lt;br /&gt;
&lt;br /&gt;
runotherとpiperunで以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd || printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;をもっと手前で設定して、&amp;lt;code&amp;gt;&amp;amp;#45;ArgumentList&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を指定して、最後を&amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;にしてもよい。&lt;br /&gt;
&lt;br /&gt;
piperunを使わずにshで頑張ることもできるが、エスケープが多く読みづらくなる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd | printf %q $(/bin/cat) | /bin/sed \&amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g\&amp;amp;quot; | /bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;\&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe\&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, \&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinも同様。&lt;br /&gt;
&lt;br /&gt;
== 関連 ==&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9 コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/tmiki/items/0dab4fd17e9bed04ed91 【Windows】GitBashをcontext menuからAdministrator権限付きで実行する &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://note.com/redpeak/n/n5ddc3673117b エクスプローラーから管理者権限でコマンドプロンプトを開く方法｜ひるあんどん]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=352</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=352"/>
		<updated>2025-09-01T01:31:47Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。ドメイン→IPを決め打ちする場合は多くのソフトウェアでできそうだが、任意ドメインに対してDNSで解決しつつ振り分けるのは対応していない場合もある。gostはこれにも対応している。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;は対応しているが、ngx_stream_ssl_preread_moduleとかが必要なので、環境によっては動かしづらいかもしれない。&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;は自分が試した限りでは動かせなかった。これらの汎用のプロキシサーバーの他に、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* Nginxでの使用例（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]とか[https://turgenev.hatenablog.com/entry/2025/04/27/215220 【広告ブロックDNS】特定ドメインへのTCP接続を途中で切断してAd-Shield対策 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDP（ただし筆者が念頭に置いているのはAssociateのみで、Bindに関してはほぼ調べていない）に対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
* このツールでは、DNSリクエストを解釈してサーバー側（サーバー側から見えている外部のDNSを指定してもよい）で解決を行う機能も実装してある。この機能は”fake dns”と名付けているが、shadowsocks&amp;amp;#45;rustのfake dnsやtun2proxyのvirtual dnsはこれとは異なる機能のようである。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、現在もメンテされているgo製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。VPNと同等の動作で、基本的には管理者権限（Linuxの場合、最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
以下のいずれも、ドメイン解決にはプロキシが適用されない（Linux向けの2つはできなくはないかもしれないが、しづらい）ことに注意。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
上記と似ているが、VPNとして動作するもの。プロセスが特定しづらい場合・特定のIPアドレス範囲だけで十分な場合などに効果を発揮する。&lt;br /&gt;
&lt;br /&gt;
以下は特筆しない限りUDP Associateに対応。もちろん、pingなどは通らない。&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;localhostlanなどへのアクセス制限&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== localhost・LANなどへのアクセス制限 ==&lt;br /&gt;
&lt;br /&gt;
典型的な設定例として、localhostやプライベートIPへのアクセスを制限する設定をSquid・Dante・3proxyそれぞれに関して紹介しておく。&lt;br /&gt;
&lt;br /&gt;
プロキシ側で設定せず、cgroupなどを使ってファイアウォール側で制御する方法もある。&lt;br /&gt;
&lt;br /&gt;
==== squid ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;to_localhost&amp;lt;/code&amp;gt;はbuilt&amp;amp;#45;inとして定義されていて、&amp;lt;code&amp;gt;localnet&amp;lt;/code&amp;gt;（&amp;amp;#61;srcがlocalnet）についてもUbuntuパッケージで提供されるsquid.confには入っているのだが、localnetがdstであるものとなるとACLが定義されていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;deny to_localhost&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;deny to_linklocal&amp;lt;/code&amp;gt;は定義済みという前提で、以下のように書くとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;acl to_localnet dst 0.0.0.1-0.255.255.255&lt;br /&gt;
acl to_localnet dst 10.0.0.0/8&lt;br /&gt;
acl to_localnet dst 100.64.0.0/10&lt;br /&gt;
acl to_localnet dst 172.16.0.0/12&lt;br /&gt;
acl to_localnet dst 192.168.0.0/16&lt;br /&gt;
acl to_localnet dst fc00::/7&lt;br /&gt;
&lt;br /&gt;
http_access deny to_localnet&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;deny * * 127.0.0.0/8,0.0.0.1-0.255.255.255,10.0.0.0/8,100.64.0.0/10,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16 * * * *&lt;br /&gt;
allow *&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dante ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。squid・3proxyの場合と違って0.0.0.0もblockしてしまっているが、そもそも使わないので問題ないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;client pass {&lt;br /&gt;
  from: 0/0  to: 0/0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 127.0.0.0/8 # localhost&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/8 # RFC 1122 &amp;quot;this&amp;quot; network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 10.0.0.0/8        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 100.64.0.0/10     # RFC 6598 shared address space (CGN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 169.254.0.0/16    # RFC 3927 link-local (directly plugged) machines&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 172.16.0.0/12     # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 192.168.0.0/16        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks pass {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/0&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;natが介在する場合などのudp-associateの動作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== NATが介在する場合などのUDP Associateの動作 ====&lt;br /&gt;
&lt;br /&gt;
OpenSSHの項目でも関連することを述べたが、UDP&amp;amp;#45;over&amp;amp;#45;TCPの性能劣化を避けるため、UDP Associateは「サーバー側がクライアント側に対してUDP通信で使うための中継ポートを通知する」という動作を伴う。この際、ネットワーク上でクライアント側からサーバーが直接見えていればよいが、NATを介している場合、クライアントから見たときのサーバーのIPとサーバー自身から見たときのサーバーのIP（中継ポート通知に含まれるのはこれ）が異なることがあり、通信が成立しなくなってしまう（SSHのポート転送を普通に使うだけではUDP Associateが使えないのも直接にはこれが原因）。&lt;br /&gt;
&lt;br /&gt;
ただし、[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]にも書いた通り、Proxifyreやhev&amp;amp;#45;socks5&amp;amp;#45;tproxyなどは中継ポート通知のIP部分を無視するため、ポート番号が変わらないNATであれば問題なく動作する（redsocksはダメ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
透過SOCKSプロキシの場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]）（さらに、繰り返しになるが付け加えておくと、普通にセットアップした場合はDNSにプロキシは使われない）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 https://github.com/FelisCatus/SwitchyOmega/issues/1379]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる（これは[https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ FAQ]にも書いてある）一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことが多くなるだろう。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
&lt;br /&gt;
== その他の話題 ==&lt;br /&gt;
&lt;br /&gt;
==== ドメインごとにプロキシを変更できるブラウザ拡張のiframeにおける動作 ====&lt;br /&gt;
&lt;br /&gt;
FoxyProxyやSwitchyOmega(ZeroOmega)など、ドメインごとに自動でプロキシを切り替えてくれるブラウザ拡張はChromium系にもFirefoxにもいくつかあるが、これらはあくまでコンテンツのオリジンを元にプロキシを適用しており、ブラウザのタブを見ているわけではない。つまり、foo.comのページを開いていて、そこにbar.comのコンテンツがiframeで埋め込まれている場合、iframeの内部は、bar.comに対して使用するものと指定されたプロキシを使用して処理される。&lt;br /&gt;
&lt;br /&gt;
一応、[https://superuser.com/questions/250172/disable-enable-the-proxy-on-a-tab-by-tab-basis-in-firefox Disable/enable the proxy on a tab by tab basis in Firefox]によると、Firefoxのcontainer&amp;amp;#45;proxyというのがこれに近い機能を実質的に実現してくれるらしい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E%E6%94%AF%E6%8F%B4%E7%B3%BBLean&amp;diff=351</id>
		<title>定理証明支援系Lean</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E%E6%94%AF%E6%8F%B4%E7%B3%BBLean&amp;diff=351"/>
		<updated>2025-09-01T01:31:44Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Leanは、比較的新しい定理証明支援系（Lean以外にはCoqやIsabelleなどがある）である。&lt;br /&gt;
&lt;br /&gt;
== 概要 ==&lt;br /&gt;
&lt;br /&gt;
学術研究用なのもあって特にメジャーバージョンアップでは大きな破壊的変化がある。&lt;br /&gt;
&lt;br /&gt;
Lean2以前はよく調べていないがLean2にはHoTTサポートがあって3で無くなったらしい。3→4ではマクロシステムが刷新されたり、Leanの処理系のうちLean自体で書かれた部分がさらに増えたり？した。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean3 ===&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/ 公式]（githubでの名前はleanprover）と、[https://leanprover-community.github.io/ 半分公式みたいなコミュニティ]（githubでの名前はleanprover&amp;amp;#45;community）があって、公式では3.4.2まででアーカイブされているLean3もコミュニティversionでは3.47.0くらいになっている。また様々な分野の証明を集めたライブラリの[https://github.com/leanprover-community/mathlib mathlib]もコミュニティの成果物である。&lt;br /&gt;
&lt;br /&gt;
もうほとんど使われていないだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean4 ===&lt;br /&gt;
&lt;br /&gt;
Lean4は現在のところ「公式」のみで扱われている。手元では、WindowsとMacではしばらく動かなかったが、2022年9月中旬頃にelanが1.4.2になったタイミングで動くようになった。しかしVSCode拡張は大文字/小文字の区別をうまく扱えずGo to definitionが失敗する（大文字/小文字の区別があるファイルシステムではおそらく問題なし？？）。既知のバグ。 や など。&lt;br /&gt;
&lt;br /&gt;
VSCodeでの体感でもチェッカがLean3より明らかに速くなった。&lt;br /&gt;
&lt;br /&gt;
== 学習用リソース ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lean3 ====&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/learn.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/learn.html]にリストされている。&lt;br /&gt;
&lt;br /&gt;
最も基本的な使い方の解説が[https://leanprover.github.io/theorem_proving_in_lean/ Theorem Proving in Lean]であり、Leanを使って定理証明をする方法の概略が掲載されている。とりあえずはこれを読んでいけばいい。比較的よくまとまった資料であるが、Curry&amp;amp;#45;Howard同型についてなど、型理論や証明論の事前知識が多少はないと読むのはやや大変かもしれない。そのあたりの知識から解説しているものもいちおう上記の一覧にある。&lt;br /&gt;
&lt;br /&gt;
各tacticの動作など、辞書的な説明は[https://leanprover.github.io/reference/ reference manual]に載っている場合もあるが、こちらは未完成である。&lt;br /&gt;
&lt;br /&gt;
Programming in leanというのもあるが、これも少なくとも最近はあまりメンテナンスされていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Programming in leanに関する詳細&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これまた未完成ではあるが[https://avigad.github.io/programming_in_lean/index.html Programming in Lean — Programming in Lean 3.4.2 documentation]を見ると説明が載っているかもしれない。programming in leanで検索すると、&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/programming_in_lean/programming_in_lean.pdf https&amp;amp;#58;//leanprover.github.io/programming_in_lean/programming_in_lean.pdf]&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/programming_in_lean/ https&amp;amp;#58;//leanprover.github.io/programming_in_lean/]&lt;br /&gt;
&lt;br /&gt;
（この2つは同じ内容）&lt;br /&gt;
&lt;br /&gt;
も出てくるが、こちらはリポジトリ([https://github.com/avigad/programming_in_lean avigad/programming_in_lean])と比較すると古いバージョンのようである（リポジトリの”old”フォルダの内容に対応している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lean4 ====&lt;br /&gt;
&lt;br /&gt;
前述の各資料に対応して[https://leanprover.github.io/theorem_proving_in_lean4/title_page.html https&amp;amp;#58;//leanprover.github.io/theorem_proving_in_lean4/title_page.html]と[https://leanprover.github.io/lean4/doc/ https&amp;amp;#58;//leanprover.github.io/lean4/doc/]と[https://leanprover.github.io/functional_programming_in_lean/ Functional Programming in Lean]がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;publications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Publications ==&lt;br /&gt;
&lt;br /&gt;
関連論文など&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/publications/ https&amp;amp;#58;//leanprover.github.io/publications/]&lt;br /&gt;
&lt;br /&gt;
== 日本語情報 ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2020/11/25/095208 定理証明支援系Leanのインストールと初期設定（Linux）]（自分で書いたが、古いのでもう読まなくていい）&lt;br /&gt;
&lt;br /&gt;
[https://manau.jp/lean/leaninstall/ 定理証明支援系 LEAN のインストール]&lt;br /&gt;
&lt;br /&gt;
[http://myuon-myon.hatenablog.com/entry/2016/01/09/212750 Theorem Prover Leanの紹介 &amp;amp;#45; Just $ A sandbox]&lt;br /&gt;
&lt;br /&gt;
[https://myuon.github.io/posts/start-learning-proof-assistant/ 定理証明リンク集]&lt;br /&gt;
&lt;br /&gt;
くらい。あんまりないが、順調にいけば今後増えていきそうではある。&lt;br /&gt;
&lt;br /&gt;
* 2025/6追記 最近はもっと増えてそう&lt;br /&gt;
&lt;br /&gt;
== metaprogramming関連 ==&lt;br /&gt;
&lt;br /&gt;
Leanの証明記述用言語（tactic）は、Leanそれ自体の上で実装されている。バージョン3→4によってさらにその傾向が強まりそうである。&lt;br /&gt;
&lt;br /&gt;
tacticはmonadicな関数として実装されている。tacticをmonadで表現するというのはCoq用のMtac&amp;amp;#91;^ziliani2013Mtac&amp;amp;#93;などでも採用された手法である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3での例&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean3での例 ===&lt;br /&gt;
&lt;br /&gt;
筆者は研究活動の一環として、Lean 3のソースコード上に構造的に関連付けられた形でコメントを書けるようにするライブラリであるNtac（[https://github.com/ge9/ntac https://github.com/ge9/ntac]）を公開している。これはLean 3のmetaprogrammingを活かした例である。&lt;br /&gt;
&lt;br /&gt;
metaprogrammingについてはコミュニティのLearning resourcesの”Metaprogramming and tactic writing”の項目や[https://leanprover.github.io/papers/tactic.pdf https&amp;amp;#58;//leanprover.github.io/papers/tactic.pdf]を参考にした。また、独自のtacticシステムを作成するためのガイドとして、[https://leanprover-community.github.io/archive/stream/113488-general/topic/no.20lean.20messages.20output.20in.20hacked.20mode.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/archive/stream/113488&amp;amp;#45;general/topic/no.20lean.20messages.20output.20in.20hacked.20mode.html]に実装上のヒントを得た。&lt;br /&gt;
&lt;br /&gt;
* 基本的には、&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;という名前でStateモナドが定義されていて、各tacticはこのモナド値を返す関数として定義されている。しかし&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;は&amp;lt;strong&amp;gt;現在の状態&amp;lt;/strong&amp;gt;しか持っておらず、コメントを紐づけたりするには証明の&amp;lt;strong&amp;gt;過程まで含めた全体の構造&amp;lt;/strong&amp;gt;が欲しい。そこでntacでは、&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;の定義を変更して証明の「履歴」を木構造として保持するようにした&amp;lt;code&amp;gt;ntac&amp;lt;/code&amp;gt;というモナドを定義し、既存のtacticを（適切な）&amp;lt;code&amp;gt;ntac&amp;lt;/code&amp;gt;モナド値を持つような定義に変更した。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean4 ===&lt;br /&gt;
&lt;br /&gt;
Schemeを参考に、強力な衛生的（hygienic）マクロシステムが実装された。柔軟なNotationの定義ができるようになる。論文としては&amp;amp;#91;^ullrich2020Notations&amp;amp;#93;に詳しく書いてある。&lt;br /&gt;
&lt;br /&gt;
上記「ntac」のLean4版は現在開発中。構文解析中に外部のプログラムを呼び出すなど、なんでもできて面白い。&lt;br /&gt;
&lt;br /&gt;
==== 例 ====&lt;br /&gt;
&lt;br /&gt;
* replしてる例らしい [https://github.com/leanprover-community/repl https://github.com/leanprover-community/repl]&lt;br /&gt;
&lt;br /&gt;
==== tacticの移行とか ====&lt;br /&gt;
&lt;br /&gt;
Lean3までの証明（のうちtacticで書かれたもの）をLean4に移植する方法について。&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Tactic.20porting.20assignments/near/296694161 https&amp;amp;#58;//leanprover.zulipchat.com/&amp;amp;#35;narrow/stream/287929&amp;amp;#45;mathlib4/topic/Tactic.20porting.20assignments/near/296694161]&lt;br /&gt;
&lt;br /&gt;
* とりあえず [[error_private_page|error_private_page]]  で基礎知識を得るのがよさそう？&lt;br /&gt;
&lt;br /&gt;
== elan ==&lt;br /&gt;
&lt;br /&gt;
* leanを管理（各バージョンのインストール/アンインストールなど）するためのツール&lt;br /&gt;
* 適当にフォルダだけ消すとtoolchainの再インストールで引っ掛かるので、update&amp;amp;#45;hashesも消すとよいかも&lt;br /&gt;
* rustupのforkらしい [https://zenn.dev/labbase/articles/b24dca38e0420d 関数型言語”兼”定理証明支援系Leanの環境構築]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Lean3 ==&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/get_started.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/get_started.html] を読む。elanってやつが入れば大丈夫で、mathlib&amp;amp;#45;toolsとかleanprojectは（今はもう案内ないか？）無視でいい（後述）&lt;br /&gt;
&lt;br /&gt;
=== パッケージ ===&lt;br /&gt;
&lt;br /&gt;
Leanでの開発はまずパッケージを作るところから始まる。&lt;br /&gt;
&lt;br /&gt;
leanpkg.tomlっていうメインの管理ファイルがあって、ここにLeanのバージョンとかを指定しておくと、無ければ（VS Codeでフォルダ開くタイミングとかで）自動でelanが取ってきてくれる&lt;br /&gt;
&lt;br /&gt;
* 特定パッケージと、そのパッケージに依存するパッケージの双方を依存関係として指定したとして、バージョンの齟齬があったら何が起きるのかは不明である。ちなみにLean4の話だが、mathlib4に関しては[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4]に「If your project depends on &amp;lt;code&amp;gt;std4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;quote4&amp;lt;/code&amp;gt;, let &amp;lt;code&amp;gt;mathlib4&amp;lt;/code&amp;gt; pull them transitively. That is, don&amp;amp;#39;t &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; them on your &amp;lt;code&amp;gt;lakefile.lean&amp;lt;/code&amp;gt;」と明記されている。&lt;br /&gt;
&lt;br /&gt;
=== mathlib ===&lt;br /&gt;
&lt;br /&gt;
パッケージの一つ。半分標準のライブラリみたいなもの。数学の定理やリスト処理のプログラムなど、色々なものが形式化されている。文字列処理とかの便利関数も入ってるのでとりあえず入れて損はない&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/mathlib-overview.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/mathlib&amp;amp;#45;overview.html]&lt;br /&gt;
&lt;br /&gt;
=== mathlibの指定 ===&lt;br /&gt;
&lt;br /&gt;
leanpkg.tomlで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;mathlib = {git = &amp;quot;https://github.com/leanprover-community/mathlib&amp;quot;, rev = &amp;quot;lean-3.49.1&amp;quot;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のように指定しておくと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;leanpkg upgrade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
でlean&amp;amp;#45;3.49.1ブランチを取ってきてくれる。masterブランチ指定とかするとバージョンアップで互換性がなくなって困るのでこれがおすすめ。&lt;br /&gt;
&lt;br /&gt;
=== mathlib&amp;amp;#45;toolsとleanprojectについて ===&lt;br /&gt;
&lt;br /&gt;
* 基本Lean3用なのでもう使われないかも&lt;br /&gt;
&lt;br /&gt;
leanprojectは[https://github.com/leanprover-community/mathlib-tools mathlib&amp;amp;#45;tools]の一部で、mathlibをうまく扱うのが目的っぽい。&amp;lt;code&amp;gt;python3 &amp;amp;#45;m pip install mathlibtools&amp;lt;/code&amp;gt;で入る&lt;br /&gt;
&lt;br /&gt;
prebuiltされた（ちなみに自前でビルドすると数時間かかる）mathlibを&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://oleanstorage.azureedge.net/mathlib/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.tar.xz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
（xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxはコミットID）からダウンロードして、oleanにtouchして最新版にしてくれるが、&amp;lt;strong&amp;gt;それだけの機能しかなく、動作もあまり分かりやすくない&amp;lt;/strong&amp;gt;。しかもよくわからんが、Lean4には未対応っぽい（というか、mathlibというのはLean3のパッケージの名前なのでそれはそうか（Lean4用のmathlibはmathlib4））。このまま使われなくなりそう。&lt;br /&gt;
&lt;br /&gt;
そこで、自分でそれをやるスクリプトを書いてpathに登録した。これで十分と感じる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;javascript&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if ! cd ../../../_target/deps/mathlib ;then&lt;br /&gt;
echo &amp;quot;must be run in &#039;mathlib&#039; folders.  exiting.&amp;quot;; exit&lt;br /&gt;
fi&lt;br /&gt;
find src -name &amp;quot;*.olean&amp;quot; | xargs rm&lt;br /&gt;
curl -o olean.tar.xz https://oleanstorage.azureedge.net/mathlib/`cat .git/HEAD`.tar.xz&lt;br /&gt;
#touch all .olean (this is also done by leanproject in mathlib-tools)&lt;br /&gt;
find src -name &amp;quot;*.olean&amp;quot; | xargs touch&lt;br /&gt;
if tar xvf olean.tar.xz ; then&lt;br /&gt;
rm -f olean.tar.xz&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;new-oleans.sh&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Lean4 ==&lt;br /&gt;
&lt;br /&gt;
=== 初期設定 ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/leanprover/elan elan]をまず入れてそれからLeanを、ってのがv3以前のやり方だったと思うが[https://leanprover.github.io/lean4/doc/quickstart.html Setting Up Lean &amp;amp;#45; Lean Manual]によるとどうやらv4はVS Code拡張経由で入れられるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;パッケージlake&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== パッケージ(lake) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;lake new パッケージ名（パッケージ名と同じ名前のフォルダが作成され、その中にパッケージができる）&amp;lt;/code&amp;gt;、または&amp;lt;code&amp;gt;lake init パッケージ名（パッケージはカレントディレクトリに作成される）&amp;lt;/code&amp;gt;を実行。詳しいやり方は[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4] とか。&lt;br /&gt;
&lt;br /&gt;
lakeのドキュメントはここ [https://github.com/leanprover/lean4/tree/master/src/lake https&amp;amp;#58;//github.com/leanprover/lean4/tree/master/src/lake]&lt;br /&gt;
&lt;br /&gt;
dependencyの書き方は [https://github.com/leanprover-community/mathlib4/blob/master/lakefile.lean https&amp;amp;#58;//github.com/leanprover&amp;amp;#45;community/mathlib4/blob/master/lakefile.lean] とかを参考に。stdのURLがここにある。&lt;br /&gt;
&lt;br /&gt;
=== mathlib4 ===&lt;br /&gt;
&lt;br /&gt;
prebuiltされたものの提供はないっぽい。[https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/.E2.9C.94.20use.20prebuilt.20release.3F https&amp;amp;#58;//leanprover.zulipchat.com/&amp;amp;#35;narrow/stream/287929&amp;amp;#45;mathlib4/topic/.E2.9C.94.20use.20prebuilt.20release.3F]&lt;br /&gt;
&lt;br /&gt;
* いや、[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4]を読むと、&amp;lt;code&amp;gt;lake exe cache get&amp;lt;/code&amp;gt;で取ってこれるように最近なった？&lt;br /&gt;
&lt;br /&gt;
そのかわりlake build Mathlibと打てば（lean3のmathlibに比べて）割とすぐにビルドが終わる（5分前後？）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;require ml4 from git &amp;quot;https://github.com/leanprover-community/mathlib4&amp;quot; @ &amp;quot;master&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
↑依存パッケージとしてはこういうふうに書くが、lake build ml4ではなくlake build Mathlibが正しいっぽい。&lt;br /&gt;
&lt;br /&gt;
* そもそも、require ml4じゃなくてrequire &amp;lt;strong&amp;gt;mathlib&amp;lt;/strong&amp;gt;と必ず書かなきゃいけない説もある&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=350</id>
		<title>Windowsの右クリックメニューから複数ファイルをまとめて開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=350"/>
		<updated>2025-06-30T09:02:50Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;複数のファイルを別々にではなく&amp;lt;strong&amp;gt;一度にまとめて&amp;lt;/strong&amp;gt;開きたいということがある。すなわち”app.exe file1” “app.exe file2”…をそれぞれ実行するのではなく、”app.exe file1 file2 …”を実行したい。例えば複数の音楽ファイルを連続再生したいときなどである。&lt;br /&gt;
&lt;br /&gt;
ただ、エクスプローラ上で複数ファイルを選択して開く（右クリックで「開く」を選ぶorエンターキー）と、別々に実行されてしまう。では、右クリックメニューからこれを実行するにはどうすればいいか？というのがこの記事のテーマである。&lt;br /&gt;
&lt;br /&gt;
ついでに、パス長さ制限を超えるファイルやフォルダにおける機能制限も解決する。  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows10以前の右クリックメニューに戻す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windows10以前の右クリックメニューに戻す ==&lt;br /&gt;
&lt;br /&gt;
まず、Windows11に移行すると右クリックメニューの項目数が大幅に削られており、とても使いにくいので、Windows10までの仕様に戻す必要がある。[https://pc-karuma.net/right-click-context-menu-back-on-windows-11 Windows 11 &amp;amp;#45; 右クリックメニューを旧仕様に戻す方法 &amp;amp;#45; PC設定のカルマ]などに従って修正しよう。コマンド例は以下。これはユーザーごとの設定なので、&amp;lt;strong&amp;gt;管理者権限は不要&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&amp;quot; /f /ve&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ファイルを開く操作ならダブルクリックでできるわけで、それでもあえてファイルを右クリックするユーザーの層を考えれば、使用頻度の高いメニューに絞る必要がないことは明らかである。右クリックメニューは動作が重いという問題点も指摘されてきたが、それなら項目数を削る以外の方法でパフォーマンスを改善するのが筋だろう。そもそも、Windows 11の右クリックメニューもそれほど快適な動作ではない。&lt;br /&gt;
&lt;br /&gt;
なおバージョン22H2からはShift+右クリックで旧仕様のメニューが出るようになったようなので、それで十分という人は設定しなくてもよい。&lt;br /&gt;
&lt;br /&gt;
ちなみにこれ以降も同じだが、&amp;lt;code&amp;gt;HKEY_CURRENT_USER&amp;lt;/code&amp;gt;以下はユーザー別設定なのでPC自体の再起動をしなくてもログアウト（サインアウト）→ログイン（サインイン）で全て反映されるはず。また今回の例に関しては、実際にはexplorerの再起動で十分である。&lt;br /&gt;
&lt;br /&gt;
=== 動画の右クリックメニューの順番がおかしい ===&lt;br /&gt;
&lt;br /&gt;
動画ファイル（mp4やmkvなど）に関して、右クリックメニューの順番がおかしくなるという問題がある。具体的には、全ファイル共通のメニュー（「お気に入りに追加」など）とClipchampのメニューが普通の「開く」よりも上に表示されてしまう。また単一ファイル選択時だと（関連付けがすでに設定されているにもかかわらず）「プログラムから開く」が太字になってしまっている。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはどうやらClipchampのメニューが悪いらしく、[https://www.elevenforum.com/t/add-or-remove-edit-with-clipchamp-context-menu-in-windows-11.6882/ Add or Remove Edit with Clipchamp Context Menu in Windows 11 Tutorial | Windows 11 Forum]（[https://www.elevenforum.com/t/clipchamp-context-menu-removal.6150/ Clipchamp context menu removal | Windows 11 Forum]に書いてあった）や[https://www.naporitansushi.com/clipchamp-context-menu-disable/# Windowsの右クリックの「Clipchampで編集」を削除する方法 | ナポリタン寿司のPC日記]に書いてある通り、Clipchampのメニューを非表示にすると治る。コマンド例は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked&amp;quot; /v {8AB635F8-9A67-4698-AB99-784AD929F3B4} /f&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* HKLMでも設定できる。また、「デバイス キャスト」を非表示にする場合はUUIDを&amp;lt;code&amp;gt;&amp;amp;#123;7AD84985&amp;amp;#45;87B4&amp;amp;#45;4a16&amp;amp;#45;BE58&amp;amp;#45;8B72A5B390F7&amp;amp;#125;&amp;lt;/code&amp;gt;に変える。&lt;br /&gt;
&lt;br /&gt;
Clipchampを表示したまま順番を治す方法は不明だが、自分でメニューを作ればできるかもしれない。Clipchampのメニューの実装に使われていると思われるIContextMenuについては後でも述べているのでそちらも参照。おそらくClipchampによるこのインターフェースの実装にバグがあるためにこのような挙動をしているのであろう。&lt;br /&gt;
&lt;br /&gt;
以下に修正後の正しい表示を載せておく。いずれの例でも関連づけはデフォルトのメディア プレイヤーが使われているものと仮定している（書いていて気付いたが、同一アプリにもかかわらず「プレーヤー」「プレイヤー」の表記ゆれがある）。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 不完全な解決策 ==&lt;br /&gt;
&lt;br /&gt;
本題に入る。まずは、不完全ではあるがそこそこ簡単な解決策を紹介する。それは右クリックメニューにある「送る」を使う方法である。エクスプローラのアドレスバーに&amp;lt;code&amp;gt;shell&amp;amp;#58;sendto&amp;lt;/code&amp;gt;と入力すると「送る」メニューの元になっているフォルダを開くことができる。ここにショートカットやファイルを追加しておけば、それが右クリックメニューに表示され、選択されたファイルをまとめてコマンド引数として渡してくれる。ショートカットを編集すればオプションも渡せる（あるいはバッチファイルを突っ込んでもよい）。&lt;br /&gt;
&lt;br /&gt;
* 今後紹介する方法にも共通するが、ファイルの順番としては、メインとして選択されたもの（右クリックされたもの）から下方向に進んでいき、下端まで達したら一番上に戻ってそれから選択されたものの直前まで進む。例えばファイルが”0”から”9”までの10個あるフォルダで全選択をして”5”を右クリックして「送る」を使うと、5 6 7 8 9 0 1 2 3 4の順番で渡される。&lt;br /&gt;
&lt;br /&gt;
しかしこの「送る」には弱点があり、&amp;amp;#91;ref&amp;amp;#93;で紹介したように、この「送る」メニューは260文字の長さ制限を超えるパスをもつファイルに対してはうまく機能しない。音楽ファイルなんかはアーティスト名も曲名も色々入って長大な名前になりがちで、実際に自分がこれで困ることになった。&lt;br /&gt;
&lt;br /&gt;
もう一つ、「送る」メニューは拡張子に関連付けられないという問題がある。つまり、音声ファイルを一度に開くためだけのコマンドも、画像ファイルを一度に開くためだけのコマンドも、全てのファイルを対象とした「送る」メニューにまとめて入れざるを得ない。メニュー数が無駄に増えればそれだけ管理・操作もしづらくなる。ついでに言えば、「送る」を一旦クリックしてから中の項目を選ぶ手間もなかなかバカにできないところがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;前提知識-&amp;amp;#45;-メニューを管理するレジストリ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 前提知識 &amp;amp;#45; メニューを管理するレジストリ ==&lt;br /&gt;
&lt;br /&gt;
右クリックメニュー関連の設定はレジストリを使って管理されている。この記事では上記「送る」の問題を解決する方法をこの後で2つ紹介するが、いずれもレジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;という名前のキー（設定内容に応じて色々な所に設置されている）を編集する必要がある。それにあたって、前提知識としてレジストリの内容をある程度理解しておく必要があるだろう。&lt;br /&gt;
&lt;br /&gt;
この話題に関しては比較的多くのサイトで解説があるが、Windowsのバージョンごとにかなり頻繁に仕様が変わっているようで、不十分なサイトも多い。最も優れているのは[https://www.pg-fl.jp/program/winreg/classes.htm Windowsレジストリ解剖記]で、かなり量は多いが、バージョンによる挙動の違いまで細かく示されている。&lt;br /&gt;
&lt;br /&gt;
この記事に必要な操作を行うためには&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の場所だけわかっていればいちおう十分だが、以下の内容くらいは覚えておいたほうがよい。&lt;br /&gt;
&lt;br /&gt;
* HKEY_CURRENT_USERはHKCUと略され、ユーザーごとの設定を管理する。原則、変更はユーザー権限のみで可能。色々いじっても比較的安全。&lt;br /&gt;
* HKEY_LOCAL_MACHINEはHKLMと略され、システム全体（全ユーザー対象）の設定を管理する。変更には管理者権限が必要。設定は慎重に。&lt;br /&gt;
* HKEY_CLASSES_ROOTはHKCRと略され、関連付け専用のもので、&amp;lt;strong&amp;gt;HKCU\Software\ClassesとHKLM\Software\Classesの内容を合わせたものが表示される&amp;lt;/strong&amp;gt;。関連づけの設定を確認するにはここを見るのがいいが、設定を変更する際にはここをいじるとHKLMのほうが変わってしまうことがあるので&amp;lt;strong&amp;gt;HKCU\Software\Classesを変更したほうがよい&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
以下では、設定方法を①ProgIDを使うもの②完全に独自のメニューを追加するもの と大きく二つに分けて記述する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;progidを使うもの&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ProgIDを使うもの ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
特定の拡張子をもつファイルをダブルクリックやEnterで開くときに使われるプログラム、あるいは「既定のプログラム」あるいは「ファイルを開くプログラムの選択」のようなダイアログが表示されるときに表示されるプログラムは、この&amp;lt;strong&amp;gt;ProgID&amp;lt;/strong&amp;gt;を用いて管理されている。この方法のメリットは、何より「ダブルクリックまたはEnterキー一発で起動できる」という操作性である。また、Windows11以前のメニューに戻さなくても使いやすい。&lt;br /&gt;
&lt;br /&gt;
* 複数選択した際は「送る」と同様の順番で渡されるが、右クリックをしない場合は”メインとして選択されたファイル”がどれであるかが若干分かりづらい。基本的には最後に（左）クリックされたものになるはずで、よく見るとそれだけ少し太い（濃い）枠で表示されていることがわかる。なので音楽再生時など複数ファイルを上のものから順にすべて渡したいときは、「&amp;lt;strong&amp;gt;先に一番下にあるファイルをクリックしてから、一番上にあるファイルをShift+ダブルクリック（あるいはShift+クリックしたあとEnter）する&amp;lt;/strong&amp;gt;」というのが有効である。&lt;br /&gt;
&lt;br /&gt;
一方で、設定のしくみはやや煩雑である。具体的には、拡張子.xxxに対して&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xxx\UserChoice&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
というキーがあって、ここの&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;の値を&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;としたときの&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value\shell\open\command&amp;lt;/code&amp;gt;の内容に従ってアプリケーションが起動される。&lt;br /&gt;
&lt;br /&gt;
Windows10以降では&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するためには普通の管理者権限やSYSTEMよりもさらに上位のTrustedInstaller権限が必要である。AdvancedRunなどを使ってTrustedInstaller権限で変更することは一応できたが、ハッシュ値の生成までちゃんとやっていないので自動で修正されてしまった（ここが解決できるかどうかは未調査）。従って、任意のコマンドを設定したい際は、まず&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するところだけエクスプローラーのダイアログを使い、その後で&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value&amp;lt;/code&amp;gt;の中身を好きに変えるほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
例えば新たなメニューを追加したい場合なら、以下のようにするとよい。&lt;br /&gt;
&lt;br /&gt;
* 今まで使われていない（乱数値など）名前をもつダミーのexeファイル（実行ファイルとして正しく機能する必要はなく、空のファイルでもいいし、拡張子がexeでなくてもよい）を用意する（ここでは&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;とする）&lt;br /&gt;
* 関連付けたい拡張子のファイルの右クリックメニューから「プログラムを開く」を選択し、&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;を選んで関連づける&lt;br /&gt;
** これによりレジストリキー&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe&amp;lt;/code&amp;gt;が作られた上で&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;Applications\dummy.exe&amp;lt;/code&amp;gt;が書き込まれる&lt;br /&gt;
* &amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe\shell\open&amp;lt;/code&amp;gt;の中身を自由に変更する。&lt;br /&gt;
&lt;br /&gt;
=== 完全に独自のメニューを実装する ===&lt;br /&gt;
&lt;br /&gt;
これは、「PowerShellをここで開く」「VS Codeで開く」のように完全に独自の右クリックメニューを追加するものである。設定は意外と簡単である。また、フォルダに対する右クリックメニューや全ファイルに共通の右クリックメニューを追加するにはこの方法しかない。ただし、Windows10以前のメニューに戻さないと「その他のオプション」を押す手間がかかるので注意。&lt;br /&gt;
&lt;br /&gt;
拡張子ごとの設定は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations&amp;lt;/code&amp;gt;にある（編集時は&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;を使うのがいいだろう）（比較的新しいWindowsだと&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;キー自体が存在しないことがあるが、自分で作ればちゃんと動作する）。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーは&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations\.xxx\shell\yourcommandname\command&amp;lt;/code&amp;gt;のような場所に作られることになる。&lt;br /&gt;
&lt;br /&gt;
また、全てのファイルを対象にするメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\&amp;amp;#42;&amp;lt;/code&amp;gt;、フォルダを右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory&amp;lt;/code&amp;gt;、ドライブ（C&amp;amp;#58;\など）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Drive&amp;lt;/code&amp;gt;、フォルダ（・ドライブ）の背景（何もないところ）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory\Background&amp;lt;/code&amp;gt;以下でそれぞれ管理されている。また、&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\AllFilesystemObjects&amp;lt;/code&amp;gt;というのもあり、これはディレクトリとファイルの両方に適用される（ドライブやフォルダ背景には影響なし）。&lt;br /&gt;
&lt;br /&gt;
* 一覧は[https://learn.microsoft.com/ja-jp/windows/win32/shell/reg-shell-exts ここ]かな？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;複数種類に一括で追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 複数種類に一括で追加？ ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;という値があり、これに&amp;lt;code&amp;gt;video&amp;lt;/code&amp;gt;などと指定されている場合は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\video&amp;lt;/code&amp;gt;にある設定が反映される（これによって複数種類のファイルに共通するメニューが作れる）…というような情報もあったのだが、手元のWindows 11では全く反映されなかった。&lt;br /&gt;
&lt;br /&gt;
そもそも&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;に複数種類が指定できるか不明だったりと色々と意義が怪しいので諦めて各拡張子ごとに追加するのがよいのではないかと思う。CLSIDの部分は共通化されているわけなのでそれほど非効率な二重管理ということにもならないだろう。（そもそもこの辺のWindowsの仕様はころころ変わるっぽいのであまり頑張ってもしょうがないかも？）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;directorybackgroundの表示&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Directory\Backgroundの表示 ===&lt;br /&gt;
&lt;br /&gt;
エクスプローラーの左側のエリアにあるフォルダやドライブを右クリックしたときのメニューには、なぜかDirectory\Backgroundの内容も表示されてしまう。そのうえ、これらには正しくパラメータが渡されない（commandに直接書くときは&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;などが入っていると起動せず、COM使用（少なくともDelegateExecute）で受け取る方法も不明）。&lt;br /&gt;
&lt;br /&gt;
ただ、DirectoryやDriveに同名のメニューが登録されている場合はそちらが優先される。しかし、これを利用してメニューを非表示にすることはできない。（DirectoryやDriveのほうにLegacyDisableを書いたら、そもそもそちらが無かったのと同じになるっぽい）&lt;br /&gt;
&lt;br /&gt;
実際には、Directory\Backgroundに設定するメニューはDirectoryにもDriveにも等しくあったほうがいい場合が多いと思うので、そのように設定するとよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== その他設定項目 ===&lt;br /&gt;
&lt;br /&gt;
本筋とは関係ないので詳細は省くが、その他にもこれらのキーでは様々な設定ができる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;によるアイコンの設定&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;によるキーの設定（「&amp;amp;quot;編集(&amp;lt;u&amp;gt;E&amp;lt;/u&amp;gt;)&amp;amp;quot;のEみたいなやつ」）&lt;br /&gt;
* &amp;lt;code&amp;gt;MUIVerb&amp;lt;/code&amp;gt;（多分、言語設定ごとの表示文字列の切り替えとかができるようになるやつ）&lt;br /&gt;
* &amp;lt;code&amp;gt;AppliesTo&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DefaultAppliesTo&amp;lt;/code&amp;gt;による表示条件の設定&lt;br /&gt;
** AQS書式というのが使用可能で、かなり柔軟な指定ができる（特定フォルダ内のみに表示するなど）。ただしあまり情報がなく、[https://www.pg-fl.jp/program/winreg/classes.htm Windows レジストリ 解剖記]でもそこまで詳細な解説はない。そこからもリンクされている[https://learn.microsoft.com/ja-jp/windows/win32/search/-search-3x-advancedquerysyntax?redirectedfrom=MSDN MSの公式ドキュメント]を読むのが早そう。あと、Backgroundメニューではそもそも背景フォルダに関する情報が全く渡されてこないようで（ただしどこかに書いてあったのではなく実験の結果）、使い物にならない。&lt;br /&gt;
*** Backgroundでは使えなかったという投稿の例&lt;br /&gt;
**** [https://superuser.com/questions/1020415/windows-explorer-context-menu-to-a-especific-folder-background Windows Explorer&amp;amp;#58; Context menu to a especific folder (background) &amp;amp;#45; Super User]&lt;br /&gt;
**** [https://stackoverflow.com/questions/47325736/windows-context-menu-directory-background-appliesto shell &amp;amp;#45; Windows context menu directory\background AppliesTo &amp;amp;#45; Stack Overflow]&lt;br /&gt;
* &amp;lt;code&amp;gt;HasLUAShield&amp;lt;/code&amp;gt;による「管理者アイコン」の表示（&amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;との併用可）&lt;br /&gt;
** これも実は上と同様にAQS書式で管理者アイコンの表示条件を設定できる&lt;br /&gt;
** このアイコン自体はSystem32のimageres.dllとかUserAccountControlSettings.exeとかに入っている&lt;br /&gt;
* &amp;lt;code&amp;gt;SubCommands&amp;lt;/code&amp;gt;によるサブメニューの登録&lt;br /&gt;
** 手元のWindows11で試した限り、&amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Drive&amp;lt;/code&amp;gt;ではうまくいくが&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;だとサブメニューが出ない？&lt;br /&gt;
* &amp;lt;code&amp;gt;ExtendedSubCommandsKey&amp;lt;/code&amp;gt;値による他の&amp;lt;code&amp;gt;shell&amp;lt;/code&amp;gt;キーへの参照によるサブメニューの登録&lt;br /&gt;
** かなり強力で、循環参照も作れる。&lt;br /&gt;
** 例&amp;amp;#58; [http://nonsubject.arinco.org/2011/08/ Nonsubject&amp;amp;#58; 8月 2011]&lt;br /&gt;
** 一つのルートメニューが持てるサブメニュー上限は16個までという制限がある。[https://stackoverflow.com/questions/48625223/is-there-a-maximum-right-click-context-menu-items-limit https&amp;amp;#58;//stackoverflow.com/questions/48625223/is&amp;amp;#45;there&amp;amp;#45;a&amp;amp;#45;maximum&amp;amp;#45;right&amp;amp;#45;click&amp;amp;#45;context&amp;amp;#45;menu&amp;amp;#45;items&amp;amp;#45;limit]&lt;br /&gt;
** これは&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;でも有効。&lt;br /&gt;
* &amp;lt;code&amp;gt;Extended&amp;lt;/code&amp;gt;によってShift+右クリックしたときのみ表示させる&lt;br /&gt;
* 設定例&amp;amp;#58; [https://www.tenforums.com/tutorials/178668-add-remove-open-windows-terminal-administrator-context-menu.html Add or Remove &amp;amp;#39;Open in Windows Terminal as administrator&amp;amp;#39; context menu | Tutorials]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;contextmenuhandlersicontextmenuを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ContextMenuHandlers（IContextMenu）を用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
先ほどのClipchampのメニュー項目などはここまで述べたようにレジストリ内に静的に設定されているものではなくCOM(Component Object Model)を用いて外部のDLLの関数から動的に追加されているものである（ただDLLの指定自体はレジストリ内のInProcServer32のようなキーにあるはず）。Clipchamp以外だと7&amp;amp;#45;ZipやPDF XChange Editorなどのメニューはこれを用いて実装されている。レジストリの&amp;lt;code&amp;gt;XXX\shellex\ContextMenuHandlers&amp;lt;/code&amp;gt;といったキー以下に設定されているものはこれに分類される。&lt;br /&gt;
&lt;br /&gt;
詳しくはIContextMenuなどのキーワードで検索すると出てくる[https://learn.microsoft.com/en-us/windows/win32/shell/shortcut-menu-using-dynamic-verbs Customizing a Shortcut Menu Using Dynamic Verbs &amp;amp;#45; Win32 apps | Microsoft Learn]などを読むとよさそうだが、実装はかなり難解である。Clipchampもこの部分で不適切な実装をしたために順番がおかしくなったのではないかと思われる。&lt;br /&gt;
&lt;br /&gt;
動作確認できたサンプルとしては、[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb]はIContextMenuを使って実装されており、dllをビルドしてCLSIDのInProcServer32でそれを指定するとちゃんと右クリックメニューが追加される。&lt;br /&gt;
&lt;br /&gt;
また、メニューを追加する関数であるQueryContextMenuが呼ばれる時点で、引数となっているファイルの情報がわかる（Initialize関数においてIDataObjectが渡されているのでそれをクラスのフィールドなどとして持っておけばよい）ので、特定の拡張子のファイルのみに対してメニューを表示することもできる。もちろんファイルの内容まで読み取ってからメニューを表示するといったこともできるが、そこまですると右クリックするだけで動作が重くなるといった副作用が大きくなるのでやめた方が無難だろう。ただ、スタートメニューへのピン留め&amp;lt;code&amp;gt;&amp;amp;#123;a2a9545d&amp;amp;#45;a0c2&amp;amp;#45;42b4&amp;amp;#45;9708&amp;amp;#45;a0b2badd77c8&amp;amp;#125;&amp;lt;/code&amp;gt;やPDF XChange Editor(9.3や10.2.1で確認)のメニューは実際にそのような挙動をする（余談だが、InfoTipの表示もexplorerが操作しづらくなる原因なのでshowinfotipを0にしたほうがいい）（サムネイルなどはバックグラウンドで並列に走るので操作にはあまり影響がない）。またエラーが発生した場合はexplorer自体が強制終了することもあり、全体的に実装は慎重に行ったほうがよい。&lt;br /&gt;
&lt;br /&gt;
==== コード例 ====&lt;br /&gt;
&lt;br /&gt;
拡張子が.tで始まるファイル（&amp;amp;#42;.txt, &amp;amp;#42;.ttfなど）のみにメニューを追加するサンプル（から抜粋）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;IFACEMETHODIMP CNonDefaultDropMenuVerb::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT /*idCmdLast*/, UINT /*uFlags*/)&lt;br /&gt;
{&lt;br /&gt;
    FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };&lt;br /&gt;
    STGMEDIUM medium;&lt;br /&gt;
    HRESULT hr = _pdtobj-&amp;gt;GetData(&amp;amp;fmte, &amp;amp;medium);&lt;br /&gt;
    if (SUCCEEDED(hr))&lt;br /&gt;
    {&lt;br /&gt;
        HDROP hdrop = (HDROP)medium.hGlobal;&lt;br /&gt;
        WCHAR szFile[MAX_PATH];&lt;br /&gt;
        DragQueryFile(hdrop, 0, szFile, ARRAYSIZE(szFile));&lt;br /&gt;
        const WCHAR* ext = wcsrchr(szFile, L&#039;.&#039;);&lt;br /&gt;
        ReleaseStgMedium(&amp;amp;medium);&lt;br /&gt;
        if (ext &amp;amp;&amp;amp; *(ext+1) != L&#039;t&#039;) {&lt;br /&gt;
            return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    WCHAR szMenuItem[80];&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKDROP, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKDROP, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKNETRESOURCES, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKNETRESOURCES, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(2));  // indicate that we added 2 verbs.&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 特定の拡張子に対して追加できるのは以下で知った&lt;br /&gt;
** できるという情報&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://stackoverflow.com/questions/43769772/how-to-add-context-menu-to-one-specific-file registry &amp;amp;#45; How to add context menu to one specific File &amp;amp;#45; Stack Overflow]&lt;br /&gt;
** 実際のコード&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/nyfair/freeimagerip/blob/master/plugin/FIShellExt/Thumb.cc freeimagerip/Thumb.cc at master · nyfair/freeimagerip]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icontextmenuの今後について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== IContextMenuの今後について ====&lt;br /&gt;
&lt;br /&gt;
Windowsの右クリックメニューが重いと良く言われるのはこのような高い自由度をもつIContextMenuに起因するものであると思われる。Windows11ではIContextMenuよりIExplorerCommandがよいというのを見かけた（[https://twitter.com/kenichiuda/status/1417266893581295651 https&amp;amp;#58;//twitter.com/kenichiuda/status/1417266893581295651]や、そこで引用されている[https://twitter.com/madonomori/status/1417265763363168263 https&amp;amp;#58;//twitter.com/madonomori/status/1417265763363168263]）。[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb]も見てみる必要があるかも。&lt;br /&gt;
&lt;br /&gt;
ただまあMicrosoftのことなのでIContextMenuもあと10年くらいは使えるだろう。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/apps/get-started/make-apps-great-for-windows#8-optimize-your-apps-context-menu-extensions-and-share-targets Windows 11 でアプリをすぐれたものにするためにできることトップ 11 &amp;amp;#45; Windows apps | Microsoft Learn] を読んだら、Windows 11の（新しい）右クリックメニューに表示するためにはIExplorerCommandを使わなければならない（IContextMenuは不可）と明確に書いてあった。また、IExplorerCommandのサンプル（[https://learn.microsoft.com/ja-jp/windows/win32/shell/samples-explorercommandverb エクスプローラー コマンド動詞のサンプル &amp;amp;#45; Win32 apps | Microsoft Learn]）を使ってみたが、IExplorerCommandState（CommandStateHandler）のほうは動作しているように見えるものの肝心のIExplorerCommand（ExplorerCommandHandler）は全く反応しなかった（右クリックを一度でも行うとdllへの上書きアクセスが禁止されるので読み込まれてはいるようだが、コンストラクタや&amp;lt;code&amp;gt;QueryInterface&amp;lt;/code&amp;gt;にデバッグ用のメッセージボックスを入れても表示されない）。&lt;br /&gt;
&lt;br /&gt;
==== サブメニュー ====&lt;br /&gt;
&lt;br /&gt;
IContextMenuは自由度が高いのでサブメニューなども実装できるはず（7&amp;amp;#45;Zipなどもそうしていると思われる）。またこのような記事もあった&amp;amp;#58; [http://nonsubject.arinco.org/2014/06/cascading-desktopbackground-menus.html デスクトップのシェルメニューをサブメニューにする | Nonsubject]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows11の右クリックメニューへの追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows11の右クリックメニューへの追加 ===&lt;br /&gt;
&lt;br /&gt;
これはどうやらますます面倒になりそうで、リリース済のWindowsストアアプリをインストールするか開発者モードを有効にしないと自分の好きなメニューを追加できない（多分）上、アプリ1つにつき1メニューしか追加できないらしい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windows 11の右クリックメニューに追加してくれるソフト&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/ikas-mc/ContextMenuForWindows11 https://github.com/ikas-mc/ContextMenuForWindows11]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;フォルダ背景を右クリックしたメニューに追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/44 https://github.com/ikas-mc/ContextMenuForWindows11/issues/44]）（いや、使ってみたら普通にできてるっぽい？）、アプリ1つにつき1メニューしか追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/45 https://github.com/ikas-mc/ContextMenuForWindows11/issues/45]）（これはWindows側がそういう仕様っぽいので厳しそう）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Microsoftの関連するサンプル&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/microsoft/AppModelSamples/tree/master/Samples/SparsePackages AppModelSamples/Samples/SparsePackages at master · microsoft/AppModelSamples]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Meryへの追加要望&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.haijin-boys.com/discussions/6746 Windows 11の新コンテキストメニューにMeryのコマンドを追加したい]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策①comを利用する&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策①COMを利用する ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
まずは、COMを用いて実装するという方法がある。基本的にはこちらが綺麗な解決策である。&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandというインターフェースを具体的に実装している[https://learn.microsoft.com/en-us/windows/win32/shell/samples-executecommandverb Microsoftのサンプル]があったので、それを参考に、「取得したファイル・フォルダの情報を引数または標準入力として渡しつつ指定されたコマンドを起動する」というプログラムを作成した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]&lt;br /&gt;
&lt;br /&gt;
COMを使っていることからわかるように、コマンドラインを介さず直接Explorerからデータが送られてくるので、他の方法に共通してみられるパス長さやファイル個数の制限が（事実上）皆無であり、非常に強力である。&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
=== 使い方 ===&lt;br /&gt;
&lt;br /&gt;
詳しい使い方は上記レポジトリのREADMEも参照。&lt;br /&gt;
&lt;br /&gt;
==== 基本 ====&lt;br /&gt;
&lt;br /&gt;
引数となる（実際に起動したい）コマンドはレジストリキー&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\CLSID\&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;\LocalServer32&amp;lt;/code&amp;gt;の既定の値で設定する。&lt;br /&gt;
&lt;br /&gt;
その上で該当メニューに対応する&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キー（レジストリの各所にある）に&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;という値を作成して&amp;lt;code&amp;gt;&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;&amp;lt;/code&amp;gt;を書き込むことで起動できる（&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の既定値よりも&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;が優先される）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;idroptargetを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== IDropTargetを用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandではなくIDropTargetというインターフェースを用いてもほぼ同じことができそうであった。対応するサンプルは[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb]である。IExecuteCommandとの機能的な違いはあまりよくわからないが、[https://learn.microsoft.com/en-us/windows/win32/shell/samples-droptargetverb https&amp;amp;#58;//learn.microsoft.com/en&amp;amp;#45;us/windows/win32/shell/samples&amp;amp;#45;droptargetverb]を読む限り、DropTargetのほうが古くからあるようである。CLSIDの登録までは同じだが、&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;のかわりに&amp;lt;code&amp;gt;DropTarget&amp;lt;/code&amp;gt;キーを使用し、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値のかわりに&amp;lt;code&amp;gt;CLSID&amp;lt;/code&amp;gt;値を使う（ソースを読めばわかる）。&lt;br /&gt;
&lt;br /&gt;
== 解決策②プロセス間通信で頑張る ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
「プロセス間通信を使って頑張る」という方法もある。要するに、コマンドとしては別々に渡されたとしても、既に立ち上がっているプロセスがあるときはそちらに投げて終了するようにすれば、一つのプロセスでまとめて開けるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分を代わりにやってくれるものとしては[https://github.com/zenden2k/context-menu-launcher https://github.com/zenden2k/context-menu-launcher]がある。これを少し改善したフォークとして[https://github.com/KnIfER/SingleInstance-Launcher https://github.com/KnIfER/SingleInstance-Launcher]があり、さらに自分が64bit版のビルドを加えたものが[https://github.com/ge9/SingleInstance-Launcher https://github.com/ge9/SingleInstance-Launcher]にある。&lt;br /&gt;
&lt;br /&gt;
ただ、これはCOMを使う方法とは違っていくつかの欠点がある。&lt;br /&gt;
&lt;br /&gt;
* ファイル個数の上限&lt;br /&gt;
** ProgIDを使って開く場合には、選択個数がデフォルトで15個までに設定されており、これはMultipleInvokePromptMinimum値（詳しくは他サイト）の変更により増やせるが確実ではない（上限に諸説あり）。&lt;br /&gt;
** 独自メニューの場合は、&amp;amp;quot;MultiSelectModel&amp;amp;quot;を&amp;amp;quot;Player&amp;amp;quot;にすることでファイル数上限が100個になるが、それより大きくはできない。&lt;br /&gt;
* 長さ制限（260文字）を超えるパスをもつフォルダでは失敗する（詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] を参照）。&lt;br /&gt;
* プロセス間通信を使っているため、起動時にラグがあったりすると、ごく稀に渡されたファイルの順番が乱れることがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;singleinstance&amp;amp;#45;launcher-&amp;amp;#45;-基本的な使い方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== SingleInstance&amp;amp;#45;Launcher &amp;amp;#45; 基本的な使い方 ===&lt;br /&gt;
&lt;br /&gt;
上記GitHubリポジトリから実行ファイルをダウンロードしてどこか分かりやすい場所に置く。インストールなどは不要である。筆者がリリースした実行ファイルを信用できない・改変したいなどの場合はソースコードをどうぞ。言語はC++。ファイルの順番が乱れにくくなる改善など大歓迎。&lt;br /&gt;
&lt;br /&gt;
README.mdにもあるが起動に用いる基本的な構文（レジストリに登録する値）は以下のようである（※ここでは64bit版を使うものとして説明しているが、32bit版でも全く同様）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&amp;quot;C:\path\to\singleinstance_x64.exe&amp;quot; &amp;quot;%1&amp;quot; &amp;quot;C:\Program Files\path\to\app.exe&amp;quot; &amp;quot;$files&amp;quot; --si-timeout 1000 --option-to-app-1 --option-to-app-2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;amp;quot;C&amp;amp;#58;\path\to\singleinstance_x64.exe&amp;amp;quot;、&amp;amp;quot;%1&amp;amp;quot;、&amp;amp;quot;C&amp;amp;#58;\Program Files\path\to\app.exe&amp;amp;quot;、&amp;amp;quot;$files&amp;amp;quot;の順番はおそらくこの通りである必要がある。その後にあるものはapp.exeにオプションとしてそのまま渡されるが、&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;si&amp;amp;#45;timeout n&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に限り&amp;lt;/strong&amp;gt;、singleinstance_x64.exeが解釈し、app.exeに渡されない。このオプションはSingleInstance&amp;amp;#45;Launcherに対して次のファイルが渡されてくるのを待つタイムアウト期間をミリ秒で指定するものである。短すぎると、右クリックメニューの処理が遅い場合に途中で打ち切られてしまう可能性がある。長すぎると、その期間待つまでapp.exeは呼ばれないため、タイムラグが長く不便に感じる可能性がある。特に動作が重いPCでなければ1000（1秒）くらいにしておけば十分だろう。もう少し短くてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
%1や$filesの両側にダブルクォーテーションがないと、空白を含むファイル名を正しく扱えない。GitHubのサンプルでは付いていないものもあるので注意。&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=349</id>
		<title>デュアルブート</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=349"/>
		<updated>2025-06-30T09:02:46Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
WindowsとLinuxのデュアルブートにおいて役に立つ情報を記述する。古いメモを多く含む。[[Linuxのインストール|Linuxのインストール]]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsのプロダクトキー関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsのプロダクトキー関連 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|デュアルブート}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bitlocker ==&lt;br /&gt;
&lt;br /&gt;
とにかく前もって&amp;lt;strong&amp;gt;回復キーを保存しておくこと！！&amp;lt;/strong&amp;gt;逆に回復キーさえあればBitlockerで大きなトラブルになることは多くない。&lt;br /&gt;
&lt;br /&gt;
* [https://www.pcdock24.com/blog/?p=53931 BitLockerとは【BitLockerの要件と自動有効化の問題点】｜パソコン修理パソコンドック24] によるとローカルアカウントでBitlockerの有効/無効を確認するときはdiskmgmtから行かなきゃいけないらしい。&lt;br /&gt;
* Bitlockerを有効にしたあとにwinを起動すると再起動ループにハマることがある。解決法(Manage&amp;amp;#45;bdeを使う)→[https://community.spiceworks.com/how_to/124388-stop-a-bitlocker-boot-loop Stop a BitLocker boot loop &amp;amp;#45; Windows Forum &amp;amp;#45; Spiceworks]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsパーティションntfsのマウント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsパーティション（NTFS）のマウント ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
==== remove_hiberfileについて ====&lt;br /&gt;
&lt;br /&gt;
マウントが成功するにはWindowsが完全シャットダウンされている必要がある（またはそれが望ましい）。ただ、[https://unix.stackexchange.com/questions/107978/cant-access-windows-drive-windows-is-hibernated-refused-to-mount https&amp;amp;#58;//unix.stackexchange.com/questions/107978/cant&amp;amp;#45;access&amp;amp;#45;windows&amp;amp;#45;drive&amp;amp;#45;windows&amp;amp;#45;is&amp;amp;#45;hibernated&amp;amp;#45;refused&amp;amp;#45;to&amp;amp;#45;mount]にある通り、windowsを正しくシャットダウンしてもなぜか「ハイバーネートされててマウントできません」的なのが出ることがあるので、マウントオプションにremove_hiberfileを追加するとよい。&lt;br /&gt;
&lt;br /&gt;
* 高速スタートアップを無効にしているにもかかわらず完全シャットダウンされていないことがある気がしたので、Windowsでシャットダウン時に実行するスクリプトとして完全シャットダウンコマンドを追加したりした&lt;br /&gt;
* デスクトップPCではだいたい不要？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker無し&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker無し ===&lt;br /&gt;
&lt;br /&gt;
普通にntfs&amp;amp;#45;3gを使う。数字など適宜読み替えること。主にWindowsのDドライブ想定。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;ntfs-3g -o remove_hiberfile /dev/nvme0n1p5 /media/win&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstabの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;/dev/sda2     /media/ddrive ntfs-3g noauto,rw,nofail 0  0&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker有り&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker有り ===&lt;br /&gt;
&lt;br /&gt;
ntfs&amp;amp;#45;3gの前にDislockerで暗号化を解除する。参考→[http://www7390uo.sakura.ne.jp/wordpress/archives/270 http&amp;amp;#58;//www7390uo.sakura.ne.jp/wordpress/archives/2]&lt;br /&gt;
&lt;br /&gt;
dislocker&amp;amp;#45;fileの方式だと一旦復号したのをファイルに書き出して静的にマウントするので、（事実上）readonlyとなる。よってdislocker&amp;amp;#45;fuseを使う→[https://www.systutorials.com/docs/linux/man/1-dislocker-fuse/ https&amp;amp;#58;//www.systutorials.com/docs/linux/man/1&amp;amp;#45;dislocker&amp;amp;#45;fuse/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/dl-fuse&lt;br /&gt;
$ sudo mount -o loop,rw /media/dl-fuse/dislocker-file /media/win/&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstab例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  0 0&lt;br /&gt;
/media/bitlocker/dislocker-file   /media/win10   ntfs-3g   rw,nofail,remove_hiberfile,permissions 0  2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;と、二行に分けて記載する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;permissions については後述&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セキュリティ問題 ====&lt;br /&gt;
&lt;br /&gt;
recovery&amp;amp;#45;passwordを暗号化されていないパーティションに書いてしまうと結局Bitlockerの意味が全くなくなってしまうので、Linux側でもBitlockerのような暗号化パーティション（LUKSとか？）やユーザーログイン時に復号される暗号化フォルダ（ecryptfsとか）といったディスク上で暗号化される領域に書いておく必要がある（もちろん毎回パスワードの類を打ち込むのでよければそれでもいい）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;permissions-inheritについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== permissions, inheritについて ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tuxera/ntfs-3g/wiki/File-Ownership-and-Permissions https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/wiki/File&amp;amp;#45;Ownership&amp;amp;#45;and&amp;amp;#45;Permissions] 詳しくはこちらも参照。&lt;br /&gt;
&lt;br /&gt;
まず、マウントオプションとして&amp;lt;strong&amp;gt;permissions&amp;lt;/strong&amp;gt;を指定しない限り、ntfs&amp;amp;#45;3gでマウントしたファイルは全てパーミッション・所有者が固定（uid, gid, umaskなどで指定）となり、個別のファイルについて変更することはできない。&lt;br /&gt;
&lt;br /&gt;
そして、この場合、ntfs&amp;amp;#45;3g経由で作成したファイルはWindows側で見るとすべてAdministratorの所有となり、さらにEveryoneにフルコントロール権限が付与される（この動作を変更するのは筆者の知る限り不可能）。&lt;br /&gt;
&lt;br /&gt;
Linuxではフォルダの実行権限（x）が無ければその中に含まれたファイルにはアクセスが通らず、パスを推測することも不可能だが、Windowsではたとえ一切権限のないフォルダであっても中にあるファイル・フォルダのパスがわかれば直接パスを打つことでアクセスが通ってしまうようである（試した限り）。そのため、permissions無しでntfs&amp;amp;#45;3gで作成したファイルはパスさえわかればWindows上の全ユーザーが閲覧・編集・削除できる状態ということになる。&lt;br /&gt;
&lt;br /&gt;
従って、Gitを使用する場合や複数ユーザーで使用したい場合などパーミッション管理が必要なデータを扱う場合はもちろん、単に中にあるデータを保護したいという場合でもpermissionsオプションを指定することが必須になる。&lt;br /&gt;
&lt;br /&gt;
次に、permissionsを指定して、かつUserMappingを指定しない場合、Linux上でrootが所有するファイルをWindows側で見ると、全てAdministratorsの所有物になり（ここはpermissionsがない場合と同じ）、そのアクセス権はLinux上での見え方と概ね一致するように設定されるようである。他のユーザーが所有するファイルにはS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000というような上位桁が円周率に由来する（この部分はハードコードされている）SIDが割り当てられ、こちらもアクセス権が適切に設定される。UserMappingを指定することで、このSIDの部分の割り当てを変更することができる。&lt;br /&gt;
&lt;br /&gt;
Windowsに挙動を近づけるための他のオプションとしては&amp;lt;strong&amp;gt;inherit&amp;lt;/strong&amp;gt;というのもあり、これは新規作成時に上位フォルダの権限を継承するものである。しかし、これは&amp;lt;u&amp;gt;所有者を継承するオプションではない&amp;lt;/u&amp;gt;（そして、所有者が違えばまともに継承もされない）。&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/tuxera/ntfs-3g/issues/90 https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/issues/90] では、UserMappingがなくても所有者が継承されるようになるパッチが示されているが、これを使うとpermissionsは動かなくなる（chmodなどが使えない）。&lt;br /&gt;
&lt;br /&gt;
以上のことから、Windowsの一般ユーザーフォルダの内容などをLinuxから良い感じに（Windows側の権限設定を汚染せずに）使えるようにするには、明示的なUserMappingが事実上必須であることがわかる。&lt;br /&gt;
&lt;br /&gt;
一方で、Administrator所有・全ユーザー閲覧可能（あるいは不可能）、といった、Windows側の全ての一般ユーザーに対して共通のアクセス権を適用する設定であれば、UserMappingを使用しなくても簡単に設定が可能である。個人用PCかつ、画像・動画などのメディアファイルやLinuxでしか使用しない大きめのソフトウェアを入れておく用途であれば、こちらで問題ないだろう。&lt;br /&gt;
&lt;br /&gt;
Linux側で別ユーザーの所有に見せたい場合は、上記のS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000のようなSIDが見えてしまう状態でもよければ（かつ、権限設定にも問題がなければ）それでもいいし、下記のbindfsと併用する方法もある。いずれにしても、Linux側で全員が読み取り・書き込み・実行が可能なファイルは、Linux側での親フォルダの権限によらず、Windows側では（パスさえわかれば）対応する権限でアクセスができてしまうということに注意が必要である。&lt;br /&gt;
&lt;br /&gt;
また、Windowsではファイルの新規作成時には必ず実行権限が付加されるので、Linux側でそれを見た場合も実行可能になる（実行権限を外すと.exeなどが実行できなくなる）。従って、GitのレポジトリのフォルダをWindows/Linux間で共用するようなことをすると、Windows側では実行権限無しで（これがデフォルトであるため）コミットされたファイルがLinux側では実行権限有りに見えるため差分が出てしまうといったことが発生する。これはUserMappingでも解決はできないので、Gitリポジトリのあるフォルダを共用するのは不可能である。&lt;br /&gt;
&lt;br /&gt;
==== bindfs ====&lt;br /&gt;
&lt;br /&gt;
既存のディレクトリを、所有ユーザーやパーミッションを変更してマウントしてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --mirror=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
または&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --force-user=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
この2つの違いは不明&lt;br /&gt;
&lt;br /&gt;
作成した&lt;br /&gt;
&lt;br /&gt;
sudoがないと&amp;lt;code&amp;gt;fusermount&amp;amp;#58; option allow_other only allowed if &amp;amp;#39;user_allow_other&amp;amp;#39; is set in /etc/fuse.conf&amp;lt;/code&amp;gt;とか言われたりする&lt;br /&gt;
&lt;br /&gt;
fstabの例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;/media/win /home/myname/.mnt_win fuse.bindfs nofail,map=root/myname:@root/@myname,create-with-perms=g-w 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linuxだとrootのデフォルトのumaskが022で一般ユーザーが002なせいで一般ユーザーが作ったファイルが775とか664になってしまったりするがg&amp;amp;#45;wをつけることによって755とか644になる（もちろんchmodすれば変えられる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;minecraft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Minecraft ==&lt;br /&gt;
&lt;br /&gt;
.minecraftフォルダをWindowsとLinuxで共有したはいいが、（それ自体.minecraftの中にある）ゲームディレクトリの指定も共有することを考えると、両OSでパスの仕様がやや異なるのが問題になる。&lt;br /&gt;
&lt;br /&gt;
例えば以下ではWindowsのルートが/media/winにマウントされているとする。&lt;br /&gt;
&lt;br /&gt;
まずLinuxのランチャーは相対パスどころかシンボリックリンクすら変換して普通の絶対パスにしてしまう（設定を書き換えてしまう）っぽいので、linuxでは絶対パス指定で/media/win/Users/pathのようにする。で、この書き方をするとWindowsでは相対パスと解釈されるのだが、基準となるフォルダが謎で、「PLAY」を押した時のチェック時は.minecraftが基準なのだが、実際に見られるのはランチャーがあるフォルダが基準（＝こっちになかった場合ゲームディレクトリが新たに作られる）&lt;br /&gt;
&lt;br /&gt;
* ストアアプリ版の（新しい方の？）Minecraftランチャーでは、この「ランチャーがあるフォルダ」は&amp;lt;code&amp;gt;AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local&amp;lt;/code&amp;gt; あたりである。&lt;br /&gt;
&lt;br /&gt;
従って、ランチャーのフォルダと.minecraft内の両方にmediaというフォルダを作って中にwinという名前でC&amp;amp;#58;\へのジャンクション置くとうまくいく。&lt;br /&gt;
&lt;br /&gt;
.minecraftの中にはゲームディレクトリ専用のフォルダを作り、その中にmain, snapshotなど用途に応じたフォルダを作っておくとよい&lt;br /&gt;
&lt;br /&gt;
== google&amp;amp;#45;drive&amp;amp;#45;ocamlfuse ==&lt;br /&gt;
&lt;br /&gt;
labelを使うと複数アカウントをマウントできる。デフォルトのラベル名はdefault&lt;br /&gt;
&lt;br /&gt;
しばらく使っていないと起動時におそらく認証の失敗が原因でマウントポイントのあるフォルダに対するlsがしばらく一切反応しなくなる（&amp;amp;#126;/.gdfuse内の該当ラベル名のフォルダを削除して最初からやり直せば治る）。よってマウントポイントをホームディレクトリ直下に作るのは避けたほうがよい（gdfというフォルダを作っている）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mega&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MEGA ==&lt;br /&gt;
&lt;br /&gt;
Winが完全にはシャットダウンされていない状態でLinuxを起動するとCドライブ上のMEGAのフォルダが読めずに同期が無効になってしまう。MEGA自身のかわりに、Cが読める状態でのみMEGAを起動するシェルスクリプト（mega&amp;amp;#45;mounted.sh）をスタートアップに登録しておく。Cが読めなかった場合にはdialogコマンドで通知ダイアログを表示する。（このスクリプトではC自身のかわりにC&amp;amp;#58;\Windowsをみている）（gdialogは一部のディストリにしか入っていないかもしれない。実際にコマンド打ってみてどんな表示になるかも含めて確かめておいたほうがよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if [ -d /media/win-rw/Windows ]; then&lt;br /&gt;
megasync&lt;br /&gt;
else&lt;br /&gt;
gdialog --title &amp;quot;Warning&amp;quot; --infobox &amp;quot;MEGAsync is not started because Windows partition is not mounted&amp;quot; 0 0&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bluetooth機器&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bluetooth機器 ==&lt;br /&gt;
&lt;br /&gt;
同じBluetooth機器を同じPCのWindowsとLinux双方にペアリングするというもの。自分はマウスでしかやったことがない。意外と難しいが何とかなる。&lt;br /&gt;
&lt;br /&gt;
==== 参考 ====&lt;br /&gt;
&lt;br /&gt;
* [https://orumin.blogspot.com/2019/02/bluetooth.html https&amp;amp;#58;//orumin.blogspot.com/2019/02/bluetooth.html]&lt;br /&gt;
* [https://qiita.com/yoko-yan/items/9b0235678fd804b4fe0d https&amp;amp;#58;//qiita.com/yoko&amp;amp;#45;yan/items/9b0235678fd804b4fe0d]&lt;br /&gt;
* Bluetooth Low Energyという仕様もあるらしく、自分のマウスはこっちだった。これに関しては[http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html http&amp;amp;#58;//aimingoff.way&amp;amp;#45;nifty.com/blog/2018/09/windows&amp;amp;#45;linux&amp;amp;#45;b.html]を参照。割と情報が少ないので感謝。&lt;br /&gt;
** &amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx&amp;lt;/code&amp;gt;を見るためにpstoolsをダウンロードして&amp;lt;code&amp;gt;PsExec64 &amp;amp;#45;s &amp;amp;#45;i regedit&amp;lt;/code&amp;gt;とする必要があることに注意。なお、セキュリティソフトによってPsexecが脅威と見なされ強制削除されてしまうときは代わりにフリーソフトのAdvancedRunを使うとよい。&lt;br /&gt;
** まとめ&lt;br /&gt;
*** CSRKをLocalSignatureKey&lt;br /&gt;
*** LTKをLongTermKey&lt;br /&gt;
*** EDIVをEdiv（16進→10進に変換）&lt;br /&gt;
*** ERandをRandに（&amp;lt;strong&amp;gt;バイト&amp;lt;/strong&amp;gt;(2文字のかたまり)&amp;lt;strong&amp;gt;をすべて逆順にしてから&amp;lt;/strong&amp;gt;10進変換）。ちなみにこれを間違えた結果、マウスを動かすたびにbluetoothアイコンが白↔黒と高速で切り替わる謎のバグっぽい現象が起こったことがあった。&lt;br /&gt;
*** 小文字を大文字に変える必要はない。また、IRKをIdentityResolvingKeyに書くのも不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;マルチデバイス対応マウスlogicool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== マルチデバイス対応マウス（Logicool） ====&lt;br /&gt;
&lt;br /&gt;
マルチデバイス対応（切り替えボタンがあるやつ）のマウス（LogicoolのM595）を使ったら、&amp;lt;strong&amp;gt;登録情報を一旦削除して再接続するごとにMacアドレスがひとつインクリメント&amp;lt;/strong&amp;gt;されて困った。Linuxで接続→Winで接続→Linuxで上記の書き換え、とやったあと、フォルダ名を変更（1を足せばよいはずだが正確にはWinの情報を見るのがよい）するとうまくいった。[https://twitter.com/e9g/status/1381111849664409600 自分のツイート]にも記録あり&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=PDF&amp;diff=348</id>
		<title>PDF</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=PDF&amp;diff=348"/>
		<updated>2025-06-30T09:02:43Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pdfを扱う方法について。&lt;br /&gt;
&lt;br /&gt;
== pdftkとcpdf ==&lt;br /&gt;
&lt;br /&gt;
pdftkは有能だが、cpdfはさらに強い&lt;br /&gt;
&lt;br /&gt;
==== pdftk ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;切り出し&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;pdftk hoge.pdf cat 1 3-5 output fuga.pdf&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== cpdf ====&lt;br /&gt;
&lt;br /&gt;
非商用に限り[https://community.coherentpdf.com/ https&amp;amp;#58;//community.coherentpdf.com/] このcommunityバージョンが無料で使える&lt;br /&gt;
&lt;br /&gt;
概要は[http://pdf-file.nnn2.com/?p=892 http&amp;amp;#58;//pdf&amp;amp;#45;file.nnn2.com/?p&amp;amp;#61;892] 、具体的なコマンド例は [http://pdf-file.nnn2.com/?p=1025 http&amp;amp;#58;//pdf&amp;amp;#45;file.nnn2.com/?p&amp;amp;#61;1025] など参照&lt;br /&gt;
&lt;br /&gt;
例えば、「1,5ページ目のサイズを縦横とも半分にして出力したい」ときは&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;cpdf input.pdf 1,5 -scale-page &amp;quot;0.5 0.5&amp;quot; -o output.pdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
とする。一方で、「1,5ページ目のサイズを縦横とも半分にして&amp;lt;strong&amp;gt;1, 5ページ目のみを&amp;lt;/strong&amp;gt;出力したい」ときは&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;cpdf input.pdf 1,5 AND -scale-page &amp;quot;0.5 0.5&amp;quot; -o output.pdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のように&amp;lt;strong&amp;gt;AND&amp;lt;/strong&amp;gt;を入れるといいっぽい。&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;#45;remove&amp;amp;#45;fontsで埋め込みフォントを除去できる。ただしAcrobat Readerでの表示とかはかなりおかしくなる（Chromeならいけてたりする）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;adobe-reader&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Adobe reader ==&lt;br /&gt;
&lt;br /&gt;
* 「文書」メニューの&amp;lt;strong&amp;gt;前回のビュー設定を復元&amp;lt;/strong&amp;gt;をしておくとよい。これをクラウドで共有できたりすると便利かもしれないができるかどうか不明。→ [https://superuser.com/questions/83935/pdf-where-does-acrobat-reader-save-information-about-last-view-settings https&amp;amp;#58;//superuser.com/questions/83935/pdf&amp;amp;#45;where&amp;amp;#45;does&amp;amp;#45;acrobat&amp;amp;#45;reader&amp;amp;#45;save&amp;amp;#45;information&amp;amp;#45;about&amp;amp;#45;last&amp;amp;#45;view&amp;amp;#45;settings] によると レジストリの &amp;lt;code&amp;gt;HKCU\Software\Adobe\Acrobat Reader\9.0\RememberedViews&amp;lt;/code&amp;gt;にあるらしい。見てみたら今は &amp;lt;code&amp;gt;\HKEY_CURRENT_USER\Software\Adobe\Acrobat Reader\DC\RememberedViews&amp;lt;/code&amp;gt;っぽい。15ファイルが上限？Recent自体は100個保存してるみたいだが&lt;br /&gt;
&lt;br /&gt;
上書き保存なのに毎回ダイアログが出て不快。設定から「ファイルを保存するときにオンラインストレージを表示」を外すと良い（というよりマシな）感じになる（無駄なクリック数が減る）。保護モードを解除すれば即座に上書き保存できるようだが、セキュリティリスクがありそうなのでやめておいた。&lt;br /&gt;
&lt;br /&gt;
Alt+方向キーで進む戻るはできるが、Logicoolのマウスの進む戻るは効かなかったので、Logicool Optionsをインストールしてアプリケーション個別の設定をした&lt;br /&gt;
&lt;br /&gt;
Shift+Enterで次に移動できるようにするためにAutoHotKeyで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;#IfWinActive ahk_class AcrobatSDIWindow&lt;br /&gt;
+Enter::^+G&lt;br /&gt;
#IfWinActive&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
と書いて起動しておく&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;暗号化編集の禁止の解除&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 暗号化（編集の禁止）の解除 ==&lt;br /&gt;
&lt;br /&gt;
qpdfで&amp;amp;#45;&amp;amp;#45;decryptをする&lt;br /&gt;
&lt;br /&gt;
== 結合 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;pdftk &amp;amp;#42;.pdf cat output out.pdf compress&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
compressはなくてもいい気がする。あるとサイズが増えることさえあった（？）&lt;br /&gt;
&lt;br /&gt;
== 圧縮 ==&lt;br /&gt;
&lt;br /&gt;
[https://zat.ifdef.jp/html/2010/09-17.html https&amp;amp;#58;//zat.ifdef.jp/html/2010/09&amp;amp;#45;17.html]&lt;br /&gt;
&lt;br /&gt;
ghostscriptの/defaultがかなりよさそう？&lt;br /&gt;
&lt;br /&gt;
== 余白追加 ==&lt;br /&gt;
&lt;br /&gt;
==== 固定値 ====&lt;br /&gt;
&lt;br /&gt;
元のサイズから固定値だけ大きくする場合（各辺3mm追加など）[https://github.com/abarker/pdfCropMargins pdfCropMargins]を使う。pipで入れられる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;pdf-crop-margins -o out.pdf -p 100 -a4 $left $bottom $right $top in.pdf&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
（a4は、用紙サイズのA4とは無関係）&lt;br /&gt;
&lt;br /&gt;
参考&amp;amp;#58; [https://unix.stackexchange.com/questions/441888/add-extra-margin-on-right-to-a-pdf-without-losing-outline Add extra margin (on right) to a pdf without losing outline?]&lt;br /&gt;
&lt;br /&gt;
==== コンテンツに応じて計算 ====&lt;br /&gt;
&lt;br /&gt;
コンテンツに対する余白を指定したい場合。&lt;br /&gt;
&lt;br /&gt;
上記のpdfCropMarginsでもいいし、TeX Live付属のpdfcropでもできる。&lt;br /&gt;
&lt;br /&gt;
[https://stackoverflow.com/questions/16158435/add-margin-to-pdf-file-when-merging-using-pdftk-or-similar Add margin to PDF file when merging using PDFTK or similar]&lt;br /&gt;
&lt;br /&gt;
== 重ね合わせ ==&lt;br /&gt;
&lt;br /&gt;
pdftkなら(multi)stamp/background [https://satiseni.hateblo.jp/entry/2020/07/28/105907 https&amp;amp;#58;//satiseni.hateblo.jp/entry/2020/07/28/105907] ただ、全文検索ができない？ （他の2つはできた）&lt;br /&gt;
&lt;br /&gt;
qpdfだと&amp;amp;#45;&amp;amp;#45;underlayとか&amp;amp;#45;&amp;amp;#45;overlay&lt;br /&gt;
&lt;br /&gt;
cpdfならstamp&amp;amp;#45;onとかcombine&amp;amp;#45;pages [https://www.coherentpdf.com/cpdfmanual/cpdfmanualch8.html https&amp;amp;#58;//www.coherentpdf.com/cpdfmanual/cpdfmanualch8.html]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pdfaへの変換&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== PDF/Aへの変換 ==&lt;br /&gt;
&lt;br /&gt;
[https://stackoverflow.com/questions/1659147/how-to-use-ghostscript-to-convert-pdf-to-pdf-a-or-pdf-x https&amp;amp;#58;//stackoverflow.com/questions/1659147/how&amp;amp;#45;to&amp;amp;#45;use&amp;amp;#45;ghostscript&amp;amp;#45;to&amp;amp;#45;convert&amp;amp;#45;pdf&amp;amp;#45;to&amp;amp;#45;pdf&amp;amp;#45;a&amp;amp;#45;or&amp;amp;#45;pdf&amp;amp;#45;x]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;しおりtable-of-contents&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== しおり（table of contents） ==&lt;br /&gt;
&lt;br /&gt;
[https://superuser.com/questions/311388/how-can-the-table-of-contents-in-a-pdf-file-be-edited https&amp;amp;#58;//superuser.com/questions/311388/how&amp;amp;#45;can&amp;amp;#45;the&amp;amp;#45;table&amp;amp;#45;of&amp;amp;#45;contents&amp;amp;#45;in&amp;amp;#45;a&amp;amp;#45;pdf&amp;amp;#45;file&amp;amp;#45;be&amp;amp;#45;edited]　によると&amp;lt;strong&amp;gt;JPdfBookmarks&amp;lt;/strong&amp;gt;がよさそうだった（使ってみたが実際よかった、GPLだし）、pdfModとかいうのもいつか使ってみるかも&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;jpdfbookmarks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== JPdfBookmarks ====&lt;br /&gt;
&lt;br /&gt;
しおり情報をdumpしたファイルを編集するとよい、open/closedというのはしおりが折りたたまれているべきかどうかを指定するっぽい&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;FitPage&amp;lt;/code&amp;gt;にするとジャンプしたときに必ずビューアの表示サイズが調整されて1ページが画面に収まるよう変更されてしまう。&amp;lt;code&amp;gt;FitWidth&amp;lt;/code&amp;gt;だと「幅に合わせる」になる。直したいときは&amp;lt;code&amp;gt;TopLeftZoom,0,0,0.0&amp;lt;/code&amp;gt; にするとよい。ただし手間がかかるし、普通に全画面で見るならそこまで不便はないかも。&lt;br /&gt;
&lt;br /&gt;
あと普通にpdftkも使えるっぽい（djvuのところでも引用した[https://bobbielf2.github.io/blog/2017/04/11/preserve-the-table-of-contents-when-converting-a-book-from-djvu-to-pdf/ https&amp;amp;#58;//bobbielf2.github.io/blog/2017/04/11/preserve&amp;amp;#45;the&amp;amp;#45;table&amp;amp;#45;of&amp;amp;#45;contents&amp;amp;#45;when&amp;amp;#45;converting&amp;amp;#45;a&amp;amp;#45;book&amp;amp;#45;from&amp;amp;#45;djvu&amp;amp;#45;to&amp;amp;#45;pdf/]など参照）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pdfsvg&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== PDF→SVG ==&lt;br /&gt;
&lt;br /&gt;
pdftocairoというのがlatexに入っている。[https://acetaminophen.hatenablog.com/entry/2015/03/10/154412 ここ]も参照。&lt;br /&gt;
&lt;br /&gt;
pdftocairoを呼び出す設定をVSCodeのLaTeX拡張に書けばよい。 [[LaTeX|LaTeX]] を参照。&lt;br /&gt;
&lt;br /&gt;
あと、Inkscapeでもできるはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;djvuの表示pdfへの変換&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== djvuの表示、pdfへの変換 ==&lt;br /&gt;
&lt;br /&gt;
djvulibreを入れる（Winもある）&lt;br /&gt;
&lt;br /&gt;
bookmarkに関しては[https://bobbielf2.github.io/blog/2017/04/11/preserve-the-table-of-contents-when-converting-a-book-from-djvu-to-pdf/ https&amp;amp;#58;//bobbielf2.github.io/blog/2017/04/11/preserve&amp;amp;#45;the&amp;amp;#45;table&amp;amp;#45;of&amp;amp;#45;contents&amp;amp;#45;when&amp;amp;#45;converting&amp;amp;#45;a&amp;amp;#45;book&amp;amp;#45;from&amp;amp;#45;djvu&amp;amp;#45;to&amp;amp;#45;pdf/] にあるPythonコードを改変したものを用いる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ocr&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== OCR ==&lt;br /&gt;
&lt;br /&gt;
ocrmypdfを使おう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ocrデータだけにする&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OCRデータだけにする ====&lt;br /&gt;
&lt;br /&gt;
ghostscriptを使うと画像とアウトラインデータを消せるので実質的に不可視テキストだけになる [https://askubuntu.com/questions/477663/how-to-remove-images-from-a-pdf-file https&amp;amp;#58;//askubuntu.com/questions/477663/how&amp;amp;#45;to&amp;amp;#45;remove&amp;amp;#45;images&amp;amp;#45;from&amp;amp;#45;a&amp;amp;#45;pdf&amp;amp;#45;file]&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=347</id>
		<title>Windowsでエクスプローラーからフォルダを各種ターミナルで開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=347"/>
		<updated>2025-06-30T09:02:40Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Explorerの右クリックメニューやアドレスバーからフォルダを各種ターミナルで開くための設定方法の紹介。cmd.exe, powershell（pwsh含む）, Cygwin, Git Bashの4つに対応。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
&lt;br /&gt;
* [[Windowsの右クリックメニューから複数ファイルをまとめて開く|Windowsの右クリックメニューから複数ファイルをまとめて開く]] のように、レジストリでフォルダ・フォルダ背景の右クリックメニューを編集できる。&lt;br /&gt;
** Windows10までの右クリックメニューに戻そう。&lt;br /&gt;
** &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定値に直接コマンドを書く方法と、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値（など）を使ってCOMを通じて実行する方法（このために[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]（使い方はレポジトリの説明を参照）を作った）がある。&lt;br /&gt;
** HKLMにあるマシン全体の設定は、それ自体は管理者権限（あるいはTrustedInstallerなどさらに上の権限）がないと書き換えられないが、&amp;lt;strong&amp;gt;HKCUに値があればそちらが優先される&amp;lt;/strong&amp;gt;ので、自分だけに関する設定変更ならユーザー権限だけで可能である。&lt;br /&gt;
** &amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;の直下に&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という名前でキーを作った場合は、自動的に&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の内容が管理者権限で実行される。ただ、&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という固定のただ一つの名前しか使えないため、例えば管理者としてコマンドプロンプトを開くメニューとPowerShellを開くメニューを共存させることができない。そのためこの記事では&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;キーを使用するのではなくコマンドの中で明示的に管理者としての実行を行っている。&lt;br /&gt;
* Explorerのアドレスバー（address bar, location barなど）にcommandと入力してEnterを押すと、そのフォルダをカレントディレクトリとして&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;というコマンドが実行される。&lt;br /&gt;
** このアドレスバーの仕様はおそらく「ファイル名を指定して実行」とほぼ同じ。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;で（メインとして）指定するファイルはフルパスなら必ず動作し、Pathが通っているまたはApp Pathsに登録されているならファイル名だけでよく、さらにbatやexeの場合は拡張子も省略できる。さらに、ほとんど知られていないが実は&amp;lt;strong&amp;gt;App Pathsの値には実行ファイル以外も書ける&amp;lt;/strong&amp;gt;ようである。&lt;br /&gt;
** つまり、パスの通っているフォルダにあるimage.pngはフルパスを打たなくても「image.png」で開けるし、さらにはApp Pathsの&amp;lt;code&amp;gt;openimage.exe&amp;lt;/code&amp;gt;というキーにimage.pngのフルパスを書けば&amp;lt;code&amp;gt;openimage&amp;lt;/code&amp;gt;と打つだけで（実際にはそのような実行ファイルは全く存在しないにもかかわらず）image.pngが開くようになる。当然、vbsなども拡張子無しで呼び出せることになる。&lt;br /&gt;
&lt;br /&gt;
== ポイント ==&lt;br /&gt;
&lt;br /&gt;
==== パス名のルール ====&lt;br /&gt;
&lt;br /&gt;
* Windowsではパスの長さが260文字以下という制限がある。詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] 参照。&lt;br /&gt;
** 制限を超えるような長いパスは&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;というプレフィックスを付けて（UNCパスの一種として）扱われる。&lt;br /&gt;
*** このようなフォルダをカレントディレクトリとしてコマンドを実行することはできないので、アドレスバーに打ち込む方式は使えない（System32をカレントディレクトリとして実行される）。wt &amp;amp;#45;dなどにも指定できない。&lt;br /&gt;
*** 右クリックメニューでは、commandの既定の値に直接書く方式の場合は、&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を設定しないと呼び出されなくなる。&lt;br /&gt;
*** シンボリックリンク/ジャンクションでパスを短くしてやれば普通に扱えるようになる&lt;br /&gt;
* 普通に入力できる文字でWindowsのファイル名に使えないのは、&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#58;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;の9個（エクスプローラーの画面で入れようとすると表示される）。&lt;br /&gt;
** その他、ヌル文字やタブスペースのような0x20未満の制御文字も使えない（はず）。&lt;br /&gt;
*** これらを含むファイルはGit Bash/Cygwinを使っても作れない。&lt;br /&gt;
*** NTFS自体の制限はおそらく&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;だけで、それ以外に関してはLinux上で作ってからWindowsで見ると見られることもある。中身の閲覧などは不可。&lt;br /&gt;
* また、末尾が空白またはピリオドのファイルも禁止で、Explorerやcmdでは作れない（自動で除去される）。&lt;br /&gt;
** これらはGit Bash/Cygwinなら作れる。前者はエクスプローラーで閲覧など多少の操作ができるが後者はほとんど何もできず、DelegateExecuteの右クリックメニューでもピリオドが外れた名前しか取得できない。&lt;br /&gt;
* 先頭が空白のファイルはExplorerだと作れないがcmdなら作れる。禁止ではないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
* Git BashではWindowsの実行ファイルにスラッシュ付きオプションを渡すときはスラッシュを2つにする必要がある。&amp;lt;code&amp;gt;cmd //c&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;bcdedit //v&amp;lt;/code&amp;gt;など。&lt;br /&gt;
* printf関数の%qオプションを使うと、文字列を&amp;lt;strong&amp;gt;エスケープされた状態にして&amp;lt;/strong&amp;gt;返してくれる。これはshからの呼び出し先の別のshで再びフォルダ名をcdなどの引数として利用したいときに使える。&lt;br /&gt;
** bash（POSIX互換ではない）の組み込みコマンドのprintfと、独立実行ファイル（GNU Coreutilsの一部）である/bin/printfがある。基本的な趣旨としては同一のコマンドだが、組み込みコマンドのほうは入力に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が含まれていない限り結果にも&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が使われることはないようで、このおかげで意図しない動作を回避できることがある。今回扱う例に関しては前者が後者の上位互換であるということになる。後者を使っているものはそれでも動いたものである。&lt;br /&gt;
** そもそも%qは組み込みコマンドのほうにしかないという話もある。環境によって違いそう。&lt;br /&gt;
* &amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くような長いパスをカレントディレクトリにしていても、Git Bash/Cygwinに付属の（というかMSYS/Cygwin向けにコンパイルされた？）exeなら実行できる。&lt;br /&gt;
* Git Bashの(ba)shは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけて起動してもカレントディレクトリが維持されるが、&amp;lt;s&amp;gt;Cygwinの(ba)shは&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;をつけると強制的にホームディレクトリに移動する。&amp;lt;/s&amp;gt;&lt;br /&gt;
** 2024/4頃、Cygwinの挙動が変化し、カレントディレクトリが維持されるようになっていることに気付く。変わっていた方のバージョンは3.5.3、変わっていない方は3.3.6であった。&lt;br /&gt;
** ところで、[https://superuser.com/questions/345964/start-bash-shell-cygwin-with-correct-path-without-changing-directory Start bash shell (cygwin) with correct path without changing directory &amp;amp;#45; Super User]の通り、&amp;lt;code&amp;gt;CHERE_INVOKING&amp;lt;/code&amp;gt;という変数を1に設定しておけばカレントディレクトリは維持される。&lt;br /&gt;
* Git Bashにおいては環境変数を正しく設定するため&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;の時点で環境変数&amp;lt;code&amp;gt;MSYSTEM&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;にしておく必要がある。[[Windowsでのターミナル環境|Windowsでのターミナル環境]] 参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershellpwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell/pwsh ====&lt;br /&gt;
&lt;br /&gt;
* バージョン5まで（Windows PowerShell）はpowershell.exe、6以降（PowerShell Core, PowerShell）はpwsh.exeと実行ファイル名が違う&lt;br /&gt;
** 以後、「powershell(.exe)」と「pwsh(.exe)」で呼び分ける。ただし手元ではpowershellの5.1とpwshの7.2～7.3くらいでしか試していないので、一部バージョンではまた違う可能性もある。&lt;br /&gt;
** pwshは必ずしもWindowsに標準では入っていないので、以下の例でもあまり依存しないように気を付ける。&lt;br /&gt;
** 基本、シングルクォートで囲えばほとんどの特殊文字が無効になり、シングルクォート自体を書くときは2つ並べる。ただし注意点として、驚くべきことにpowershell/pwshでは「&amp;lt;strong&amp;gt;全角のシングルクォート&amp;lt;/strong&amp;gt;（U+2018&amp;amp;#45;U+201B、&amp;lt;code&amp;gt;‘&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‚&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‛&amp;lt;/code&amp;gt;の4つ）」も通常のシングルクォートと同じ効力があるので、同じようにエスケープする必要がある（参照&amp;amp;#58; [https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-02?view=powershell-7.2 https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/powershell/scripting/lang&amp;amp;#45;spec/chapter&amp;amp;#45;02?view&amp;amp;#61;powershell&amp;amp;#45;7.2]）。掲載したスクリプトでは省略しているがやることは同じ。&lt;br /&gt;
* powershell.exe&lt;br /&gt;
** &amp;amp;#45;Commandがなくても付けたのと同じ扱いになる？&lt;br /&gt;
*** 逆に、&amp;amp;#45;Commandを付けなければいけないという点を除いてはpwshがpowershellの上位互換という感覚である（新しいのでそれはそう）。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダの扱いにバグがあり、cmdなどでこれらのフォルダをカレントディレクトリとした状態で5系のPowerShellを起動すると&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;amp;gt;&amp;lt;/code&amp;gt;をカレントディレクトリとして起動される（たとえば&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#93;&amp;amp;#91;&amp;lt;/code&amp;gt;なら前者、&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;なら後者）。&lt;br /&gt;
** &amp;amp;#45;Fileを使用してスクリプトを実行するとき、ダブルクォーテーションで囲われていない &amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt; が引数に含まれているとエラーになるバグがある。&lt;br /&gt;
* powershell.exe・pwsh.exe共通&lt;br /&gt;
** 連続した&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;があるフォルダに関する挙動にバグがある。コンソールプログラムを実行しても新規ウインドウで開かれる、そこをカレントディレクトリとしたときにファイルをmvできないなど。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダに関しても、絶対パス指定したりきちんとエスケープしたりすれば操作自体はできる（場合もある）。&lt;br /&gt;
*** エスケープはいずれも直前に&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;を付ける。&lt;br /&gt;
*** これらを特殊文字として扱いたくないときは&amp;lt;code&amp;gt;&amp;amp;#45;LiteralPath&amp;lt;/code&amp;gt;を付けると良い場合もある。&lt;br /&gt;
** UNCパスをカレントディレクトリにすることができるが、&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;lt;/code&amp;gt;とかいう謎のプレフィックスが付く。&lt;br /&gt;
** 末尾が空白のフォルダについてはcdできず、Cygwinなどでそのようなフォルダをカレントディレクトリとして起動したとしても&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\PowerShell\7&amp;lt;/code&amp;gt;に移動してしまう。&lt;br /&gt;
** 8.3形式のパスを強制的に長い名前に戻してcdしてしまう。その結果、長いフォルダをカレントディレクトリとして外部プログラムを実行できなくなる。&lt;br /&gt;
* PSModulePath環境変数の関係な気がするが、pwshの中でcmdを起動してその中でpowershellを起動したりするとPSReadLineモジュールが読み込めない（&amp;lt;code&amp;gt;PSReadline モジュールを読み込めません。コンソールは PSReadline なしで実行されています。&amp;lt;/code&amp;gt;）とか言われたりする&lt;br /&gt;
&lt;br /&gt;
==== 環境変数への置換 ====&lt;br /&gt;
&lt;br /&gt;
cmdなどを使うと&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で囲われた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が置換される。&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はファイル名にも普通に使える文字なので、注意が必要となる&lt;br /&gt;
&lt;br /&gt;
* 該当の名前の環境変数が定義されていたときのみ置換が行われ、定義されていなければそのままになる。&lt;br /&gt;
* &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;の置換は必ずしも&amp;lt;strong&amp;gt;cmdだけで行われるわけではない&amp;lt;/strong&amp;gt;。「ファイル名を指定して実行」、VBSのWscript.Shellのrun、conhost、wtの引数などでも行われる。しかしCreateProcessやShellExecute(Ex)やレジストリ値では行われない（無理やりREG_EXPAND_SZにしたら展開されるが、後述の&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;との適用順などは不明）。&lt;br /&gt;
* 一般には、環境変数には英数字とアンダースコアしか使えないとの説明もよくあるが、実際にはほとんどの記号が有効である。従って、&amp;lt;code&amp;gt;^%PATH^%&amp;lt;/code&amp;gt;のようなキャレットによるエスケープはcmd向けにはある程度有効だが、&amp;lt;code&amp;gt;PATH^&amp;lt;/code&amp;gt;という環境変数が定義されているとうまく動かない。&lt;br /&gt;
* （そういう変数が定義されていることは現実にほとんどないだろうし、それが保証できるなら以下の部分を読む必要はない）&lt;br /&gt;
&lt;br /&gt;
これを防ぐ方法はいくつかある。ちなみに、&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;でのエスケープというのはバッチファイルの中だけの話で、今回の場面では以下より簡単なエスケープ方法は多分ないと思う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;既に定義されているかもしれない環境変数をバックアップし、一時的にその中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変えて使用することでリテラル文字としての&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を表現し、後で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;すなわち、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;のような変数の中身をバックアップし、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変え、未知の文字列中の&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をすべて&amp;lt;code&amp;gt;%MY_PERCENT%&amp;lt;/code&amp;gt;にすることで&amp;lt;strong&amp;gt;この部分が置換によって&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に変わるのを利用して&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をそのまま渡すということである（環境変数の置換は左から順に行われるため、たとえば&amp;lt;code&amp;gt;%MY_PERCENT%PATH%MY_PERCENT%&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;が置換されることはない）。受け渡しが終わったら&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を復元する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、変数のバックアップとリストアを同じプロセス・スクリプト内で行える（&amp;lt;strong&amp;gt;呼び出した後に元に戻ってくる&amp;lt;/strong&amp;gt;）場面で有用である。呼び出し先プロセスでリストアすることも不可能ではないと思うが、環境変数には任意の文字が入る可能性があることを考えるとエスケープが大変困難になることが予想される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;VAR1, VAR2, VAR3, …のような無限個の変数を最初からチェックし、最初の未定義の変数を上記と同様に使用し、後で未設定にする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ほぼ上記と同じだが、内容のリストアでなく未設定にするだけなので、呼び出し先プロセスでも容易に行える。ただし実装が面倒である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;へと置換して、置換のプロセスを抜けた段階で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これは、&amp;lt;strong&amp;gt;最初の文字以外に&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;が含まれる&amp;lt;/strong&amp;gt;環境変数名は（実際に環境変数が設定されていたとしても絶対に）置換されないことがわかったためである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%&amp;amp;#61;%&amp;lt;/code&amp;gt;（あるいは、&amp;lt;code&amp;gt;%&amp;amp;#61;VAR%&amp;lt;/code&amp;gt;など）は少なくともcmdの対話シェル上だと置換されてしまうので&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;へのエスケープだと不十分に見えるが、実際には&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;一つでも問題なく動く場合もあった。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;しかし、動かないときもあるので、多くの例では&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にエスケープしている。&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;になっているものは、試した限りはそれでも問題なく動いているものである。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables Environment Variables &amp;amp;#45; Win32 apps | Microsoft Learn]では「&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;は環境変数に使えない」と書かれていて、ダイアログからでも設定はできないが、レジストリだと無理やり設定できる。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ユーザー環境変数に設定する分にはとりあえず問題なさそうだが、システム環境変数にレジストリから&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;（と、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を名前に含むいくつかの変数。どれが原因かは正確にはわからない）を無理やり追加したら&amp;lt;strong&amp;gt;0xc000021のブルースクリーンでWindowsが起動しなくなった&amp;lt;/strong&amp;gt;（Linuxからchntpwで該当の変数を全て削除したら治った）のでこれはやってはいけない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみに、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はUnix側では特殊文字ではないので、printfとの適用順はあまり気にする必要はない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;この方法のメリットは、一度置換してしまえばその文字列を何度使いまわしても変化がないことが保証されることと、未定義の変数の探索や変数のリストアが必要ないことである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;要は&amp;lt;code&amp;gt;%(&amp;amp;#61;を含まない文字列)%&amp;lt;/code&amp;gt;を含まない文字列だけを値にとる単射を構成すればいいだけなので、base64エンコーディングのようにしても構わない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただ、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に置換するという操作はPowerShellやshにとっては容易でもcmdにとっては不可能に近いので、最終的な呼び出し先がcmdであるときには採用しづらい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、今回の記事ではcmdやvbsのRunを経由してコマンドを実行しているものが多くあるが、&amp;lt;strong&amp;gt;このスクリプトの内容自体もエスケープが必要&amp;lt;/strong&amp;gt;である。つまり、例えば&amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt;の内側に&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;,&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;というPowershellコードが含まれるなら、&amp;lt;code&amp;gt;&amp;amp;#39;,&amp;amp;#39;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;という環境変数が定義されていた時にその部分が置換されてしまう。これを回避するのはそこまで難しくなく、この例であれば&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;),&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;のように&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を含む無意味なコードを挿入すればよい。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をいったん&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にしている部分に関しては、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#61;&amp;amp;#61;&amp;lt;/code&amp;gt;にすることで問題を避けられるだろう。無駄に複雑になるのでスクリプト例ではそのような措置はしていない。&lt;br /&gt;
&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
* UNCパス（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;だけでなく普通のUNCパスも含む）をカレントディレクトリにすることはできない（rdなど一部コマンドでの取り扱いは可能）。&lt;br /&gt;
* 末尾が空白のフォルダにcdすることはできないが、Cygwinなどでそのようなフォルダをカレントディレクトリとした状態でcmdを起動した場合は、そのフォルダをカレントディレクトリとして起動する（外部プログラムの起動はできないがcdなどの内部コマンドは有効で、一度でも出たら戻れない）。&lt;br /&gt;
* 各種のパース規則が本当に謎。特に引用符周りは地獄である。[https://thinca.hatenablog.com/entry/20100210/1265813598 cmd.exe のコマンドラインの仕様を解析してみた &amp;amp;#45; 永遠に未完成]を読むとわかるが、例えば「ファイル名を指定して実行」で以下の挙動を確かめよう。&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;と出る&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c &amp;amp;amp; d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;echo &amp;amp;quot;a b&amp;amp;quot;c&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;d&amp;amp;quot;&amp;lt;/code&amp;gt;がそれぞれ別々に実行される&lt;br /&gt;
** すなわち、&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が一見特殊文字でないかのような振る舞いをする（そのまま出力される）割に、その前後で特殊文字の扱いが切り替わっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
* 以下、wtと略す（実行ファイル名がwt.exeなため）。パスが通っているものと仮定する。&lt;br /&gt;
* wtでは&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;が特殊文字になるようで、&amp;lt;code&amp;gt;\&amp;amp;#59;&amp;lt;/code&amp;gt;とエスケープが必要。[https://github.com/microsoft/terminal/issues/13264 https://github.com/microsoft/terminal/issues/13264] かな？&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;も&amp;lt;code&amp;gt;\&amp;amp;quot;&amp;lt;/code&amp;gt;にする必要がある。一方で、単一の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;は（うしろに&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;などがなければ）そのまま&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;になるようである。大丈夫なのか…？&lt;br /&gt;
* 起動時にカレントディレクトリがユーザーフォルダ（%USERPROFILE%）になる&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#45;d&amp;lt;/code&amp;gt;オプションで明示的に指定することができる&lt;br /&gt;
&lt;br /&gt;
==== 連続空白 ====&lt;br /&gt;
&lt;br /&gt;
空白が連続するファイル名の対応は割と厄介である。Windows側では引数を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;で囲うことで、またsh側では適宜&amp;lt;code&amp;gt;IFS&amp;amp;#61;&amp;lt;/code&amp;gt;と設定することで対処できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Unicode対応 ====&lt;br /&gt;
&lt;br /&gt;
* UTF8を使おう&lt;br /&gt;
* &amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が一応使えるが、一旦シェル内部に入らないと使えないのでやや不便&lt;br /&gt;
** 使わなくても大丈夫なときもある。あまりちゃんと理解できていないが、経験上、powershellで&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;変数を用いて標準入力を受け取る際には&amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が必要そう。&lt;br /&gt;
* /bin/printfやprintfの実行時には&amp;lt;code&amp;gt;LANG&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;en_US.UTF8&amp;lt;/code&amp;gt;とかに設定する。&lt;br /&gt;
** Cygwinなら不要？&lt;br /&gt;
&lt;br /&gt;
==== デバッグ時 ====&lt;br /&gt;
&lt;br /&gt;
* 管理者権限のものを試すときでもまず&amp;lt;code&amp;gt;&amp;amp;#45;Verb Runas&amp;lt;/code&amp;gt;を外して動作確認するとよい。&lt;br /&gt;
* 後述のwaitrunも役に立つだろう。&lt;br /&gt;
* 特殊文字に関しては、最初は空白のないフォルダ、次に空白のあるフォルダや連続空白のあるフォルダ、次にシングルクォートや&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;を含むフォルダなどとだんだん難しくしていくとよい。&lt;br /&gt;
* それとは別に、Unicode対応、&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;（ドライブ直下）対応、259文字のフォルダ対応（後述）などをチェックする&lt;br /&gt;
* 難しい例は、例えば&amp;lt;code&amp;gt;z  𠮷𠮷%PATH%  &amp;amp;#39;  &amp;amp;#39;&amp;amp;#39;  `  `` $PATH &amp;amp;amp; &amp;amp;amp;&amp;amp;amp;   %%PATH%%&amp;amp;#91;&amp;amp;#93; &amp;amp;#93; &amp;amp;#91;  ^  ^^   &amp;amp;#39;  &amp;amp;#59;  &amp;amp;#59;&amp;amp;#59;  𩸽𩸽!PATH!&amp;amp;#35;$%&amp;amp;amp;&amp;amp;#39;()&amp;amp;#61;&amp;amp;#126;&amp;amp;#123;`+&amp;amp;#125;_,.&amp;amp;#93;&amp;amp;#91;&amp;amp;#59;@^&amp;amp;#45; &amp;amp;#45; ‘ ’ ‚ ‛&amp;lt;/code&amp;gt;のような感じ（適当）。こんなファイル名を現実に見ることはないが、エクスプローラー上で普通に入力できる内容である。&lt;br /&gt;
** 「𠮷」はBMP外かつJIS外の漢字としては最も変換で出しやすいのでテストに重宝する。（𩸽はBMP外だがJIS外ではない（第4水準））&lt;br /&gt;
&lt;br /&gt;
==== その他 ====&lt;br /&gt;
&lt;br /&gt;
* デフォルトシェルは、通常ユーザーはwtでも管理者の場合はconhostに設定されているっぽい？&lt;br /&gt;
* &amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のようなドライブ直下のパスは末尾に&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を付けなければいけないことが多い。たとえばwt &amp;amp;#45;dの引数にする場合など。またcmdでcdコマンドや&amp;lt;code&amp;gt;CD&amp;lt;/code&amp;gt;環境変数を見るときもドライブ直下のときだけは&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;が付いて返ってくる。&lt;br /&gt;
** ただ、wt &amp;amp;#45;d に&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;lt;/code&amp;gt;が渡されるように見えるのになぜか動いているものもある。未調査。&lt;br /&gt;
* shやcmdなどの中に一旦入ってしまうと一部の環境変数などが書き換わってしまうかもしれないが、多少は許容することとする。&lt;br /&gt;
* コマンド例は網羅的でない可能性があり、色々な書き方を提示しようとあえて統一していないところもある。現実にはもっと簡単なやり方があるかもしれない。あくまで一例ということで。&lt;br /&gt;
* CygwinとGit Bashはほぼ同じなのでGit Bashを主に載せてCygwinは適宜差分のみ記述する。&lt;br /&gt;
* shは、特にベースのシェルとして使うにはエスケープの方式などでWindowsと相性が悪く使いづらい感じがする。逆にcmdは内部コマンドは地獄だがベースのシェルとしては意外と副作用が少なく、そう悪くはない。&lt;br /&gt;
* 以下の例ではCygwinやGit Bashの実行ファイルにはPATHを通していないことを想定している。&amp;lt;code&amp;gt;C&amp;amp;#58;\cygwin64&amp;lt;/code&amp;gt;あたりは適当に読み替えていただきたい。&lt;br /&gt;
* 2021年途中ごろまで、wtなどのストアアプリ系？の実行ファイル（Explorer上で0バイトになってるエイリアス）をGit Bashから実行できない（Permission deniedとなる）バグがあった。 [https://github.com/git-for-windows/git/issues/2675 https://github.com/git-for-windows/git/issues/2675]&lt;br /&gt;
* ネットワークドライブは各ユーザー対象に割り当てられているせいなのか、&amp;lt;strong&amp;gt;管理者として実行すると利用できない&amp;lt;/strong&amp;gt;らしい。割り当てられる前のネットワークパス自体は有効。&lt;br /&gt;
* wtを管理者権限で呼び出すときに（確率的に）ウインドウが最前面にならないことがある。chcpの有無で変わったりするなど詳細不明。conhostだとならない気がする。startrunなどを介して実行すると必ず最前面に出るようになるっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;準備&amp;amp;#58;-win&amp;amp;#45;console&amp;amp;#45;delegator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 準備&amp;amp;#58; win&amp;amp;#45;console&amp;amp;#45;delegator ==&lt;br /&gt;
&lt;br /&gt;
cmdやPowerShellやCygwinのbashなどのシェルを使えば、スクリプトを起動して複雑なコマンドを呼び出せたり、パイプ実行が可能になったりと色々便利だが、それだけのためには大仰すぎて、特殊文字の扱いなどがかえって仇になることもある。&lt;br /&gt;
&lt;br /&gt;
そこで、シェル関連の操作に汎用的に使えるコマンドをいくつか作成して公開した。[https://github.com/ge9/win-console-tools https://github.com/ge9/win-console-tools]&lt;br /&gt;
&lt;br /&gt;
* 以前はC++で書いていた（[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]）が、C&amp;amp;#35;のほうが文字列の扱いなどが簡明。&lt;br /&gt;
&lt;br /&gt;
ただし、これはあくまで筆者が独自に作ったものであり、Windows標準のもので何とかしようとするのが面白いところでもあるので、それほど積極的には使わない。今後出てくる例はすべて、これらを一切使わなくても（余計な環境変数が設定されてしまうかもしれないという点をのぞけば）同等の機能が実現できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられた引数を特定の文字列とつなげて実行してくれるプログラム。この実行ファイル自体の名前を適宜変更して使用し、「特定の文字列」は別のファイルから読ませる。使用例は[[Windowsでのターミナル環境|Windowsでのターミナル環境]] を参照。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;amp;#45;gui&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;runotherとほぼ同じだが、コンソールアプリケーションではなくWindowsアプリケーション（黒いウインドウが出ない、cmd上で実行したときに終了待ちが行われないなど）。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;evalrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行し、その出力をそのままコマンドラインとして実行するコンソールアプリケーション。（テキストファイルからのコマンドラインの読み込みなどに使える）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;startrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインをWindowsのデフォルトシェルで起動するだけのWindowsアプリケーション。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;waitrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行したあとキー入力を待ってから終了するコンソールアプリケーション。一瞬でウインドウが消えてしまうときのデバッグに使いやすい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;hiderun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;コンソールウインドウ非表示の状態で与えられたコマンドを実行するWindowsアプリケーション。（GUIアプリケーションなどを与えた場合は非表示にならないかも）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;vbsのvbHideでも非表示にできるが、コンソールウインドウの表示位置をみると非表示のウインドウが一つ挟まっていることが分かるのに対して、こちらの場合はそうならない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを最初の&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;とそれ以降の2つに区切ってそれぞれコマンドとしてパイプでつなげて実行するコンソールアプリケーション。ただし最初のコマンドのほうに&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;自体を入力したいときは&amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;でエスケープする。また2つ目のコマンドの先頭の空白は除去される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperunex&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;piperunと似ているが、2つだけでなく3つ以上の任意個のパイプ実行を一度に行う。一見便利だが、コマンドの後ろ側に未知の文字列が渡される場合、&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;をエスケープする必要が生じる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun piperunex command1 || command2 || ... || commandN | unknown_commandline&amp;lt;/code&amp;gt;のように外側を&amp;lt;code&amp;gt;piperun&amp;lt;/code&amp;gt;で囲うと安全。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;adminrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを管理者として実行するWindowsアプリケーション。&amp;lt;code&amp;gt;ShellExecuteEx&amp;lt;/code&amp;gt;では実行ファイルパスと引数は別々に指定しなければいけないので最低限の引数の解析を行っている。PowerShell経由で管理者権限で実行するときのような面倒なエスケープが全て不要になるため非常に使いやすいが、この記事ではこれに依存しないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみにこういうのもある。[https://github.com/mattn/sudo mattn/sudo&amp;amp;#58; sudo for windows] これは、通常のUACのように別ウインドウで実行するのではなく、localhostのランダムなポートを使い、自分自身にポート番号を渡しつつ管理者権限で呼び出すことで標準入出力を転送し、元の端末でそれを読み書きできるという点で、linuxのsudoに近い。しかし標準入出力を介しているので、&amp;lt;code&amp;gt;cmd /c for /?&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cmd /c pause&amp;lt;/code&amp;gt;の挙動が変わってしまうという問題がある。また、呼び出し元でchcp 65001をしていると文字化けする。また、コマンドライン引数を一旦配列に分割してから組み直しているので情報が一部落ちている。あと、セキュリティ的にも懸念があるかもしれないが、これはそもそもLinuxのsudo自体がまずどうなの？という気持ちになった。（未解決）（参照&amp;amp;#58; [https://twitter.com/e9g/status/1687385469921931264?s=20 https&amp;amp;#58;//twitter.com/e9g/status/1687385469921931264?s&amp;amp;#61;20]）&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;uacrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startrunと同じだが、コンパイル時のマニフェスト設定でこのプログラム自体の実行に管理者権限を要求するようにしたので、adminrunと同じように使える（管理者権限で実行する対象が渡されたコマンドではなくuacrun自体になるという違いはある）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pecho&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドライン引数をそのままコンソールに出力する。→WindowsでUnicode文字（特にU+10000以上）を正しく表示（&amp;amp;amp;ファイルに書き込み）するには、「出力先がコンソールならWriteConsoleW、そうでなければWriteFileを使用する」といった非常に面倒な実装が必要であり（参照&amp;amp;#58; [https://twitter.com/mattn_jp/status/542581083242364928 https&amp;amp;#58;//twitter.com/mattn_jp/status/542581083242364928] など）、C++やC&amp;amp;#35;では扱いづらい。そこでrustを用いて実装した。→[https://github.com/ge9/pure-echo-win pure&amp;amp;#45;echo&amp;amp;#45;win]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;printcd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;カレントディレクトリをコンソールに出力する。（ちなみにpwdの由来はprint working directoryなのでそれに倣った）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;注意&amp;amp;#58;-当初は後述のnoworkingdirectoryを知らなかったので1の方法に頼っていたが実際には2の方法のほうが簡明なのでそちらを使うことを勧める1と11は残しておくが読む必要はあまりない&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 注意&amp;amp;#58; 当初は後述のNoWorkingDirectoryを知らなかったので1.の方法に頼っていたが、実際には2.の方法のほうが簡明なので、そちらを使うことを勧める。1.（と1.1.）は残しておくが、読む必要はあまりない。 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Windowsでエクスプローラーからフォルダを各種ターミナルで開く}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1標準入力から受け取る場合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.標準入力から受け取る場合 ==&lt;br /&gt;
&lt;br /&gt;
まず「標準入力からディレクトリのフルパスを受け取り、そのディレクトリで各種ターミナルを起動するコマンド」を紹介する。&lt;br /&gt;
&lt;br /&gt;
そのようなコマンドを仮に&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;とすると、ExecuteCommand&amp;amp;#45;Pipeを使用して、レジストリ（該当CLSIDのLocalServer32の既定の値）に以下のように書くことで、CLSIDが右クリックメニューのDelegateExecute値に使えるようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\ExecuteCommand4000.exe h openterm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;はコンソールウインドウを非表示にするExecuteCommand&amp;amp;#45;Pipeのオプションである。&lt;br /&gt;
&lt;br /&gt;
また、この&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分は非常に長くなることがあり、その場合レジストリに書いて直接編集するのは手間がかかる（操作もしづらいし、更新を即座に反映させるために「&amp;lt;code&amp;gt;LocalServer32&amp;lt;/code&amp;gt;」キーの名前などを変えて戻す必要もあって面倒）。そこで、runotherを使ってtxtに&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の内容をそのまま書くことで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分にそのexeの名前だけを書けばよくなる。&lt;br /&gt;
&lt;br /&gt;
また、いくつかはCygwin/Git Bash向けに冒頭でcygpathによる変換を入れているが、これを取り除けば、Cygwin/Git Bash用のパスを受け取って動作するコマンドということになる。&lt;br /&gt;
&lt;br /&gt;
では以下で、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分についてそれぞれ紹介する。&lt;br /&gt;
&lt;br /&gt;
* 直接コマンド記入でも&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を指定すれば&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;に対応できるというのをこのセクションの大部分を書き終えてから知ったので、&amp;lt;strong&amp;gt;このセクションは内容の多さの割には実際の必要性はそこまで大きくないかもしれない&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git&amp;amp;#45;bashexeで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;で開く ====&lt;br /&gt;
&lt;br /&gt;
この場合shの感覚で&amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;に引数を渡せば勝手にminttyのウインドウで開いてくれるので最も楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.utf8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Git BashのcygpathでGit Bash用のパスに変換&lt;br /&gt;
* printfでエスケープ、utf8を設定&lt;br /&gt;
* git&amp;amp;#45;bash.exeに渡す&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-①startrunを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ①startrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\Git\bin&amp;lt;/code&amp;gt;のbashではなく/usr/binのbash.exeを使う。以後同じ。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-②cmdのstartを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ②cmdのstartを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/\\^/^^/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;amp;/^&amp;amp;amp;/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125; ^| sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* この場合、cmdによる環境変数への置換を避ける必要があるほか、キャレットによるエスケープにも対応する必要がある。&lt;br /&gt;
* Git Bashからcmdを実行しているので&amp;lt;code&amp;gt;//c&amp;lt;/code&amp;gt;のところのスラッシュは2つ。&lt;br /&gt;
&lt;br /&gt;
==== conhostで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; conhost &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conhostによる環境変数の置換を抑制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminalで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminalで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8 printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g) \\&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記に加えてセミコロンへの対応が必要なのと、こっちは/bin/printfじゃなくて組み込みのprintfでこうしないとだめだった。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Cygwin ====&lt;br /&gt;
&lt;br /&gt;
付属のminttyを使うものだけはGit Bashと割と差があるので載せる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\mintty.exe&amp;amp;quot; &amp;amp;#45;e &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-startrun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, startrun ====&lt;br /&gt;
&lt;br /&gt;
* パスのエスケープがおかしい気がするが、なぜか動いている&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun powershell  &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;quot;&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;&amp;amp;#39;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-cmdのstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, cmdのstart ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;\&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;\&amp;amp;#39;.Replace(\&amp;amp;#39;&amp;amp;#61;^%\&amp;amp;#39;,\&amp;amp;#39;%\&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] でも書いた通り、Windows側は&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのフォルダだけは（その必要があるにもかかわらず）8.3形式を使った短いパスにして渡してくれない。そこで、パス長さが258を超えていればcmdに渡して8.3形式の名前に変換する処理をPowerShell側で行う。この際はエスケープされていない正確なパス名をcmdに渡さなければならないので&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の値を一時的に&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に設定する方法をとっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;念のため再確認しておくが、この&amp;lt;code&amp;gt;&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;&amp;lt;/code&amp;gt;の部分は&amp;lt;code&amp;gt;&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;などと変えておかないと、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;が定義されていた場合に正しく動作しない。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cmdでは&amp;lt;strong&amp;gt;ちょうど258文字&amp;lt;/strong&amp;gt;のフォルダでもdirが失敗するなど挙動が不自然であるため、もう少し保守的に&amp;lt;strong&amp;gt;257&amp;lt;/strong&amp;gt;を超えていれば短くするという仕様でもいいかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（追記）8.3形式のパスを取得するのは普通にPowerShell内でもできるらしい…。以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; (New&amp;amp;#45;Object &amp;amp;#45;ComObject Scripting.FileSystemObject).GetFolder($mypath).ShortPath&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
259文字のフォルダを無視するなら以下のように簡潔に済む。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command wt &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39; $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
これは案外難しい。なぜなら、cmd内でcdさせるのは%のエスケープの関係で難しく（cmd内で&amp;amp;#61;を含む文字列を置換することがどうやってもできなさそう（外部プログラムを呼び出すのも難しそうだった）なので、未定義の変数を探索するやり方しかない）、Start&amp;amp;#45;Processの&amp;amp;#45;WorkingDirectoryやCygwinのshは8.3形式に対応していないからである。要は「与えられたディレクトリ（8.3形式のパスが含まれるかもしれない）をカレントディレクトリとして与えられたコマンドを実行する」だけやってくれるプログラムがあればよく、これ自体はそう難しくないことのはずだが、現状、Windows標準環境でこれができるのは自前でプログラムをコンパイルする以外だと（pwshを入れていいならpwshと）&amp;lt;strong&amp;gt;vbsしかない&amp;lt;/strong&amp;gt;ようである。結局、この部分をついでにやってくれるWindows Terminalのほうが楽ということになる。&lt;br /&gt;
&lt;br /&gt;
たとえば以下のようなvbsを用意する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Set objShell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)&lt;br /&gt;
objShell.CurrentDirectory = WScript.Arguments(1)&lt;br /&gt;
objShell.Run(WScript.Arguments(0)),,False&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;startatdir.vbs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のように書ける。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なお&amp;lt;code&amp;gt;startatdir.vbs&amp;lt;/code&amp;gt;のパス指定はフルパスが必要そう（ただしここはcmd /cの中なので&amp;lt;code&amp;gt;%USERPROFILE%&amp;lt;/code&amp;gt;とかを使って書いてもよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11標準入力から受け取る場合-&amp;amp;#45;-管理者権限あり&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.1.標準入力から受け取る場合 &amp;amp;#45; 管理者権限あり ==&lt;br /&gt;
&lt;br /&gt;
上記の続きで、こちらは管理者権限ありのもの。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39; &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39;, &amp;amp;#39;&amp;amp;quot;`&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe`&amp;amp;quot;&amp;amp;quot;&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;i&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start&amp;amp;#45;Process自体がstartみたいなものなので、引数にコンソールアプリケーションを指定したらデフォルトシェルで開かれる。&lt;br /&gt;
* 最後のところ、「&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;」のかわりに「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 とか「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 でも動くのは謎。シングルクォーテーションのエスケープ規則がわからない。参考→[https://twitter.com/e9g/status/1678283164689760256 https&amp;amp;#58;//twitter.com/e9g/status/1678283164689760256]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF&amp;amp;#45;8 printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39; , &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39; &amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== adminrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; /bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; adminrun wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; &amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#123;&amp;amp;#125;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cygwin系なしで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;set&amp;amp;#45;location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;literalpath&amp;amp;#39;,  (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;) &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
再び、startatdir.vbsを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;gt; nul &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59; $bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。259文字のフォルダを無視するなら以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2直接コマンド記入の右クリックメニュー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2.直接コマンド記入の右クリックメニュー ==&lt;br /&gt;
&lt;br /&gt;
レジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定の値に直接コマンドを記入する方式である。&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、右クリックメニューを&amp;lt;strong&amp;gt;押した時点&amp;lt;/strong&amp;gt;でのフォルダ（フォルダを右クリックするメニューからだと&amp;lt;strong&amp;gt;対象フォルダの親&amp;lt;/strong&amp;gt;、フォルダ背景を右クリックするメニューなら対象フォルダ）をカレントディレクトリとしてコマンドが起動される。そのため&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けなければならないような長大なパスのフォルダでは動作しない。しかし、&amp;lt;code&amp;gt;shell\xxxx&amp;lt;/code&amp;gt;キーに&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;値&amp;lt;/strong&amp;gt;を設定することで、カレントディレクトリが必ず&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32&amp;lt;/code&amp;gt;に設定されるようになるので動くようになる。&lt;br /&gt;
&lt;br /&gt;
対象のディレクトリはどう取得するかというと、レジストリに書き込んだ値のうち&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という部分が対象ディレクトリに書き換えられて&amp;lt;/strong&amp;gt;コマンドが実行される。この&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;もC&amp;amp;#58;などの場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;になる。コマンドの中で&amp;lt;strong&amp;gt;そのまま%という文字を使いたい場合はバッチファイルと同様に%%とエスケープする必要がある&amp;lt;/strong&amp;gt;ようである（これはどこにも書いてない？）。&lt;br /&gt;
&lt;br /&gt;
しかし、こうして渡される（特殊文字を含むかもしれない）ディレクトリ名を完璧に取得するのは意外と難しい。cmdに解釈させると&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換されてしまうし、シングルクォートとバッククォートが両方含まれているのでpowershellやshに渡すのも簡単ではない。&lt;br /&gt;
&lt;br /&gt;
コツは、powershell &amp;amp;#45;commandやsh &amp;amp;#45;cの中に直接書くのではなく、&amp;lt;strong&amp;gt;スクリプトへのコマンドライン引数として渡した上で、スクリプト内で引数として取得する&amp;lt;/strong&amp;gt;ことである。それぞれ、基本形（そのまま出力するだけ）は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;powershell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;というトークンを入れることでその後のパラメータの解析を行わないようにできる。args&amp;amp;#91;0&amp;amp;#93;は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;になるのでargs&amp;amp;#91;1&amp;amp;#93;を使う。レジストリに書く際は&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をエスケープして&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%%&amp;lt;/code&amp;gt;。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;でも同様のことができる？&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;0&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;（args&amp;amp;#91;&amp;lt;strong&amp;gt;0&amp;lt;/strong&amp;gt;&amp;amp;#93;になっていることに注意）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;というか、&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;で書き進めてしまったが、本当は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;のほうが安定するかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;あるいは&amp;lt;code&amp;gt;$MyInvocation.Line&amp;lt;/code&amp;gt;を使う方法もある。この場合、powershellへの引数が全て（この例なら&amp;lt;code&amp;gt;&amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; ...&amp;lt;/code&amp;gt;のところから）取得されるので、目当ての部分を取り出すためにここでは最後から2番目の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;と最後の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;の間を取得するという風にしている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39; &amp;amp;#59; Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;昔のPowerShell（2くらい）で試してみたらこちらでないと&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;あたりの処理がうまくいかない場合があった。argsを使うものからの書き換えは容易である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;sh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;sh &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;最後が&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;lt;/code&amp;gt;と閉じられていないのはミスではなく、&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;としてしまうと&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のときに&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;が渡されてしまうのでそれを避けるためである（これはかなりトリッキーなのでもう少し真面目にやってもいいかなとは思う）。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UNCパスの最初の&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;が&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;に変わってしまう（手元では、Cygwinの場合は&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみで発生している？）という問題があり、適宜置換する必要がある。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの書き方はいわゆる「ワンライナー」的なものであるが、もちろん外部にスクリプトファイルを用意してもよい。&lt;br /&gt;
&lt;br /&gt;
また、外部にスクリプトを用意してよいという条件であれば、&amp;lt;strong&amp;gt;vbsも使用可能&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この場合、まずレジストリには&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wscript &amp;amp;quot;C&amp;amp;#58;\path\to\script.vbs&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などと書く。スクリプトの内容は上記のレジストリの内容をほぼそのままWscript.ShellでRunすればよいが、&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;のかわりにWscript.Arguments(0)を挿入するのと、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;にエスケープしなくてよいのと、VBSなので文字列内の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;は&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えなければならない。これに加え、Runの引数に含まれる&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換の対象となるため、対象フォルダの文字列については&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;への置換でエスケープして、呼び出し先のpowershellなどで元に戻す。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;必要に応じてRunのオプションでvbHideを指定する。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;というか別に258文字を超えていたら云々みたいな処理も全部vbs側でやってしまってもよい（面倒なのでそういう例は載せていない）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
バッチファイルに渡すのは、バッチファイルをcmdが呼び出す時点で&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のようなファイル名の環境変数は既に展開されてしまうので、どうやっても不可能。&lt;br /&gt;
&lt;br /&gt;
他には、（hiderunと）piperunとpechoを併用するという方法もあり、それらの実行ファイルを用意する必要があるという以外は綺麗にできる方法である。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、一旦取得できてしまえばあとは前述の&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込むだけでよい。ただ、実際にはわざわざ&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込まなくても（パイプを使わなくても）もっと簡単に起動できることもあるのでそちらを中心に紹介する。&lt;br /&gt;
&lt;br /&gt;
* commandの最初で指定する（メインの）実行ファイル（先ほどなら&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;）をファイル名単体で書く場合は、それが（メニューをHKCUで設定するならHKCUの（最近のWindowsならHKLMのでも可？）、HKLMで設定するならHKLMの）&amp;lt;strong&amp;gt;App Pathsキー&amp;lt;/strong&amp;gt;に登録されていなければならない（&amp;lt;strong&amp;gt;PATHは通っていなくてもいい&amp;lt;/strong&amp;gt;）。登録されていない場合はフルパスで指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
=== 設定例 ===&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限なし ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考までに、Windowsにもともと入っているメニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell.exe &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これだとシングルクォートと連続スペースに対応できない。連続スペースだけなら&amp;lt;code&amp;gt;&amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;%V&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えると解決できる。&amp;lt;code&amp;gt;%$&amp;amp;#91;&amp;amp;#93;`&amp;lt;/code&amp;gt;あたりは見た感じ問題なし。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;以下の解決策でもまだ不完全 [https://superuser.com/questions/1310258/open-powershell-window-here-file-explorer-context-menu-command-breaks-with-fol &amp;amp;quot;Open PowerShell window here&amp;amp;quot; File Explorer context&amp;amp;#45;menu command breaks with folder names with apostrophes (single quotes) &amp;amp;#45; Super User]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この問題は[https://github.com/PowerShell/PowerShell/issues/6598 https://github.com/PowerShell/PowerShell/issues/6598]や[https://github.com/PowerShell/PowerShell/pull/6660 https://github.com/PowerShell/PowerShell/pull/6660] で扱われており、結局pwshでは&amp;amp;#45;WorkingDirectoryというパラメータが追加された。[https://github.com/PowerShell/PowerShell/issues/14091 https://github.com/PowerShell/PowerShell/issues/14091]にある以下の文字列をレジストリに書いたところ、正しく動作したので、pwshではこれでよい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh.exe &amp;amp;#45;NoExit &amp;amp;#45;RemoveWorkingDirectoryTrailingCharacter &amp;amp;#45;WorkingDirectory &amp;amp;quot;%V!&amp;amp;quot; &amp;amp;#45;Command &amp;amp;quot;$host.UI.RawUI.WindowTitle &amp;amp;#61; &amp;amp;#39;PowerShell 7 (x64)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;wt powershell &amp;amp;#45;noexit &amp;amp;#45;Command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;wtで。標準入力のときとほぼ同じ。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windowsにもともと入っているメニューでは以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cmd.exe /s /k pushd &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くパスを除いて）ほとんどの場合に正しく機能するが、&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のような文字列が含まれているフォルダではうまくいかない。ちなみにpushdによりUNCパスには自動的にネットワークドライブが割り当てられる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;mintty（git&amp;amp;#45;bash.exe使用）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;ちなみに、Git Bashのインストーラにより設定される「Git Bash Here」メニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;quot;&amp;amp;#45;&amp;amp;#45;cd&amp;amp;#61;%v.&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、特殊文字にはすべて対応しているが、（NoWorkingDirectoryをつけたとしても）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;で始まるパスではうまくいかない。最後の「.」はよくわからないがこれを付けておくと&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;cd&amp;lt;/code&amp;gt;がうまくやってくれるっぽい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;export MSYSTEM&amp;amp;#61;MINGW64&amp;amp;#59;exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe\&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;置換の対象を&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみとするためsedの引数に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が増えている&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;環境変数の置換を抑止する必要がある。デフォルトシェルで起動するならこれは不要（で、wtでないので&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;のエスケープも不要）で、以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MyInvocationを使う例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;vbsの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;次の節で解説する「（自分が起動された）カレントディレクトリでの起動」にも対応している（引数がない場合）。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Dim curDir&lt;br /&gt;
&lt;br /&gt;
Set ws = CreateObject(&amp;quot;Wscript.Shell&amp;quot;)&lt;br /&gt;
Dim dir&lt;br /&gt;
If WScript.Arguments.Count = 0 Then&lt;br /&gt;
   dir = ws.CurrentDirectory&lt;br /&gt;
Else&lt;br /&gt;
   dir = Wscript.Arguments(0)&lt;br /&gt;
End If&lt;br /&gt;
dir = Replace(dir,&amp;quot;%&amp;quot;,&amp;quot;==%&amp;quot;)&lt;br /&gt;
ws.run &amp;quot;powershell -Command &amp;quot;&amp;quot;&amp;amp; {Start-Process -Verb Runas -Filepath wt -Argumentlist powershell, -noexit, -command, Set-Location, -LiteralPath, (&#039;\&amp;quot;&amp;quot;&#039;&#039;&#039;+($args[1].Trim(&#039;\&amp;quot;&amp;quot;&#039;) -replace &#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;&#039; -replace &#039;;&#039;, &#039;\;&#039; )+&#039;&#039;&#039;.Replace(&#039;&#039;==%&#039;&#039;,&#039;&#039;%&#039;&#039;)\&amp;quot;&amp;quot;&#039;)}&amp;quot;&amp;quot; --% &amp;quot;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;amp;dir&amp;amp;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;, vbHide&lt;br /&gt;
&lt;br /&gt;
Set objShell = Nothing&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この場合も&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。デフォルトシェルなら、startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;理論上はワンライナーでも書けるが、エスケープが面倒すぎるのでファイルに書いたほうがよいだろう。まずレジストリの中身は以下のようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\path\to\gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;で、&amp;lt;code&amp;gt;gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;lt;/code&amp;gt;の中身は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
IFS=&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
echo $*|/bin/sed &#039;s/\\/\\\\/&#039;|/bin/cygpath -f -|printf %q $(/bin/cat) |/bin/sed &amp;quot;s/&#039;/&#039;&#039;/g;s/%/==%/g;s/;/\\\\;/g&amp;quot;|/bin/xargs -d &#039;\n&#039; -I {} powershell -Command Start-Process -Filepath wt -ArgumentList &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\env.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &#039;&amp;quot;MSYSTEM=MINGW64&amp;quot;&#039; , &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\sh.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &amp;quot;&#039;--login&#039;&amp;quot;, &amp;quot;&#039;-c&#039;&amp;quot;, &amp;quot;&#039;&amp;quot;&#039;&amp;quot;IFS=\;cd $(echo {}| /bin/sed s/==%/%/g) \; exec bash&amp;quot;&#039;&amp;quot;&#039;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cygwinも同様である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-codeのメニューおまけ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== VS Codeのメニュー（おまけ） ====&lt;br /&gt;
&lt;br /&gt;
「Code で開く」メニューのcommand値は以下のように設定されている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Microsoft VS Code\Code.exe&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは特殊文字などに関しても問題なく動作するうえ、実はそのまま&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付いたパスにも適用可能である。従って、&amp;lt;code&amp;gt;VSCode&amp;lt;/code&amp;gt;キーに&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;値を設定する（設定の書き換えまたはHKCUによるオーバーライド）だけで、長大フォルダでもVS Codeが使えるようになる。ターミナルの起動には失敗してしまうがファイル・フォルダの作成・編集などの基本操作がGUIでできるので意外と便利（もちろん、他のBetter Explorer的なツールを使う手もあるだろう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-エクスプローラーのアドレスバーから&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. エクスプローラーのアドレスバーから ==&lt;br /&gt;
&lt;br /&gt;
このときは、末尾が空白のパスや&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が必要な長大パスやちょうど259文字のフォルダはそもそも対応していないので考えなくてよい。しかし通常のネットワークファイル向けのUNCパス（&amp;lt;code&amp;gt;\\192.168.1.1\disk&amp;lt;/code&amp;gt;など）に対応する必要はあるので、cmdをベースにすることはできない（cmdの中に入った時点でカレントディレクトリが変わってしまう）。また&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;が含まれるパスをカレントディレクトリにできないことから、powershell.exeもベースとしては使えない。&lt;br /&gt;
&lt;br /&gt;
なので、パイプを使って先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;にむけて流し込もうと思ったら選択肢はpwsh.exeかpiperunかCygwin系だけである。それぞれの書き方は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pwsh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;上とほぼ変わっていないが、pwshはディレクトリの取得だけで使っているので&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;のところで環境変数が汚染されるのを防げる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin/Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cmd //c \&amp;amp;quot;chcp 65001 &amp;amp;gt; nul\&amp;amp;quot;| pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | openterm&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;一つ問題があり、hiderunを使う（コンソールを非表示にする）とchcpが効かないようで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;でPowerShellの&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使っているとUnicode文字が化けてしまう。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分で先頭にcygpathが入っているものを使うときは、そちらのcygpathとこちらでのcygpath &amp;amp;#45;wは打ち消し合って無駄なので消してよい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このほかにvbs(wscript)もカレントディレクトリの取得のところは問題なくやってくれるので、それをさっきのWscript.Arguments(0)のかわりに使えばよい。&lt;br /&gt;
&lt;br /&gt;
最初に表示されるコンソールを非表示にしたければ、&amp;lt;code&amp;gt;hiderun&amp;lt;/code&amp;gt;を付けてrunother経由で実行するのが手軽だが、前述の通りvbsも拡張子無しで呼び出せるように設定できるので、そうした上でvbHideで隠してもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;管理者権限なし-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 管理者権限なし ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
これは普通にcmdと打てばよい。&lt;br /&gt;
&lt;br /&gt;
（デフォルトシェルがconhostだとして）wtで開きたいときは、&amp;amp;#59;をエスケープして&amp;amp;#45;dで渡す。以下の通りbatファイルを作ってpathを通す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wtではなくconhostの場合はconhost cmdだけでよい。batにするなら&amp;lt;code&amp;gt;start &amp;amp;quot;&amp;amp;quot; conhost cmd&amp;lt;/code&amp;gt;でよい。&lt;br /&gt;
&lt;br /&gt;
コンソール非表示ならcmd /cをつけてhiderunする。runotherで、txtの中身は以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
pwshはそのままpwshと打てばよい。powershell及びwtやconhostを明示的に指定する場合について以下で述べる。&lt;br /&gt;
&lt;br /&gt;
たとえばwtでpwshなら、runotherを使って、txtの内容は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command wt &amp;amp;#45;d $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellの場合は&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;に対応するため起動後に移動する。runotherでpiperunを使って、txtは以下。最終的に起動する方のpowershellで&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に戻している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pwshが使えるならprintcdのかわりに&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;でもよい。&lt;br /&gt;
&lt;br /&gt;
以下はpiperunを使わずshでやる例。前述の通りパイプからPowerShell側で&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使って受け取ると文字化けするので引数として渡す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$(pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath \(\&amp;amp;quot;&amp;amp;#39;$WD&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;,&amp;amp;#39;%&amp;amp;#39;)\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
Git Bashは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけてもカレントディレクトリを維持するので単純である。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinは起動後にcdする。そのかわり&amp;lt;code&amp;gt;export MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;が不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/bash &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#39;$(/bin/printf %q `pwd`)&amp;amp;#39;&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printfで一旦エスケープしたものをcdの後につなげてそのまま渡している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;wtで&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;あれ、wtなのにカレントディレクトリ維持されてる…？wt cmdではダメなのだが…&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;WD&amp;amp;#61;$(printf %q `pwd` | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59;  s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#39;$WD&amp;amp;#39;|sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 管理者権限あり ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
runotherを使って以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;gt; nul &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TrimEnd(&amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;のところは&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;の末尾のバックスラッシュへの対応である（&amp;lt;code&amp;gt;wt &amp;amp;#45;d &amp;amp;quot;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;は通らないので一見ダメそうだが、なぜかこれで動く。原因不明。）。&lt;br /&gt;
&lt;br /&gt;
batならそのまま以下の通り（黒い画面が一瞬出てしまう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
別解としてパイプを使わないものも載せておこう。cmdでは特殊文字ではないので&amp;lt;code&amp;gt;&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;に変えるのは簡単である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$args&amp;amp;#91;0&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;&amp;amp;#39;%CD&amp;amp;#58;&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下もうまくいく。cmdの&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に関する仕様により、例えばStart&amp;amp;#45;Processの直前に&amp;lt;code&amp;gt;echo &amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59;&amp;lt;/code&amp;gt;のような&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を奇数個含む文字列を入れると動かなくなる。argsを使うとバッククォートがうまくいかなかったのでMyInvocationを使ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl&amp;amp;#61;$MyInvocation.Line.Split(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%CD%\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
UNC非対応でよく、かつ（&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;をカレントディレクトリとして起動できる）pwshでよければ、上記のcmdをpwshに変えればよい。powershellならSet&amp;amp;#45;Locationで移動が必要。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UNC対応なら、管理者でないときと同じで、PSReadLineのエラーを回避するためpwshを一貫して使うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellならpiperunを使う。カレントディレクトリの取得にpwshを使っているがprintcdでもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;FilePath wt &amp;amp;#45;ArgumentList powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
shなら以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$( pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, \(\&amp;amp;quot;&amp;amp;#39;\\\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;$WD&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\\\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash ====&lt;br /&gt;
&lt;br /&gt;
runotherとpiperunで以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd || printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;をもっと手前で設定して、&amp;lt;code&amp;gt;&amp;amp;#45;ArgumentList&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を指定して、最後を&amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;にしてもよい。&lt;br /&gt;
&lt;br /&gt;
piperunを使わずにshで頑張ることもできるが、エスケープが多く読みづらくなる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd | printf %q $(/bin/cat) | /bin/sed \&amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g\&amp;amp;quot; | /bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;\&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe\&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, \&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinも同様。&lt;br /&gt;
&lt;br /&gt;
== 関連 ==&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9 コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/tmiki/items/0dab4fd17e9bed04ed91 【Windows】GitBashをcontext menuからAdministrator権限付きで実行する &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://note.com/redpeak/n/n5ddc3673117b エクスプローラーから管理者権限でコマンドプロンプトを開く方法｜ひるあんどん]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E%E6%94%AF%E6%8F%B4%E7%B3%BBLean&amp;diff=346</id>
		<title>定理証明支援系Lean</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E%E6%94%AF%E6%8F%B4%E7%B3%BBLean&amp;diff=346"/>
		<updated>2025-06-30T09:02:37Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Leanは、比較的新しい定理証明支援系（Lean以外にはCoqやIsabelleなどがある）である。&lt;br /&gt;
&lt;br /&gt;
== 概要 ==&lt;br /&gt;
&lt;br /&gt;
学術研究用なのもあって特にメジャーバージョンアップでは大きな破壊的変化がある。&lt;br /&gt;
&lt;br /&gt;
Lean2以前はよく調べていないがLean2にはHoTTサポートがあって3で無くなったらしい。3→4ではマクロシステムが刷新されたり、Leanの処理系のうちLean自体で書かれた部分がさらに増えたり？した。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean3 ===&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/ 公式]（githubでの名前はleanprover）と、[https://leanprover-community.github.io/ 半分公式みたいなコミュニティ]（githubでの名前はleanprover&amp;amp;#45;community）があって、公式では3.4.2まででアーカイブされているLean3もコミュニティversionでは3.47.0くらいになっている。また様々な分野の証明を集めたライブラリの[https://github.com/leanprover-community/mathlib mathlib]もコミュニティの成果物である。&lt;br /&gt;
&lt;br /&gt;
もうほとんど使われていないだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean4 ===&lt;br /&gt;
&lt;br /&gt;
Lean4は現在のところ「公式」のみで扱われている。手元では、WindowsとMacではしばらく動かなかったが、2022年9月中旬頃にelanが1.4.2になったタイミングで動くようになった。しかしVSCode拡張は大文字/小文字の区別をうまく扱えずGo to definitionが失敗する（大文字/小文字の区別があるファイルシステムではおそらく問題なし？？）。既知のバグ。 や など。&lt;br /&gt;
&lt;br /&gt;
VSCodeでの体感でもチェッカがLean3より明らかに速くなった。&lt;br /&gt;
&lt;br /&gt;
== 学習用リソース ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lean3 ====&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/learn.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/learn.html]にリストされている。&lt;br /&gt;
&lt;br /&gt;
最も基本的な使い方の解説が[https://leanprover.github.io/theorem_proving_in_lean/ Theorem Proving in Lean]であり、Leanを使って定理証明をする方法の概略が掲載されている。とりあえずはこれを読んでいけばいい。比較的よくまとまった資料であるが、Curry&amp;amp;#45;Howard同型についてなど、型理論や証明論の事前知識が多少はないと読むのはやや大変かもしれない。そのあたりの知識から解説しているものもいちおう上記の一覧にある。&lt;br /&gt;
&lt;br /&gt;
各tacticの動作など、辞書的な説明は[https://leanprover.github.io/reference/ reference manual]に載っている場合もあるが、こちらは未完成である。&lt;br /&gt;
&lt;br /&gt;
Programming in leanというのもあるが、これも少なくとも最近はあまりメンテナンスされていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;Programming in leanに関する詳細&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これまた未完成ではあるが[https://avigad.github.io/programming_in_lean/index.html Programming in Lean — Programming in Lean 3.4.2 documentation]を見ると説明が載っているかもしれない。programming in leanで検索すると、&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/programming_in_lean/programming_in_lean.pdf https&amp;amp;#58;//leanprover.github.io/programming_in_lean/programming_in_lean.pdf]&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/programming_in_lean/ https&amp;amp;#58;//leanprover.github.io/programming_in_lean/]&lt;br /&gt;
&lt;br /&gt;
（この2つは同じ内容）&lt;br /&gt;
&lt;br /&gt;
も出てくるが、こちらはリポジトリ([https://github.com/avigad/programming_in_lean avigad/programming_in_lean])と比較すると古いバージョンのようである（リポジトリの”old”フォルダの内容に対応している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Lean4 ====&lt;br /&gt;
&lt;br /&gt;
前述の各資料に対応して[https://leanprover.github.io/theorem_proving_in_lean4/title_page.html https&amp;amp;#58;//leanprover.github.io/theorem_proving_in_lean4/title_page.html]と[https://leanprover.github.io/lean4/doc/ https&amp;amp;#58;//leanprover.github.io/lean4/doc/]と[https://leanprover.github.io/functional_programming_in_lean/ Functional Programming in Lean]がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;publications&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Publications ==&lt;br /&gt;
&lt;br /&gt;
関連論文など&lt;br /&gt;
&lt;br /&gt;
[https://leanprover.github.io/publications/ https&amp;amp;#58;//leanprover.github.io/publications/]&lt;br /&gt;
&lt;br /&gt;
== 日本語情報 ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2020/11/25/095208 定理証明支援系Leanのインストールと初期設定（Linux）]（自分で書いたが、古いのでもう読まなくていい）&lt;br /&gt;
&lt;br /&gt;
[https://manau.jp/lean/leaninstall/ 定理証明支援系 LEAN のインストール]&lt;br /&gt;
&lt;br /&gt;
[http://myuon-myon.hatenablog.com/entry/2016/01/09/212750 Theorem Prover Leanの紹介 &amp;amp;#45; Just $ A sandbox]&lt;br /&gt;
&lt;br /&gt;
[https://myuon.github.io/posts/start-learning-proof-assistant/ 定理証明リンク集]&lt;br /&gt;
&lt;br /&gt;
くらい。あんまりないが、順調にいけば今後増えていきそうではある。&lt;br /&gt;
&lt;br /&gt;
* 2025/6追記 最近はもっと増えてそう&lt;br /&gt;
&lt;br /&gt;
== metaprogramming関連 ==&lt;br /&gt;
&lt;br /&gt;
Leanの証明記述用言語（tactic）は、Leanそれ自体の上で実装されている。バージョン3→4によってさらにその傾向が強まりそうである。&lt;br /&gt;
&lt;br /&gt;
tacticはmonadicな関数として実装されている。tacticをmonadで表現するというのはCoq用のMtac&amp;amp;#91;^ziliani2013Mtac&amp;amp;#93;などでも採用された手法である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3での例&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean3での例 ===&lt;br /&gt;
&lt;br /&gt;
筆者は研究活動の一環として、Lean 3のソースコード上に構造的に関連付けられた形でコメントを書けるようにするライブラリであるNtac（[https://github.com/ge9/ntac https://github.com/ge9/ntac]）を公開している。これはLean 3のmetaprogrammingを活かした例である。&lt;br /&gt;
&lt;br /&gt;
metaprogrammingについてはコミュニティのLearning resourcesの”Metaprogramming and tactic writing”の項目や[https://leanprover.github.io/papers/tactic.pdf https&amp;amp;#58;//leanprover.github.io/papers/tactic.pdf]を参考にした。また、独自のtacticシステムを作成するためのガイドとして、[https://leanprover-community.github.io/archive/stream/113488-general/topic/no.20lean.20messages.20output.20in.20hacked.20mode.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/archive/stream/113488&amp;amp;#45;general/topic/no.20lean.20messages.20output.20in.20hacked.20mode.html]に実装上のヒントを得た。&lt;br /&gt;
&lt;br /&gt;
* 基本的には、&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;という名前でStateモナドが定義されていて、各tacticはこのモナド値を返す関数として定義されている。しかし&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;は&amp;lt;strong&amp;gt;現在の状態&amp;lt;/strong&amp;gt;しか持っておらず、コメントを紐づけたりするには証明の&amp;lt;strong&amp;gt;過程まで含めた全体の構造&amp;lt;/strong&amp;gt;が欲しい。そこでntacでは、&amp;lt;code&amp;gt;tactic&amp;lt;/code&amp;gt;の定義を変更して証明の「履歴」を木構造として保持するようにした&amp;lt;code&amp;gt;ntac&amp;lt;/code&amp;gt;というモナドを定義し、既存のtacticを（適切な）&amp;lt;code&amp;gt;ntac&amp;lt;/code&amp;gt;モナド値を持つような定義に変更した。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Lean4 ===&lt;br /&gt;
&lt;br /&gt;
Schemeを参考に、強力な衛生的（hygienic）マクロシステムが実装された。柔軟なNotationの定義ができるようになる。論文としては&amp;amp;#91;^ullrich2020Notations&amp;amp;#93;に詳しく書いてある。&lt;br /&gt;
&lt;br /&gt;
上記「ntac」のLean4版は現在開発中。構文解析中に外部のプログラムを呼び出すなど、なんでもできて面白い。&lt;br /&gt;
&lt;br /&gt;
==== 例 ====&lt;br /&gt;
&lt;br /&gt;
* replしてる例らしい [https://github.com/leanprover-community/repl https://github.com/leanprover-community/repl]&lt;br /&gt;
&lt;br /&gt;
==== tacticの移行とか ====&lt;br /&gt;
&lt;br /&gt;
Lean3までの証明（のうちtacticで書かれたもの）をLean4に移植する方法について。&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Tactic.20porting.20assignments/near/296694161 https&amp;amp;#58;//leanprover.zulipchat.com/&amp;amp;#35;narrow/stream/287929&amp;amp;#45;mathlib4/topic/Tactic.20porting.20assignments/near/296694161]&lt;br /&gt;
&lt;br /&gt;
* とりあえず [[error_private_page|error_private_page]]  で基礎知識を得るのがよさそう？&lt;br /&gt;
&lt;br /&gt;
== elan ==&lt;br /&gt;
&lt;br /&gt;
* leanを管理（各バージョンのインストール/アンインストールなど）するためのツール&lt;br /&gt;
* 適当にフォルダだけ消すとtoolchainの再インストールで引っ掛かるので、update&amp;amp;#45;hashesも消すとよいかも&lt;br /&gt;
* rustupのforkらしい [https://zenn.dev/labbase/articles/b24dca38e0420d 関数型言語”兼”定理証明支援系Leanの環境構築]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean3-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Lean3 ==&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/get_started.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/get_started.html] を読む。elanってやつが入れば大丈夫で、mathlib&amp;amp;#45;toolsとかleanprojectは（今はもう案内ないか？）無視でいい（後述）&lt;br /&gt;
&lt;br /&gt;
=== パッケージ ===&lt;br /&gt;
&lt;br /&gt;
Leanでの開発はまずパッケージを作るところから始まる。&lt;br /&gt;
&lt;br /&gt;
leanpkg.tomlっていうメインの管理ファイルがあって、ここにLeanのバージョンとかを指定しておくと、無ければ（VS Codeでフォルダ開くタイミングとかで）自動でelanが取ってきてくれる&lt;br /&gt;
&lt;br /&gt;
* 特定パッケージと、そのパッケージに依存するパッケージの双方を依存関係として指定したとして、バージョンの齟齬があったら何が起きるのかは不明である。ちなみにLean4の話だが、mathlib4に関しては[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4]に「If your project depends on &amp;lt;code&amp;gt;std4&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;quote4&amp;lt;/code&amp;gt;, let &amp;lt;code&amp;gt;mathlib4&amp;lt;/code&amp;gt; pull them transitively. That is, don&amp;amp;#39;t &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; them on your &amp;lt;code&amp;gt;lakefile.lean&amp;lt;/code&amp;gt;」と明記されている。&lt;br /&gt;
&lt;br /&gt;
=== mathlib ===&lt;br /&gt;
&lt;br /&gt;
パッケージの一つ。半分標準のライブラリみたいなもの。数学の定理やリスト処理のプログラムなど、色々なものが形式化されている。文字列処理とかの便利関数も入ってるのでとりあえず入れて損はない&lt;br /&gt;
&lt;br /&gt;
[https://leanprover-community.github.io/mathlib-overview.html https&amp;amp;#58;//leanprover&amp;amp;#45;community.github.io/mathlib&amp;amp;#45;overview.html]&lt;br /&gt;
&lt;br /&gt;
=== mathlibの指定 ===&lt;br /&gt;
&lt;br /&gt;
leanpkg.tomlで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;mathlib = {git = &amp;quot;https://github.com/leanprover-community/mathlib&amp;quot;, rev = &amp;quot;lean-3.49.1&amp;quot;}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のように指定しておくと&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;leanpkg upgrade&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
でlean&amp;amp;#45;3.49.1ブランチを取ってきてくれる。masterブランチ指定とかするとバージョンアップで互換性がなくなって困るのでこれがおすすめ。&lt;br /&gt;
&lt;br /&gt;
=== mathlib&amp;amp;#45;toolsとleanprojectについて ===&lt;br /&gt;
&lt;br /&gt;
* 基本Lean3用なのでもう使われないかも&lt;br /&gt;
&lt;br /&gt;
leanprojectは[https://github.com/leanprover-community/mathlib-tools mathlib&amp;amp;#45;tools]の一部で、mathlibをうまく扱うのが目的っぽい。&amp;lt;code&amp;gt;python3 &amp;amp;#45;m pip install mathlibtools&amp;lt;/code&amp;gt;で入る&lt;br /&gt;
&lt;br /&gt;
prebuiltされた（ちなみに自前でビルドすると数時間かかる）mathlibを&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;https://oleanstorage.azureedge.net/mathlib/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.tar.xz&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
（xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxはコミットID）からダウンロードして、oleanにtouchして最新版にしてくれるが、&amp;lt;strong&amp;gt;それだけの機能しかなく、動作もあまり分かりやすくない&amp;lt;/strong&amp;gt;。しかもよくわからんが、Lean4には未対応っぽい（というか、mathlibというのはLean3のパッケージの名前なのでそれはそうか（Lean4用のmathlibはmathlib4））。このまま使われなくなりそう。&lt;br /&gt;
&lt;br /&gt;
そこで、自分でそれをやるスクリプトを書いてpathに登録した。これで十分と感じる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;javascript&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if ! cd ../../../_target/deps/mathlib ;then&lt;br /&gt;
echo &amp;quot;must be run in &#039;mathlib&#039; folders.  exiting.&amp;quot;; exit&lt;br /&gt;
fi&lt;br /&gt;
find src -name &amp;quot;*.olean&amp;quot; | xargs rm&lt;br /&gt;
curl -o olean.tar.xz https://oleanstorage.azureedge.net/mathlib/`cat .git/HEAD`.tar.xz&lt;br /&gt;
#touch all .olean (this is also done by leanproject in mathlib-tools)&lt;br /&gt;
find src -name &amp;quot;*.olean&amp;quot; | xargs touch&lt;br /&gt;
if tar xvf olean.tar.xz ; then&lt;br /&gt;
rm -f olean.tar.xz&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;new-oleans.sh&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lean4-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Lean4 ==&lt;br /&gt;
&lt;br /&gt;
=== 初期設定 ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/leanprover/elan elan]をまず入れてそれからLeanを、ってのがv3以前のやり方だったと思うが[https://leanprover.github.io/lean4/doc/quickstart.html Setting Up Lean &amp;amp;#45; Lean Manual]によるとどうやらv4はVS Code拡張経由で入れられるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;パッケージlake&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== パッケージ(lake) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;lake new フォルダ名（この中にパッケージができる）&amp;lt;/code&amp;gt;、または&amp;lt;code&amp;gt;lake init パッケージ名（パッケージはカレントディレクトリに作成される）&amp;lt;/code&amp;gt;を実行。詳しいやり方は[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4] とか。&lt;br /&gt;
&lt;br /&gt;
lakeのドキュメントはここ [https://github.com/leanprover/lean4/tree/master/src/lake https&amp;amp;#58;//github.com/leanprover/lean4/tree/master/src/lake]&lt;br /&gt;
&lt;br /&gt;
dependencyの書き方は [https://github.com/leanprover-community/mathlib4/blob/master/lakefile.lean https&amp;amp;#58;//github.com/leanprover&amp;amp;#45;community/mathlib4/blob/master/lakefile.lean] とかを参考に。stdのURLがここにある。&lt;br /&gt;
&lt;br /&gt;
=== mathlib4 ===&lt;br /&gt;
&lt;br /&gt;
prebuiltされたものの提供はないっぽい。[https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/.E2.9C.94.20use.20prebuilt.20release.3F https&amp;amp;#58;//leanprover.zulipchat.com/&amp;amp;#35;narrow/stream/287929&amp;amp;#45;mathlib4/topic/.E2.9C.94.20use.20prebuilt.20release.3F]&lt;br /&gt;
&lt;br /&gt;
* いや、[https://github.com/leanprover-community/mathlib4 https://github.com/leanprover-community/mathlib4]を読むと、&amp;lt;code&amp;gt;lake exe cache get&amp;lt;/code&amp;gt;で取ってこれるように最近なった？&lt;br /&gt;
&lt;br /&gt;
そのかわりlake build Mathlibと打てば（lean3のmathlibに比べて）割とすぐにビルドが終わる（5分前後？）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;require ml4 from git &amp;quot;https://github.com/leanprover-community/mathlib4&amp;quot; @ &amp;quot;master&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
↑依存パッケージとしてはこういうふうに書くが、lake build ml4ではなくlake build Mathlibが正しいっぽい。&lt;br /&gt;
&lt;br /&gt;
* そもそも、require ml4じゃなくてrequire &amp;lt;strong&amp;gt;mathlib&amp;lt;/strong&amp;gt;と必ず書かなきゃいけない説もある&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AEGUI%EF%BC%88X11/Wayland%EF%BC%89&amp;diff=344</id>
		<title>LinuxのGUI（X11/Wayland）</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AEGUI%EF%BC%88X11/Wayland%EF%BC%89&amp;diff=344"/>
		<updated>2025-06-30T09:02:35Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;wayland&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wayland ==&lt;br /&gt;
&lt;br /&gt;
とりあえずはGNOMEでの設定内容のみ。&lt;br /&gt;
&lt;br /&gt;
* gnomeパッケージ自体を入れる必要はない（ゲームとか無駄なものが入る）&lt;br /&gt;
** gdm(3)は最低限必要&lt;br /&gt;
** waylandを有効にするために多分mutterが要る&lt;br /&gt;
** gnome&amp;amp;#45;shell&amp;amp;#45;extensionsも（gnome shell extensionsを使うなら）要る（なぜかgnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerのdependenciesに入っていないため（バグ報告した&amp;amp;#58; [https://bugs.launchpad.net/ubuntu/+source/gnome-shell-extension-manager/+bug/1999001 Bug &amp;amp;#35;1999001 “gnome&amp;amp;#45;shell&amp;amp;#45;extensions is not in dependencies” &amp;amp;#58; Bugs &amp;amp;#58; gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;manager package &amp;amp;#58; Ubuntu]））&lt;br /&gt;
** gnome&amp;amp;#45;sessionはいらないかも&lt;br /&gt;
** [https://itsfoss.com/install-gnome-linux-mint/ https&amp;amp;#58;//itsfoss.com/install&amp;amp;#45;gnome&amp;amp;#45;linux&amp;amp;#45;mint/] にあるvanilla&amp;amp;#45;gnomeでもまだ余分なものが入っている気がする&lt;br /&gt;
* ここ参考になる [https://gihyo.jp/admin/serial/01/ubuntu-recipe/0717 https&amp;amp;#58;//gihyo.jp/admin/serial/01/ubuntu&amp;amp;#45;recipe/0717]&lt;br /&gt;
&lt;br /&gt;
指紋認証関連で弾かれる。pamとfprintdの連携がうまくいってない感があったので&amp;lt;code&amp;gt;libpam&amp;amp;#45;fprintd&amp;lt;/code&amp;gt;を入れたら治った。&lt;br /&gt;
&lt;br /&gt;
[https://sites.google.com/site/zoom2writej/ubuntu/ibus https&amp;amp;#58;//sites.google.com/site/zoom2writej/ubuntu/ibus]&lt;br /&gt;
&lt;br /&gt;
* USB&amp;amp;#45;Cのディスプレイを起動時に認識しない。刺し直すと認識する。なんでだろう。→なんかこれはシャットダウンして待ったりすると治るタイプのやつ。ハードウェア的な問題かな。dmesg &amp;amp;#45;ewとかで見れたりはする。Bad usb cable?とかなんとか言われてた気がする&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nvidia&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== NVIDIA ===&lt;br /&gt;
&lt;br /&gt;
nvidiaが入っている状態だとちょっとめんどくてデフォルトだとXorgにされる。&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/k0kubun/items/c1162098cbd7eba1bed0 https&amp;amp;#58;//qiita.com/k0kubun/items/c1162098cbd7eba1bed0]&lt;br /&gt;
&lt;br /&gt;
に書いてあるとおり&amp;lt;code&amp;gt;nvidia&amp;amp;#45;drm.modeset&amp;amp;#61;1&amp;lt;/code&amp;gt;をするといける。（それだけだとだめだったという情報もあるっちゃあるがこっちでは大丈夫だった）&lt;br /&gt;
&lt;br /&gt;
* GRUB_CMDLINE_LINUX_DEFAULTに入れるとリカバリモードのオプションには追加されない[https://gihyo.jp/admin/serial/01/ubuntu-recipe/0743 第743回　Ubuntuの標準ブートローダーであるGRUBを改めて見直す | gihyo.jp]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;NVIDIA上のmpv/celluloid&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
手元では&amp;lt;code&amp;gt;gpu&amp;amp;#45;context&amp;amp;#61;x11vk&amp;lt;/code&amp;gt;が効果あり。mpvはこれだけでいけた。&lt;br /&gt;
&lt;br /&gt;
celluloidの場合、さらに環境変数の&amp;lt;code&amp;gt;__EGL_VENDOR_LIBRARY_FILENAMES&amp;amp;#61;/usr/share/glvnd/egl_vendor.d/50_mesa.json&amp;lt;/code&amp;gt;が必要。参考&amp;amp;#58; [https://github.com/mpv-player/mpv/issues/9393 https://github.com/mpv-player/mpv/issues/9393]&lt;br /&gt;
&lt;br /&gt;
* applicationsの.desktopのほうでは、&amp;lt;code&amp;gt;env __EGL_VENDOR_LIBRARY_FILENAMES&amp;amp;#61;/usr/share/glvnd/egl_vendor.d/50_mesa.json celluloid &amp;amp;#45;&amp;amp;#45;mpv&amp;amp;#45;gpu&amp;amp;#45;context&amp;amp;#61;x11vk %U&amp;lt;/code&amp;gt;としておけばよい。&lt;br /&gt;
&lt;br /&gt;
ただ、x11vkでperformanceが悪いというissueもある。[https://github.com/mpv-player/mpv/issues/10326 https://github.com/mpv-player/mpv/issues/10326] 見た感じこちらでは問題ない。&lt;br /&gt;
&lt;br /&gt;
x11eglだと&amp;lt;code&amp;gt;libEGL warning&amp;amp;#58; DRI3&amp;amp;#58; Screen seems not DRI3 capable&amp;lt;/code&amp;gt;と言われるが動いてはいるっぽい。&lt;br /&gt;
&lt;br /&gt;
他にもいくつかある。&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.archlinux.org/title/mpv https&amp;amp;#58;//wiki.archlinux.org/title/mpv]&lt;br /&gt;
&lt;br /&gt;
gnome&amp;amp;#45;session&amp;amp;#45;inhibitとかいうのは電源関連なのでそのさきの話かな。&lt;br /&gt;
&lt;br /&gt;
==== 日本語入力 ====&lt;br /&gt;
&lt;br /&gt;
ibus&amp;amp;#45;mozcは廃止される？とかなんとか。Waylandに対応したfcitx5を使うのがよさそう。&lt;br /&gt;
&lt;br /&gt;
全体的にはここ [https://gihyo.jp/admin/serial/01/ubuntu-recipe/0689 https&amp;amp;#58;//gihyo.jp/admin/serial/01/ubuntu&amp;amp;#45;recipe/0689] （前述の第717回の記事でも引用されている）が参考になるかと。&lt;br /&gt;
&lt;br /&gt;
基本的にはfcitx5&amp;amp;#45;diagnoseを使って赤文字のところ（問題点）を順番に直していくのがよい。&lt;br /&gt;
&lt;br /&gt;
まずGNOMEがめっちゃibus使おうとしてしまうらしいのでibus&amp;amp;#45;daemonを除去する必要があるらしい。そこでibusパッケージをremoveする。&lt;br /&gt;
&lt;br /&gt;
次に環境変数の&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;GTK_IM_MODULE=fcitx&lt;br /&gt;
QT_IM_MODULE=fcitx&lt;br /&gt;
XMODIFIERS=@im=fcitx&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
が必要らしい。/etc/environmentでもいいが、ユーザーごとにしたければ（Waylandの場合だと）&amp;lt;code&amp;gt;&amp;amp;#126;/.config/environment.d/&amp;amp;#42;.conf&amp;lt;/code&amp;gt;に書くといいらしい。（参考&amp;amp;#58; [https://blog.vikke.name/2020/01/27/wayland%E3%81%A7%E3%81%AExprofile%E3%82%84xsession%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B/ https&amp;amp;#58;//blog.vikke.name/2020/01/27/waylandでのxprofileやxsessionの代わりに環境変数を設定する/] 及びそこで引用されている[https://wiki.gnome.org/Initiatives/Wayland/SessionStart https&amp;amp;#58;//wiki.gnome.org/Initiatives/Wayland/SessionStart]）&lt;br /&gt;
&lt;br /&gt;
さらにgnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerを入れてkimpanelを追加する。これでいけるはず&lt;br /&gt;
&lt;br /&gt;
* gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;managerのバージョンをどうにかしたような気もするが詳細忘れ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;一応ibus使用時のメモ&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/spumoni/items/f1e5023829c575af4dd0 Ubuntu 21.04でキーボードがus配列に変わってしまう問題 &amp;amp;#45; Qiita]や[https://golang.hateblo.jp/entry/ubuntu22.04-keyboard-layout-mozc Ubuntu 22.04 でキーボードレイアウトおかしくなる問題。 &amp;amp;#45; golangの日記]とかに書いてあるようにibus&amp;amp;#45;mozcがjp配置を使うようにして（初期設定だとusになってしまう）、&amp;lt;code&amp;gt;ibus write&amp;amp;#45;cache&amp;lt;/code&amp;gt; と&amp;lt;code&amp;gt;ibus restart&amp;lt;/code&amp;gt;（ibusに接続できませんと言われたら&amp;lt;code&amp;gt;ibus&amp;amp;#45;daemon &amp;amp;#45;&amp;amp;#45;xim &amp;amp;#45;d &amp;amp;#45;r&amp;lt;/code&amp;gt;が有効かも）をする。いや普通に&amp;lt;code&amp;gt;ibus&amp;amp;#45;daemon &amp;amp;#45;&amp;amp;#45;xim &amp;amp;#45;d &amp;amp;#45;r&amp;lt;/code&amp;gt;だけでいいっぽい&lt;br /&gt;
&lt;br /&gt;
=== システムトレイ ===&lt;br /&gt;
&lt;br /&gt;
MEGAなどが正しく動作しなかった。[https://github.com/JetBrains/compose-jb/issues/1847 https://github.com/JetBrains/compose-jb/issues/1847]に書いてあるとおり、extension managerから[https://extensions.gnome.org/extension/615/appindicator-support/ https&amp;amp;#58;//extensions.gnome.org/extension/615/appindicator&amp;amp;#45;support/] を入れるとうまく動作するようになる。&lt;br /&gt;
&lt;br /&gt;
* Linux Mint 21.1にしてから動かなくなった気がする&lt;br /&gt;
* &amp;lt;code&amp;gt;gnome&amp;amp;#45;shell&amp;amp;#45;extension&amp;amp;#45;appindicator&amp;lt;/code&amp;gt;というパッケージもある？&lt;br /&gt;
[[Category:IT]][[Category:Linux]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=343</id>
		<title>デュアルブート</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=343"/>
		<updated>2025-06-03T13:39:59Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
WindowsとLinuxのデュアルブートにおいて役に立つ情報を記述する。古いメモを多く含む。[[Linuxのインストール|Linuxのインストール]]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsのプロダクトキー関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsのプロダクトキー関連 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|デュアルブート}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bitlocker ==&lt;br /&gt;
&lt;br /&gt;
とにかく前もって&amp;lt;strong&amp;gt;回復キーを保存しておくこと！！&amp;lt;/strong&amp;gt;逆に回復キーさえあればBitlockerで大きなトラブルになることは多くない。&lt;br /&gt;
&lt;br /&gt;
* [https://www.pcdock24.com/blog/?p=53931 BitLockerとは【BitLockerの要件と自動有効化の問題点】｜パソコン修理パソコンドック24] によるとローカルアカウントでBitlockerの有効/無効を確認するときはdiskmgmtから行かなきゃいけないらしい。&lt;br /&gt;
* Bitlockerを有効にしたあとにwinを起動すると再起動ループにハマることがある。解決法(Manage&amp;amp;#45;bdeを使う)→[https://community.spiceworks.com/how_to/124388-stop-a-bitlocker-boot-loop Stop a BitLocker boot loop &amp;amp;#45; Windows Forum &amp;amp;#45; Spiceworks]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsパーティションntfsのマウント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsパーティション（NTFS）のマウント ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
==== remove_hiberfileについて ====&lt;br /&gt;
&lt;br /&gt;
マウントが成功するにはWindowsが完全シャットダウンされている必要がある（またはそれが望ましい）。ただ、[https://unix.stackexchange.com/questions/107978/cant-access-windows-drive-windows-is-hibernated-refused-to-mount https&amp;amp;#58;//unix.stackexchange.com/questions/107978/cant&amp;amp;#45;access&amp;amp;#45;windows&amp;amp;#45;drive&amp;amp;#45;windows&amp;amp;#45;is&amp;amp;#45;hibernated&amp;amp;#45;refused&amp;amp;#45;to&amp;amp;#45;mount]にある通り、windowsを正しくシャットダウンしてもなぜか「ハイバーネートされててマウントできません」的なのが出ることがあるので、マウントオプションにremove_hiberfileを追加するとよい。&lt;br /&gt;
&lt;br /&gt;
* 高速スタートアップを無効にしているにもかかわらず完全シャットダウンされていないことがある気がしたので、Windowsでシャットダウン時に実行するスクリプトとして完全シャットダウンコマンドを追加したりした&lt;br /&gt;
* デスクトップPCではだいたい不要？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker無し&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker無し ===&lt;br /&gt;
&lt;br /&gt;
普通にntfs&amp;amp;#45;3gを使う。数字など適宜読み替えること。主にWindowsのDドライブ想定。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;ntfs-3g -o remove_hiberfile /dev/nvme0n1p5 /media/win&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstabの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;/dev/sda2     /media/ddrive ntfs-3g noauto,rw,nofail 0  0&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker有り&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker有り ===&lt;br /&gt;
&lt;br /&gt;
ntfs&amp;amp;#45;3gの前にDislockerで暗号化を解除する。参考→[http://www7390uo.sakura.ne.jp/wordpress/archives/270 http&amp;amp;#58;//www7390uo.sakura.ne.jp/wordpress/archives/2]&lt;br /&gt;
&lt;br /&gt;
dislocker&amp;amp;#45;fileの方式だと一旦復号したのをファイルに書き出して静的にマウントするので、（事実上）readonlyとなる。よってdislocker&amp;amp;#45;fuseを使う→[https://www.systutorials.com/docs/linux/man/1-dislocker-fuse/ https&amp;amp;#58;//www.systutorials.com/docs/linux/man/1&amp;amp;#45;dislocker&amp;amp;#45;fuse/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/dl-fuse&lt;br /&gt;
$ sudo mount -o loop,rw /media/dl-fuse/dislocker-file /media/win/&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstab例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  0 0&lt;br /&gt;
/media/bitlocker/dislocker-file   /media/win10   ntfs-3g   rw,nofail,remove_hiberfile,permissions 0  2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;と、二行に分けて記載する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;permissions については後述&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セキュリティ問題 ====&lt;br /&gt;
&lt;br /&gt;
recovery&amp;amp;#45;passwordを暗号化されていないパーティションに書いてしまうと結局Bitlockerの意味が全くなくなってしまうので、Linux側でもBitlockerのような暗号化パーティション（LUKSとか？）やユーザーログイン時に復号される暗号化フォルダ（ecryptfsとか）といったディスク上で暗号化される領域に書いておく必要がある（もちろん毎回パスワードの類を打ち込むのでよければそれでもいい）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;permissions-inheritについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== permissions, inheritについて ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tuxera/ntfs-3g/wiki/File-Ownership-and-Permissions https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/wiki/File&amp;amp;#45;Ownership&amp;amp;#45;and&amp;amp;#45;Permissions] 詳しくはこちらも参照。&lt;br /&gt;
&lt;br /&gt;
まず、マウントオプションとして&amp;lt;strong&amp;gt;permissions&amp;lt;/strong&amp;gt;を指定しない限り、ntfs&amp;amp;#45;3gでマウントしたファイルは全てパーミッション・所有者が固定（uid, gid, umaskなどで指定）となり、個別のファイルについて変更することはできない。&lt;br /&gt;
&lt;br /&gt;
そして、この場合、ntfs&amp;amp;#45;3g経由で作成したファイルはWindows側で見るとすべてAdministratorの所有となり、さらにEveryoneにフルコントロール権限が付与される（この動作を変更するのは筆者の知る限り不可能）。&lt;br /&gt;
&lt;br /&gt;
Linuxではフォルダの実行権限（x）が無ければその中に含まれたファイルにはアクセスが通らず、パスを推測することも不可能だが、Windowsではたとえ一切権限のないフォルダであっても中にあるファイル・フォルダのパスがわかれば直接パスを打つことでアクセスが通ってしまうようである（試した限り）。そのため、permissions無しでntfs&amp;amp;#45;3gで作成したファイルはパスさえわかればWindows上の全ユーザーが閲覧・編集・削除できる状態ということになる。&lt;br /&gt;
&lt;br /&gt;
従って、Gitを使用する場合や複数ユーザーで使用したい場合などパーミッション管理が必要なデータを扱う場合はもちろん、単に中にあるデータを保護したいという場合でもpermissionsオプションを指定することが必須になる。&lt;br /&gt;
&lt;br /&gt;
次に、permissionsを指定して、かつUserMappingを指定しない場合、Linux上でrootが所有するファイルをWindows側で見ると、全てAdministratorsの所有物になり（ここはpermissionsがない場合と同じ）、そのアクセス権はLinux上での見え方と概ね一致するように設定されるようである。他のユーザーが所有するファイルにはS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000というような上位桁が円周率に由来する（この部分はハードコードされている）SIDが割り当てられ、こちらもアクセス権が適切に設定される。UserMappingを指定することで、このSIDの部分の割り当てを変更することができる。&lt;br /&gt;
&lt;br /&gt;
Windowsに挙動を近づけるための他のオプションとしては&amp;lt;strong&amp;gt;inherit&amp;lt;/strong&amp;gt;というのもあり、これは新規作成時に上位フォルダの権限を継承するものである。しかし、これは&amp;lt;u&amp;gt;所有者を継承するオプションではない&amp;lt;/u&amp;gt;（そして、所有者が違えばまともに継承もされない）。&lt;br /&gt;
&lt;br /&gt;
以上のことから、Windowsの一般ユーザーフォルダの内容などをLinuxから良い感じに（Windows側の権限設定を汚染せずに）使えるようにするには、明示的なUserMappingが事実上必須であることがわかる。&lt;br /&gt;
&lt;br /&gt;
一方で、Administrator所有・全ユーザー閲覧可能（あるいは不可能）、といった、Windows側の全ての一般ユーザーに対して共通のアクセス権を適用する設定であれば、UserMappingを使用しなくても簡単に設定が可能である。個人用PCかつ、画像・動画などのメディアファイルやLinuxでしか使用しない大きめのソフトウェアを入れておく用途であれば、こちらで問題ないだろう。&lt;br /&gt;
&lt;br /&gt;
Linux側で別ユーザーの所有に見せたい場合は、上記のS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000のようなSIDが見えてしまう状態でもよければ（かつ、権限設定にも問題がなければ）それでもいいし、下記のbindfsと併用する方法もある。いずれにしても、Linux側で全員が読み取り・書き込み・実行が可能なファイルは、Linux側での親フォルダの権限によらず、Windows側では（パスさえわかれば）対応する権限でアクセスができてしまうということに注意が必要である。&lt;br /&gt;
&lt;br /&gt;
また、Windowsではファイルの新規作成時には必ず実行権限が付加されるので、Linux側でそれを見た場合も実行可能になる（実行権限を外すと.exeなどが実行できなくなる）。従って、GitのレポジトリのフォルダをWindows/Linux間で共用するようなことをすると、Windows側では実行権限無しで（これがデフォルトであるため）コミットされたファイルがLinux側では実行権限有りに見えるため差分が出てしまうといったことが発生する。これはUserMappingでも解決はできないので、Gitリポジトリのあるフォルダを共用するのは不可能である。&lt;br /&gt;
&lt;br /&gt;
==== bindfs ====&lt;br /&gt;
&lt;br /&gt;
既存のディレクトリを、所有ユーザーやパーミッションを変更してマウントしてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --mirror=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
または&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --force-user=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
この2つの違いは不明&lt;br /&gt;
&lt;br /&gt;
作成した&lt;br /&gt;
&lt;br /&gt;
sudoがないと&amp;lt;code&amp;gt;fusermount&amp;amp;#58; option allow_other only allowed if &amp;amp;#39;user_allow_other&amp;amp;#39; is set in /etc/fuse.conf&amp;lt;/code&amp;gt;とか言われたりする&lt;br /&gt;
&lt;br /&gt;
fstabの例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;/media/win /home/myname/.mnt_win fuse.bindfs nofail,map=root/myname:@root/@myname,create-with-perms=g-w 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linuxだとrootのデフォルトのumaskが022で一般ユーザーが002なせいで一般ユーザーが作ったファイルが775とか664になってしまったりするがg&amp;amp;#45;wをつけることによって755とか644になる（もちろんchmodすれば変えられる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;minecraft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Minecraft ==&lt;br /&gt;
&lt;br /&gt;
.minecraftフォルダをWindowsとLinuxで共有したはいいが、（それ自体.minecraftの中にある）ゲームディレクトリの指定も共有することを考えると、両OSでパスの仕様がやや異なるのが問題になる。&lt;br /&gt;
&lt;br /&gt;
例えば以下ではWindowsのルートが/media/winにマウントされているとする。&lt;br /&gt;
&lt;br /&gt;
まずLinuxのランチャーは相対パスどころかシンボリックリンクすら変換して普通の絶対パスにしてしまう（設定を書き換えてしまう）っぽいので、linuxでは絶対パス指定で/media/win/Users/pathのようにする。で、この書き方をするとWindowsでは相対パスと解釈されるのだが、基準となるフォルダが謎で、「PLAY」を押した時のチェック時は.minecraftが基準なのだが、実際に見られるのはランチャーがあるフォルダが基準（＝こっちになかった場合ゲームディレクトリが新たに作られる）&lt;br /&gt;
&lt;br /&gt;
* ストアアプリ版の（新しい方の？）Minecraftランチャーでは、この「ランチャーがあるフォルダ」は&amp;lt;code&amp;gt;AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local&amp;lt;/code&amp;gt; あたりである。&lt;br /&gt;
&lt;br /&gt;
従って、ランチャーのフォルダと.minecraft内の両方にmediaというフォルダを作って中にwinという名前でC&amp;amp;#58;\へのジャンクション置くとうまくいく。&lt;br /&gt;
&lt;br /&gt;
.minecraftの中にはゲームディレクトリ専用のフォルダを作り、その中にmain, snapshotなど用途に応じたフォルダを作っておくとよい&lt;br /&gt;
&lt;br /&gt;
== google&amp;amp;#45;drive&amp;amp;#45;ocamlfuse ==&lt;br /&gt;
&lt;br /&gt;
labelを使うと複数アカウントをマウントできる。デフォルトのラベル名はdefault&lt;br /&gt;
&lt;br /&gt;
しばらく使っていないと起動時におそらく認証の失敗が原因でマウントポイントのあるフォルダに対するlsがしばらく一切反応しなくなる（&amp;amp;#126;/.gdfuse内の該当ラベル名のフォルダを削除して最初からやり直せば治る）。よってマウントポイントをホームディレクトリ直下に作るのは避けたほうがよい（gdfというフォルダを作っている）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mega&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MEGA ==&lt;br /&gt;
&lt;br /&gt;
Winが完全にはシャットダウンされていない状態でLinuxを起動するとCドライブ上のMEGAのフォルダが読めずに同期が無効になってしまう。MEGA自身のかわりに、Cが読める状態でのみMEGAを起動するシェルスクリプト（mega&amp;amp;#45;mounted.sh）をスタートアップに登録しておく。Cが読めなかった場合にはdialogコマンドで通知ダイアログを表示する。（このスクリプトではC自身のかわりにC&amp;amp;#58;\Windowsをみている）（gdialogは一部のディストリにしか入っていないかもしれない。実際にコマンド打ってみてどんな表示になるかも含めて確かめておいたほうがよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if [ -d /media/win-rw/Windows ]; then&lt;br /&gt;
megasync&lt;br /&gt;
else&lt;br /&gt;
gdialog --title &amp;quot;Warning&amp;quot; --infobox &amp;quot;MEGAsync is not started because Windows partition is not mounted&amp;quot; 0 0&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bluetooth機器&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bluetooth機器 ==&lt;br /&gt;
&lt;br /&gt;
同じBluetooth機器を同じPCのWindowsとLinux双方にペアリングするというもの。自分はマウスでしかやったことがない。意外と難しいが何とかなる。&lt;br /&gt;
&lt;br /&gt;
==== 参考 ====&lt;br /&gt;
&lt;br /&gt;
* [https://orumin.blogspot.com/2019/02/bluetooth.html https&amp;amp;#58;//orumin.blogspot.com/2019/02/bluetooth.html]&lt;br /&gt;
* [https://qiita.com/yoko-yan/items/9b0235678fd804b4fe0d https&amp;amp;#58;//qiita.com/yoko&amp;amp;#45;yan/items/9b0235678fd804b4fe0d]&lt;br /&gt;
* Bluetooth Low Energyという仕様もあるらしく、自分のマウスはこっちだった。これに関しては[http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html http&amp;amp;#58;//aimingoff.way&amp;amp;#45;nifty.com/blog/2018/09/windows&amp;amp;#45;linux&amp;amp;#45;b.html]を参照。割と情報が少ないので感謝。&lt;br /&gt;
** &amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx&amp;lt;/code&amp;gt;を見るためにpstoolsをダウンロードして&amp;lt;code&amp;gt;PsExec64 &amp;amp;#45;s &amp;amp;#45;i regedit&amp;lt;/code&amp;gt;とする必要があることに注意。なお、セキュリティソフトによってPsexecが脅威と見なされ強制削除されてしまうときは代わりにフリーソフトのAdvancedRunを使うとよい。&lt;br /&gt;
** まとめ&lt;br /&gt;
*** CSRKをLocalSignatureKey&lt;br /&gt;
*** LTKをLongTermKey&lt;br /&gt;
*** EDIVをEdiv（16進→10進に変換）&lt;br /&gt;
*** ERandをRandに（&amp;lt;strong&amp;gt;バイト&amp;lt;/strong&amp;gt;(2文字のかたまり)&amp;lt;strong&amp;gt;をすべて逆順にしてから&amp;lt;/strong&amp;gt;10進変換）。ちなみにこれを間違えた結果、マウスを動かすたびにbluetoothアイコンが白↔黒と高速で切り替わる謎のバグっぽい現象が起こったことがあった。&lt;br /&gt;
*** 小文字を大文字に変える必要はない。また、IRKをIdentityResolvingKeyに書くのも不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;マルチデバイス対応マウスlogicool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== マルチデバイス対応マウス（Logicool） ====&lt;br /&gt;
&lt;br /&gt;
マルチデバイス対応（切り替えボタンがあるやつ）のマウス（LogicoolのM595）を使ったら、&amp;lt;strong&amp;gt;登録情報を一旦削除して再接続するごとにMacアドレスがひとつインクリメント&amp;lt;/strong&amp;gt;されて困った。Linuxで接続→Winで接続→Linuxで上記の書き換え、とやったあと、フォルダ名を変更（1を足せばよいはずだが正確にはWinの情報を見るのがよい）するとうまくいった。[https://twitter.com/e9g/status/1381111849664409600 自分のツイート]にも記録あり&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=342</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=342"/>
		<updated>2025-06-03T13:39:53Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDP（ただし筆者が念頭に置いているのはAssociateのみで、Bindに関してはほぼ調べていない）に対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、現在もメンテされているgo製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。VPNと同等の動作で、基本的には管理者権限（Linuxの場合、最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
以下のいずれも、ドメイン解決にはプロキシが適用されない（Linux向けの2つはできなくはないかもしれないが、しづらい）ことに注意。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
上記と似ているが、VPNとして動作するもの。プロセスが特定しづらい場合・特定のIPアドレス範囲だけで十分な場合などに効果を発揮する。&lt;br /&gt;
&lt;br /&gt;
以下は特筆しない限りUDP Associateに対応。もちろん、pingなどは通らない。&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;localhostlanなどへのアクセス制限&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== localhost・LANなどへのアクセス制限 ==&lt;br /&gt;
&lt;br /&gt;
典型的な設定例として、localhostやプライベートIPへのアクセスを制限する設定をSquid・Dante・3proxyそれぞれに関して紹介しておく。&lt;br /&gt;
&lt;br /&gt;
==== squid ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;to_localhost&amp;lt;/code&amp;gt;はbuilt&amp;amp;#45;inとして定義されていて、&amp;lt;code&amp;gt;localnet&amp;lt;/code&amp;gt;（&amp;amp;#61;srcがlocalnet）についてもUbuntuパッケージで提供されるsquid.confには入っているのだが、localnetがdstであるものとなるとACLが定義されていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;deny to_localhost&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;deny to_linklocal&amp;lt;/code&amp;gt;は定義済みという前提で、以下のように書くとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;acl to_localnet dst 0.0.0.1-0.255.255.255&lt;br /&gt;
acl to_localnet dst 10.0.0.0/8&lt;br /&gt;
acl to_localnet dst 100.64.0.0/10&lt;br /&gt;
acl to_localnet dst 172.16.0.0/12&lt;br /&gt;
acl to_localnet dst 192.168.0.0/16&lt;br /&gt;
acl to_localnet dst fc00::/7&lt;br /&gt;
&lt;br /&gt;
http_access deny to_localnet&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;deny * * 127.0.0.0/8,0.0.0.1-0.255.255.255,10.0.0.0/8,100.64.0.0/10,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16 * * * *&lt;br /&gt;
allow *&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dante ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。squid・3proxyの場合と違って0.0.0.0もblockしてしまっているが、そもそも使わないので問題ないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;client pass {&lt;br /&gt;
  from: 0/0  to: 0/0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 127.0.0.0/8 # localhost&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/8 # RFC 1122 &amp;quot;this&amp;quot; network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 10.0.0.0/8        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 100.64.0.0/10     # RFC 6598 shared address space (CGN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 169.254.0.0/16    # RFC 3927 link-local (directly plugged) machines&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 172.16.0.0/12     # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 192.168.0.0/16        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks pass {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/0&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;natが介在する場合などのudp-associateの動作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== NATが介在する場合などのUDP Associateの動作 ====&lt;br /&gt;
&lt;br /&gt;
OpenSSHの項目でも関連することを述べたが、UDP&amp;amp;#45;over&amp;amp;#45;TCPの性能劣化を避けるため、UDP Associateは「サーバー側がクライアント側に対してUDP通信で使うための中継ポートを通知する」という動作を伴う。この際、ネットワーク上でクライアント側からサーバーが直接見えていればよいが、NATを介している場合、クライアントから見たときのサーバーのIPとサーバー自身から見たときのサーバーのIP（中継ポート通知に含まれるのはこれ）が異なることがあり、通信が成立しなくなってしまう（SSHのポート転送を普通に使うだけではUDP Associateが使えないのも直接にはこれが原因）。&lt;br /&gt;
&lt;br /&gt;
ただし、[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]にも書いた通り、Proxifyreやhev&amp;amp;#45;socks5&amp;amp;#45;tproxyなどは中継ポート通知のIP部分を無視するため、ポート番号が変わらないNATであれば問題なく動作する（redsocksはダメ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
透過SOCKSプロキシの場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]）（さらに、繰り返しになるが付け加えておくと、普通にセットアップした場合はDNSにプロキシは使われない）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 https://github.com/FelisCatus/SwitchyOmega/issues/1379]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる（これは[https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ FAQ]にも書いてある）一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことが多くなるだろう。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
&lt;br /&gt;
== その他の話題 ==&lt;br /&gt;
&lt;br /&gt;
==== ドメインごとにプロキシを変更できるブラウザ拡張のiframeにおける動作 ====&lt;br /&gt;
&lt;br /&gt;
FoxyProxyやSwitchyOmega(ZeroOmega)など、ドメインごとに自動でプロキシを切り替えてくれるブラウザ拡張はChromium系にもFirefoxにもいくつかあるが、これらはあくまでコンテンツのオリジンを元にプロキシを適用しており、ブラウザのタブを見ているわけではない。つまり、foo.comのページを開いていて、そこにbar.comのコンテンツがiframeで埋め込まれている場合、iframeの内部は、bar.comに対して使用するものと指定されたプロキシを使用して処理される。&lt;br /&gt;
&lt;br /&gt;
一応、[https://superuser.com/questions/250172/disable-enable-the-proxy-on-a-tab-by-tab-basis-in-firefox Disable/enable the proxy on a tab by tab basis in Firefox]によると、Firefoxのcontainer&amp;amp;#45;proxyというのがこれに近い機能を実質的に実現してくれるらしい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=341</id>
		<title>Sandbox4moved3</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=341"/>
		<updated>2025-05-06T05:00:15Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/souvikinator/notion-to-md https://github.com/souvikinator/notion-to-md]&lt;br /&gt;
&lt;br /&gt;
asasd&lt;br /&gt;
&lt;br /&gt;
[https://github.com/souvikinator/notion-to-md link_preview]&lt;br /&gt;
[[Category:sandbox]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki&amp;diff=340</id>
		<title>MediaWiki</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki&amp;diff=340"/>
		<updated>2025-05-06T04:36:22Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wikipediaやこのサイトで使用されている代表的なWikiシステムであるMediaWikiについて解説する。&lt;br /&gt;
&lt;br /&gt;
== 初期設定 ==&lt;br /&gt;
&lt;br /&gt;
==== 動作要件 ====&lt;br /&gt;
&lt;br /&gt;
データベース（MySQL）と（CGI版の）phpが使えることを確認しておく。スターサーバーフリー（php+mysql）では動いた。&lt;br /&gt;
&lt;br /&gt;
SSHが使えないような低価格帯のレンタルサーバーのプランの中でも、PHPでexecなどの機能を使えば事実上任意コマンドが実行できるものと、それらの機能が制限されているサーバーがある。後者でもMediaWikiは一通り動くが、一部機能が動作しない場合もあるのであまりお勧めしない（特に他サーバー移行で手こずるのは困る）。&lt;br /&gt;
&lt;br /&gt;
==== インストール ====&lt;br /&gt;
&lt;br /&gt;
詳しくは[https://wikipedia.memo.wiki/d/%CC%B5%CE%C1%A5%EC%A5%F3%A5%BF%A5%EB%A5%B5%A1%BC%A5%D0%A1%BC%A4%CBMediaWiki%A4%F2%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A4%B9%A4%EB ここ]を参照。&lt;br /&gt;
&lt;br /&gt;
MySQLの設定をしたら、Mediawikiのファイル一式を設置し、/mw&amp;amp;#45;configにアクセスして指示に従うとインストールが完了する。/mw&amp;amp;#45;configは誰でも見られるファイルなので少し不安だが、MySQLのパスワードがわからないとインストールは完了しないため、別に公開でも問題なさそう。（不安ならBasic認証をかけておく？）&lt;br /&gt;
&lt;br /&gt;
初期の管理ユーザーのパスワードを忘れるとやや面倒なことになる。Chromeがちゃんと覚えてくれない場合があるので注意すること。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;忘れた場合の初期化方法（CGI版phpの場合？）&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
データベース（phpMyAdmin）から、&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;UPDATE `user` SET user_password = CONCAT(&#039;:B:somesalt:&#039;, MD5(CONCAT(&#039;somesalt-&#039;, MD5(&#039;somepass&#039;)))) WHERE user_name = &#039;someuser&#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
とする。[https://www.mediawiki.org/wiki/Topic:Rnq7yc02mg1o4j34 https&amp;amp;#58;//www.mediawiki.org/wiki/Topic&amp;amp;#58;Rnq7yc02mg1o4j34]より。&amp;lt;strong&amp;gt;2か所あるsomesaltのところにはLocalSettings.phpの$wgDBpasswordの値を入れること。&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MediaWiki1.12以前はちょっと違うらしい。自分が成功したのは1.39.1（2023年1月）。&lt;br /&gt;
&lt;br /&gt;
* CGI版じゃなくてphpコマンドが直接打てるなら、[https://plaza.rakuten.co.jp/zuka2007/diary/201705010000/ こちらの方法]でもいけそうである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ファイル一式は、zipを解凍してからFTPでアップロードするとかなり時間がかかるので（1時間くらい）、zipでアップロードしてサーバー上で解凍したほうがいい。レンタルサーバー提供のファイルマネージャーでできない場合は、[https://nicoiworks.com/ftp/ ZIPファイルをサーバーにアップしてから解凍する方法] のようにPHPでファイル名を指定して解凍するか、[https://github.com/dulldusk/phpfm https://github.com/dulldusk/phpfm] のようなPHPで動くファイルマネージャー（フォルダ削除なども高速にできる）から解凍するとよい。&amp;lt;strong&amp;gt;ただし、これらのphpファイルはBasic認証で保護するなどアクセス権限には十分気を付けること&amp;lt;/strong&amp;gt;。exec系（任意コマンド実行）が許可されていないstarserver freeでもこれらは動作した。&lt;br /&gt;
&lt;br /&gt;
MediaWikiの拡張はたくさん（全部）onにするとよいらしい。&lt;br /&gt;
&lt;br /&gt;
設定が終わると&amp;lt;strong&amp;gt;LocalSettings.php&amp;lt;/strong&amp;gt;が出力され、以後これで色々な設定ができるようになる。インストール後にフォルダ名を変えるときはリネームの上、LocalSettings.phpで&amp;lt;code&amp;gt;$wgScriptPath &amp;amp;#61; &amp;amp;quot;/mw&amp;amp;quot;&amp;amp;#59;&amp;lt;/code&amp;gt;などと変えればよい。新規ユーザー作成を許可するかどうかなどの設定もここでできるので、禁止したい場合などはこのタイミングでやっておくとよいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gitからのインストール&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Gitからのインストール ====&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Download_from_Git/ja Git からのダウンロード - MediaWiki]などに書いてあるが、安定版リリースにバンドルされている拡張やスキン（[https://www.mediawiki.org/wiki/Bundled_extensions_and_skins Bundled extensions and skins - MediaWiki]）やvendorフォルダ（？）が無かったりして動かすのに一手間かかる。&lt;br /&gt;
&lt;br /&gt;
==== その他初期設定 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;管理画面&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ブラウザ上から$wgScriptPath以下の/mw&amp;amp;#45;configというパスにアクセスすればよい。ここは誰でも見れてしまうが、その先に進むには（初期インストール後に生成されてLocalSettings.phpに書き込まれる）$wgUpgradeKeyが必要なので管理者以外は操作できない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;ロゴ&amp;lt;br /&amp;gt;&lt;br /&gt;
参考サイトにもあるが、resource/assets/にデフォルトのchange&amp;amp;#45;your&amp;amp;#45;logo.svgがある。それを上書きするか、名前を変えるなら$wgLogosで設定。サイズは135x135で表示される（それより大きいサイズにすると切り取られる）模様。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;faviconも$wgFaviconで設定。自分はsvgを256x256のpngで保存してからImageMagickでicoに変換した。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://www.mediawiki.org/wiki/Manual:RevisionDelete/ja ここ]から設定すると版指定削除ができる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;スキン&amp;lt;br /&amp;gt;&lt;br /&gt;
$wgDefaultSkin &amp;amp;#61; &amp;amp;quot;vector&amp;amp;quot;&amp;amp;#59;となっているが、&amp;amp;quot;vector&amp;amp;#45;2022&amp;amp;quot;のほうが良さそうだったのでそちらに変えた。あわせて$wgVectorResponsiveをtrueにしてモバイルでの視認性を上げた。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;カテゴリページの自動作成&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.mediawiki.org/wiki/Extension:Auto_Create_Category_Pages &amp;lt;strong&amp;gt;Auto Create Category Pages&amp;lt;/strong&amp;gt;]をダウンロードし、&amp;lt;code&amp;gt;wfLoadExtension( &amp;amp;#39;AutoCreateCategoryPages&amp;amp;#39; )&amp;amp;#59;&amp;lt;/code&amp;gt;とする。これは便利。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;アクセス数解析&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;精度のほどはわからないが、[https://www.mediawiki.org/wiki/Extension:HitCounters HitCounters]でできる。同じようにダウンロードした後、リンク先に記載のとおり、管理画面に行ってupdate.phpを実行する必要がある。その後で&amp;lt;code&amp;gt;wfLoadExtension&amp;lt;/code&amp;gt;をすればよい。アクセス数は誰からでも見えるようであるが、特に問題はないので放置。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;SyntaxHightlight&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Linuxのサーバーでは、&amp;lt;code&amp;gt;extensions/SyntaxHighlight_GeSHi/pygments/pygmentize&amp;lt;/code&amp;gt;のパーミッションを変更して所有者に実行権限を付加（先頭の桁を7にする）。参考&amp;amp;#58; [https://www.mediawiki.org/wiki/Extension:SyntaxHighlight/ja Extension&amp;amp;#58;SyntaxHighlight &amp;amp;#45; MediaWiki]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== アップグレード ==&lt;br /&gt;
&lt;br /&gt;
基本的には、&lt;br /&gt;
&lt;br /&gt;
# 新しいバージョンのMediaWikiファイル一式を新しいフォルダに設置して、そこに&lt;br /&gt;
#* LocalSettings.phpとimagesをコピー&lt;br /&gt;
#** LocalSettings.phpは場合によって手直しが必要かも&lt;br /&gt;
#* 自分で追加した拡張（extensions）（このサイトでいえばAutoCreateCategoryPagesとWikiSEO）やスキンなどを改めてダウンロードして追加（コピーしてきてもいいが、バージョンを更新したほうが良さそう）&lt;br /&gt;
#* ロゴなど、その他リソースをコピー&lt;br /&gt;
# シェル（推奨）またはmw&amp;amp;#45;config（当サイトの環境ではシェルのPHPが古すぎるのでこっち）からDBの更新（ただ、バージョンの差が小さければ、既に更新前の段階で基本的に問題なくページが閲覧できる場合も多そう）&lt;br /&gt;
&lt;br /&gt;
という流れ。&lt;br /&gt;
&lt;br /&gt;
1.のところでは、既存のMediaWikiインストールに上書きコピーするというのも一応可能で、実際これでやっている人も結構いそうだが、古いバージョンの（不要な）ファイルが残ってしまうので推奨はされていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;スキンデザイン&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== スキン・デザイン ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cssjs&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== CSS/JS ===&lt;br /&gt;
&lt;br /&gt;
[https://meta.m.wikimedia.org/wiki/Help:User_style/ja Help&amp;amp;#58;User style/ja &amp;amp;#45; Meta] とかにある通り、デフォルトではcssを直接ページ内に書いても有効にならない。&amp;lt;code&amp;gt;wgAllowUserCss&amp;lt;/code&amp;gt;をtrueにして有効にするか、MediaWiki&amp;amp;#58;Common.cssを直接編集するとよい。管理がしやすいので当サイトでは後者の方法を採用した。&lt;br /&gt;
&lt;br /&gt;
当サイトでは使っていないがJSについても同じ（&amp;lt;code&amp;gt;wgAllowUserJs&amp;lt;/code&amp;gt;とMediaWiki&amp;amp;#58;Common.js）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;スキンに関するcss&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== スキンに関するCSS ====&lt;br /&gt;
&lt;br /&gt;
当サイトではVectorテーマを使用しているので、MediaWiki&amp;amp;#58;Vector.cssの内容も適用される。さらにVector 2022を使っているのでMediaWiki&amp;amp;#58;Vector&amp;amp;#45;2022.cssの内容も適用される。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;設定内容としては、ja.wikipedia.orgに合わせて文字サイズを0.875emから0.944emに変更している。&amp;lt;/s&amp;gt;現在は0.944→0.974に変更している。さらに、&amp;lt;code&amp;gt;vector&amp;amp;#45;font&amp;amp;#45;size&amp;lt;/code&amp;gt;（[[MediaWiki#文字サイズ|文字サイズ]]参照）関連の設定が優先される状態になっている。&lt;br /&gt;
&lt;br /&gt;
=== 文字サイズ ===&lt;br /&gt;
&lt;br /&gt;
MediaWikiの文字サイズは結構小さくて、Google検索コンソールでも評価を下げられたりすることがあり、[[MediaWiki#スキン・デザイン|CSS/JS]]の通りにサイズを手動で大きくするなどしていた。しかし、最近（2025/04）Wikipediaなどを見たら文字サイズが改善していて、さらによく見ると右側に表示（Appearance）というサイドバーがあり、非ログインユーザーでも文字サイズを3段階で変更できる（Cookieに保存される）ようになっている。&lt;br /&gt;
&lt;br /&gt;
これは[https://www.mediawiki.org/wiki/Topic:Ybg9afru94numvhu The Appearance menu and new default standard font size will be available for logged-out users on Project:Village Pump/Flow]などに詳しく書いてあるが、どうやらver1.43前後からこの機能が追加されたようである。&lt;br /&gt;
&lt;br /&gt;
ただし、デフォルトでは非ログインユーザーの文字サイズは3段階の一番小さいものに設定されており見づらい。このデフォルト値をLocalSettings.phpで変更する方法は多分なさそうだが、ソースコードを読むと、&amp;lt;code&amp;gt;skins/Vector/skin.json&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;&amp;amp;quot;vector&amp;amp;#45;font&amp;amp;#45;size&amp;amp;quot;&amp;amp;#58; 0&amp;lt;/code&amp;gt;を例えば&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;に変更するとデフォルトが真ん中のサイズになることがわかる。&lt;br /&gt;
&lt;br /&gt;
上記リンクには、いずれデフォルトがStandardサイズ（つまり&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;）に変更されるだろうと書いてある。そして、日本語版Wikipediaでは既にデフォルトが&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;になっている。しかし、現時点の日本語版WikipediaのMediaWIkiのバージョン（[https://ja.m.wikipedia.org/wiki/Special:Version バージョン情報]）である1.44.0&amp;amp;#45;wmf.27 (fbabd90)（かなり新しい）では、依然として上記の設定値に&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;になっていた（[https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/skins/Vector/+/refs/heads/wmf/1.44.0-wmf.27/skin.json skin.json - mediawiki/skins/Vector - Gitiles]）。日本語版Wikipediaでもソースコードにカスタマイズが入っているのか、それとも他の方法があるのかは不明。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;モバイルminerva&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== モバイル・minerva ===&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Extension:MobileFrontend/ja Extension:MobileFrontend - MediaWiki]を使うと、モバイルデバイスでアクセスした際に（デフォルトでは）minerva（&amp;lt;code&amp;gt;MinervaNeue&amp;lt;/code&amp;gt;）スキンが使われるようになる。&lt;br /&gt;
&lt;br /&gt;
minervaスキンだとカテゴリが表示されないが、LocalSettings.phpに&amp;lt;code&amp;gt;$wgMinervaShowCategories &amp;amp;#61; &amp;amp;#91; &amp;amp;#39;base&amp;amp;#39; &amp;amp;#61;&amp;amp;gt; true &amp;amp;#93;&amp;amp;#59;&amp;lt;/code&amp;gt;と書くことで表示されるようになる。&amp;lt;code&amp;gt;$wgMinervaShowCategoriesButton &amp;amp;#61; &amp;amp;#91; &amp;amp;#39;base&amp;amp;#39; &amp;amp;#61;&amp;amp;gt; true &amp;amp;#93;&amp;amp;#59;&amp;lt;/code&amp;gt;という情報も出てくるが、現在の最新版ではこれは効果がなかった。&lt;br /&gt;
&lt;br /&gt;
== シェルアクセス ==&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Manual:Maintenance_scripts/Running_the_scripts#No_shell_access Manual&amp;amp;#58;Maintenance scripts/Running the scripts &amp;amp;#45; MediaWiki]にあるように、シェルアクセスがないところで使っている場合は拡張機能でどうにかする。2つ書いてあるがMaintenanceShellのほうがいろいろと良さそう。MaintenanceShellは、有効にしたあと、Special&amp;amp;#58;MaintenanceShellにアクセスする。&lt;br /&gt;
&lt;br /&gt;
しかし、generateSitemapとかはまともに動かなかった。まあやはりというか、普通はシェルアクセスのあるところで使ったほうがいいっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;api&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
nodeでやる。requestはdeprecatedになったのでaxiosを使う。&lt;br /&gt;
&lt;br /&gt;
cookieを使うってことがどこにも書いてなくて難しかった。[https://stackoverflow.com/questions/49367096/how-to-login-to-mediawiki-wikipedia-api-in-node-js ここ]でようやく見つけた。&lt;br /&gt;
&lt;br /&gt;
== 画像 ==&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Help:Images/ja Help&amp;amp;#58;画像 &amp;amp;#45; MediaWiki]に詳しく書いてある。&lt;br /&gt;
&lt;br /&gt;
MediaWikiにアップロードするのが原則だが、[https://www.mediawiki.org/wiki/Manual:$wgAllowExternalImages $wgAllowExternalImages]という変数を設定することで外部サイトの画像を直接掲載できる。このサイトは個人サイトであり、管理しやすい（普通のアップロードだとランダムなフォルダに入れられたりするし、移行が煩雑そう）のでこちらを使っている。&lt;br /&gt;
&lt;br /&gt;
==== サイズ ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;style&amp;amp;#61;&amp;amp;quot;max&amp;amp;#45;width&amp;amp;#58;100%&amp;amp;#59; height&amp;amp;#58;auto&amp;amp;#59;&amp;amp;quot;&amp;lt;/code&amp;gt;みたいなCSS（当サイトでは前述のCommon.cssに入れた）を使えば、外部サイトの画像でもサイズを変えられる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;500-internal-server-error&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 500 internal server error ====&lt;br /&gt;
&lt;br /&gt;
アップロードまではできたが、画像ファイルが（ftpで見てもちゃんとアップロードされているのに）500 internal server errorで見れない。&lt;br /&gt;
&lt;br /&gt;
これはstarserverの性質かもしれないが、どうやらimages直下の.htaccessが悪いようで、これを消したら見れた。実際に悪さをしているのは&amp;lt;code&amp;gt;Options +FollowSymLinks&amp;lt;/code&amp;gt;だったっぽい。これをコメントアウトすると見れた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;urlを短くする&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== URLを短くする ==&lt;br /&gt;
&lt;br /&gt;
最初の設定だとURLに&amp;lt;code&amp;gt;index.php?title&amp;amp;#61;&amp;lt;/code&amp;gt;のような見栄えのよくない文字列が入ってしまうが、Wikipediaのように&amp;lt;code&amp;gt;example.com/wiki/タイトル&amp;lt;/code&amp;gt;のような形式が使えるように設定することもできる。[https://www.mediawiki.org/wiki/Manual:Short_URL/ja Manual&amp;amp;#58;短縮URL &amp;amp;#45; MediaWiki]に案内がある。そこに書いてある通り、URLに&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が入っているのは見栄えだけでなくSEO上もあまりよくないとのこと。&lt;br /&gt;
&lt;br /&gt;
注意点として、&amp;lt;code&amp;gt;index.php?title&amp;amp;#61;&amp;lt;/code&amp;gt;形式を短い形式に強制的にリダイレクトさせるわけではない（index.phpは単なる記事の閲覧以外にも使われるので、そのように設定するのは面倒そう）。ただ、この状態でも、記事間リンクは短いURLを使ってくれるようになる。あとはWikiSEO拡張（後述）を使うと検索エンジンにも短いURLが通知される。&lt;br /&gt;
&lt;br /&gt;
このサイトはサーバーがApacheなので、[https://www.mediawiki.org/wiki/Manual:Short_URL/Apache Manual&amp;amp;#58;Short URL/Apache &amp;amp;#45; MediaWiki]の通りにする。長々と説明が書いてあるが、普通に設定するなら&amp;lt;strong&amp;gt;Simple instructions&amp;lt;/strong&amp;gt;のところだけ読めばよい。URLに設定したい場所（たとえば&amp;lt;code&amp;gt;wiki&amp;lt;/code&amp;gt;）が既にMediaWikiのフォルダとして使われているとうまくいかない（このサイトの場合は&amp;lt;code&amp;gt;mw&amp;lt;/code&amp;gt;なので大丈夫）ので、この記事の最初の方にある通りにMediaWikiのフォルダのほうを動かす。&lt;br /&gt;
&lt;br /&gt;
== テンプレート ==&lt;br /&gt;
&lt;br /&gt;
MediaWikiにはテンプレートというものがあり、記事のパーツを引用して使いまわすことができる。このWikiでもWikipediaの「[https://ja.wikipedia.org/wiki/Template:%E7%8B%AC%E8%87%AA%E7%A0%94%E7%A9%B6 独自研究]」などに倣ったメッセージボックスをいくつかテンプレートとして利用している。&lt;br /&gt;
&lt;br /&gt;
例えば、まず以下のような汎用の&amp;lt;code&amp;gt;Mbox&amp;lt;/code&amp;gt;というテンプレートを作り（色も引数で指定できるのがポイント）、&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;html&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;border-left: 0.4rem solid #119922&amp;quot; &amp;gt;&amp;lt;div style=&amp;quot;padding-left: 10px; padding-right: 10px;  border: 1px solid #222222; background-color:#FBFBFB; border-left: 0.4rem solid {{{1}}}&amp;quot; &amp;gt;{{{2}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;Template:Mbox&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これを利用して下書きのテンプレートを作っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;{{Mbox|#000022|このセクションの内容は未完成であり、今後の加筆が予定されています。}}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;Template:Stub&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;seoogp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SEO・OGP ==&lt;br /&gt;
&lt;br /&gt;
まずは[https://www.mediawiki.org/wiki/Extension:WikiSEO/ja WikiSEO]というextensionを同じように入れる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ogp&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OGP ====&lt;br /&gt;
&lt;br /&gt;
このサイトではとりあえず大した設定はしておらず、&amp;lt;code&amp;gt;$wgWikiSeoDefaultImage &amp;amp;#61; &amp;amp;quot;http&amp;amp;#58;//turgenev0.starfree.jp/mw/logo0.png&amp;amp;quot;&amp;amp;#59;&amp;lt;/code&amp;gt;でロゴを設定し（相対パスでも表示はされるようだが、[https://webma.xscore.co.jp/study/ogp-seo/ SNSで重要なOGPとは？SEOとの関係性や設定方法を解説 &amp;amp;#45;webma&amp;amp;#45;]とかを見ると多分絶対パスのほうがよさそう）、各ページに&amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;&amp;amp;#35;seo&amp;amp;#58;|title&amp;amp;#61;&amp;amp;#123;&amp;amp;#123;FULLPAGENAME&amp;amp;#125;&amp;amp;#125; &amp;amp;#45; Turgenev&amp;amp;#39;s Wiki&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;と書いただけで、あとは何もしていない。先ほどの「URLを短くする」をやっておくと、そちらのURLが正規URL（カノニカルURL）として扱われるっぽい。&lt;br /&gt;
&lt;br /&gt;
表示を確かめたいときは[https://developers.facebook.com/tools/debug/?locale=ja_JP シェアデバッガー &amp;amp;#45; Meta for Developers]を使うとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;&amp;amp;#35;seo&amp;amp;#58;...&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;でimageなどを一度設定してしまうと、後でimageを消してもその設定がそのまま残ってしまった（WikiSEOの&amp;lt;code&amp;gt;wfLoadExtension&amp;lt;/code&amp;gt;を外すと消えるが、付けるとまた復活する）。おそらくページなどを格納しているMySQLデータベースのどこかに前回の設定が残っているのであろう。ページを削除するとリセットできるがそれ以外の治し方は不明。&lt;br /&gt;
&lt;br /&gt;
==== サイトマップ ====&lt;br /&gt;
&lt;br /&gt;
generateSitemap.phpを使えばよい。しかし以前使っていたスターサーバーフリーではシェルアクセスがなくて使えなかったので自前で生成できるようにした（参考&amp;amp;#58; [[フィルターされたNotionページによるMediaWiki|フィルターされたNotionページによるMediaWiki]]）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;その他seo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== その他SEO ====&lt;br /&gt;
&lt;br /&gt;
そこまでの必要性を感じないが、気が向いたらやるかも。&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=339</id>
		<title>Windowsの右クリックメニューから複数ファイルをまとめて開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%8B%E3%82%89%E8%A4%87%E6%95%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E9%96%8B%E3%81%8F&amp;diff=339"/>
		<updated>2025-05-06T04:36:16Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;複数のファイルを別々にではなく&amp;lt;strong&amp;gt;一度にまとめて&amp;lt;/strong&amp;gt;開きたいということがある。すなわち”app.exe file1” “app.exe file2”…をそれぞれ実行するのではなく、”app.exe file1 file2 …”を実行したい。例えば複数の音楽ファイルを連続再生したいときなどである。&lt;br /&gt;
&lt;br /&gt;
ただ、エクスプローラ上で複数ファイルを選択して開く（右クリックで「開く」を選ぶorエンターキー）と、別々に実行されてしまう。では、右クリックメニューからこれを実行するにはどうすればいいか？というのがこの記事のテーマである。&lt;br /&gt;
&lt;br /&gt;
ついでに、パス長さ制限を超えるファイルやフォルダにおける機能制限も解決する。  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows10以前の右クリックメニューに戻す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windows10以前の右クリックメニューに戻す ==&lt;br /&gt;
&lt;br /&gt;
まず、Windows11に移行すると右クリックメニューの項目数が大幅に削られており、とても使いにくいので、Windows10までの仕様に戻す必要がある。[https://pc-karuma.net/right-click-context-menu-back-on-windows-11 Windows 11 &amp;amp;#45; 右クリックメニューを旧仕様に戻す方法 &amp;amp;#45; PC設定のカルマ]などに従って修正しよう。コマンド例は以下。これはユーザーごとの設定なので、&amp;lt;strong&amp;gt;管理者権限は不要&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&amp;quot; /f /ve&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ファイルを開く操作ならダブルクリックでできるわけで、それでもあえてファイルを右クリックするユーザーの層を考えれば、使用頻度の高いメニューに絞る必要がないことは明らかである。右クリックメニューは動作が重いという問題点も指摘されてきたが、それなら項目数を削る以外の方法でパフォーマンスを改善するのが筋だろう。そもそも、Windows 11の右クリックメニューもそれほど快適な動作ではない。&lt;br /&gt;
&lt;br /&gt;
なおバージョン22H2からはShift+右クリックで旧仕様のメニューが出るようになったようなので、それで十分という人は設定しなくてもよい。&lt;br /&gt;
&lt;br /&gt;
ちなみにこれ以降も同じだが、&amp;lt;code&amp;gt;HKEY_CURRENT_USER&amp;lt;/code&amp;gt;以下はユーザー別設定なのでPC自体の再起動をしなくてもログアウト（サインアウト）→ログイン（サインイン）で全て反映されるはず。また今回の例に関しては、実際にはexplorerの再起動で十分である。&lt;br /&gt;
&lt;br /&gt;
=== 動画の右クリックメニューの順番がおかしい ===&lt;br /&gt;
&lt;br /&gt;
動画ファイル（mp4やmkvなど）に関して、右クリックメニューの順番がおかしくなるという問題がある。具体的には、全ファイル共通のメニュー（「お気に入りに追加」など）とClipchampのメニューが普通の「開く」よりも上に表示されてしまう。また単一ファイル選択時だと（関連付けがすでに設定されているにもかかわらず）「プログラムから開く」が太字になってしまっている。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/clipchamp-mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これはどうやらClipchampのメニューが悪いらしく、[https://www.elevenforum.com/t/add-or-remove-edit-with-clipchamp-context-menu-in-windows-11.6882/ Add or Remove Edit with Clipchamp Context Menu in Windows 11 Tutorial | Windows 11 Forum]（[https://www.elevenforum.com/t/clipchamp-context-menu-removal.6150/ Clipchamp context menu removal | Windows 11 Forum]に書いてあった）や[https://www.naporitansushi.com/clipchamp-context-menu-disable/# Windowsの右クリックの「Clipchampで編集」を削除する方法 | ナポリタン寿司のPC日記]に書いてある通り、Clipchampのメニューを非表示にすると治る。コマンド例は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;reg add &amp;quot;HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked&amp;quot; /v {8AB635F8-9A67-4698-AB99-784AD929F3B4} /f&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* HKLMでも設定できる。また、「デバイス キャスト」を非表示にする場合はUUIDを&amp;lt;code&amp;gt;&amp;amp;#123;7AD84985&amp;amp;#45;87B4&amp;amp;#45;4a16&amp;amp;#45;BE58&amp;amp;#45;8B72A5B390F7&amp;amp;#125;&amp;lt;/code&amp;gt;に変える。&lt;br /&gt;
&lt;br /&gt;
Clipchampを表示したまま順番を治す方法は不明だが、自分でメニューを作ればできるかもしれない。Clipchampのメニューの実装に使われていると思われるIContextMenuについては後でも述べているのでそちらも参照。おそらくClipchampによるこのインターフェースの実装にバグがあるためにこのような挙動をしているのであろう。&lt;br /&gt;
&lt;br /&gt;
以下に修正後の正しい表示を載せておく。いずれの例でも関連づけはデフォルトのメディア プレイヤーが使われているものと仮定している（書いていて気付いたが、同一アプリにもかかわらず「プレーヤー」「プレイヤー」の表記ゆれがある）。&lt;br /&gt;
&lt;br /&gt;
* 単一ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/sing.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 複数ファイル選択時&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/win-rc/mult.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 不完全な解決策 ==&lt;br /&gt;
&lt;br /&gt;
本題に入る。まずは、不完全ではあるがそこそこ簡単な解決策を紹介する。それは右クリックメニューにある「送る」を使う方法である。エクスプローラのアドレスバーに&amp;lt;code&amp;gt;shell&amp;amp;#58;sendto&amp;lt;/code&amp;gt;と入力すると「送る」メニューの元になっているフォルダを開くことができる。ここにショートカットやファイルを追加しておけば、それが右クリックメニューに表示され、選択されたファイルをまとめてコマンド引数として渡してくれる。ショートカットを編集すればオプションも渡せる（あるいはバッチファイルを突っ込んでもよい）。&lt;br /&gt;
&lt;br /&gt;
* 今後紹介する方法にも共通するが、ファイルの順番としては、メインとして選択されたもの（右クリックされたもの）から下方向に進んでいき、下端まで達したら一番上に戻ってそれから選択されたものの直前まで進む。例えばファイルが”0”から”9”までの10個あるフォルダで全選択をして”5”を右クリックして「送る」を使うと、5 6 7 8 9 0 1 2 3 4の順番で渡される。&lt;br /&gt;
&lt;br /&gt;
しかしこの「送る」には弱点があり、&amp;amp;#91;ref&amp;amp;#93;で紹介したように、この「送る」メニューは260文字の長さ制限を超えるパスをもつファイルに対してはうまく機能しない。音楽ファイルなんかはアーティスト名も曲名も色々入って長大な名前になりがちで、実際に自分がこれで困ることになった。&lt;br /&gt;
&lt;br /&gt;
もう一つ、「送る」メニューは拡張子に関連付けられないという問題がある。つまり、音声ファイルを一度に開くためだけのコマンドも、画像ファイルを一度に開くためだけのコマンドも、全てのファイルを対象とした「送る」メニューにまとめて入れざるを得ない。メニュー数が無駄に増えればそれだけ管理・操作もしづらくなる。ついでに言えば、「送る」を一旦クリックしてから中の項目を選ぶ手間もなかなかバカにできないところがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;前提知識-&amp;amp;#45;-メニューを管理するレジストリ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 前提知識 &amp;amp;#45; メニューを管理するレジストリ ==&lt;br /&gt;
&lt;br /&gt;
右クリックメニュー関連の設定はレジストリを使って管理されている。この記事では上記「送る」の問題を解決する方法をこの後で2つ紹介するが、いずれもレジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;という名前のキー（設定内容に応じて色々な所に設置されている）を編集する必要がある。それにあたって、前提知識としてレジストリの内容をある程度理解しておく必要があるだろう。&lt;br /&gt;
&lt;br /&gt;
この話題に関しては比較的多くのサイトで解説があるが、Windowsのバージョンごとにかなり頻繁に仕様が変わっているようで、不十分なサイトも多い。最も優れているのは[https://www.pg-fl.jp/program/winreg/classes.htm Windowsレジストリ解剖記]で、かなり量は多いが、バージョンによる挙動の違いまで細かく示されている。&lt;br /&gt;
&lt;br /&gt;
この記事に必要な操作を行うためには&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の場所だけわかっていればいちおう十分だが、以下の内容くらいは覚えておいたほうがよい。&lt;br /&gt;
&lt;br /&gt;
* HKEY_CURRENT_USERはHKCUと略され、ユーザーごとの設定を管理する。原則、変更はユーザー権限のみで可能。色々いじっても比較的安全。&lt;br /&gt;
* HKEY_LOCAL_MACHINEはHKLMと略され、システム全体（全ユーザー対象）の設定を管理する。変更には管理者権限が必要。設定は慎重に。&lt;br /&gt;
* HKEY_CLASSES_ROOTはHKCRと略され、関連付け専用のもので、&amp;lt;strong&amp;gt;HKCU\Software\ClassesとHKLM\Software\Classesの内容を合わせたものが表示される&amp;lt;/strong&amp;gt;。関連づけの設定を確認するにはここを見るのがいいが、設定を変更する際にはここをいじるとHKLMのほうが変わってしまうことがあるので&amp;lt;strong&amp;gt;HKCU\Software\Classesを変更したほうがよい&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
以下では、設定方法を①ProgIDを使うもの②完全に独自のメニューを追加するもの と大きく二つに分けて記述する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;progidを使うもの&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ProgIDを使うもの ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
特定の拡張子をもつファイルをダブルクリックやEnterで開くときに使われるプログラム、あるいは「既定のプログラム」あるいは「ファイルを開くプログラムの選択」のようなダイアログが表示されるときに表示されるプログラムは、この&amp;lt;strong&amp;gt;ProgID&amp;lt;/strong&amp;gt;を用いて管理されている。この方法のメリットは、何より「ダブルクリックまたはEnterキー一発で起動できる」という操作性である。また、Windows11以前のメニューに戻さなくても使いやすい。&lt;br /&gt;
&lt;br /&gt;
* 複数選択した際は「送る」と同様の順番で渡されるが、右クリックをしない場合は”メインとして選択されたファイル”がどれであるかが若干分かりづらい。基本的には最後に（左）クリックされたものになるはずで、よく見るとそれだけ少し太い（濃い）枠で表示されていることがわかる。なので音楽再生時など複数ファイルを上のものから順にすべて渡したいときは、「&amp;lt;strong&amp;gt;先に一番下にあるファイルをクリックしてから、一番上にあるファイルをShift+ダブルクリック（あるいはShift+クリックしたあとEnter）する&amp;lt;/strong&amp;gt;」というのが有効である。&lt;br /&gt;
&lt;br /&gt;
一方で、設定のしくみはやや煩雑である。具体的には、拡張子.xxxに対して&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.xxx\UserChoice&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
というキーがあって、ここの&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;の値を&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;としたときの&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value\shell\open\command&amp;lt;/code&amp;gt;の内容に従ってアプリケーションが起動される。&lt;br /&gt;
&lt;br /&gt;
Windows10以降では&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するためには普通の管理者権限やSYSTEMよりもさらに上位のTrustedInstaller権限が必要である。AdvancedRunなどを使ってTrustedInstaller権限で変更することは一応できたが、ハッシュ値の生成までちゃんとやっていないので自動で修正されてしまった（ここが解決できるかどうかは未調査）。従って、任意のコマンドを設定したい際は、まず&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の中身を変更するところだけエクスプローラーのダイアログを使い、その後で&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\value&amp;lt;/code&amp;gt;の中身を好きに変えるほうがよいだろう。&lt;br /&gt;
&lt;br /&gt;
例えば新たなメニューを追加したい場合なら、以下のようにするとよい。&lt;br /&gt;
&lt;br /&gt;
* 今まで使われていない（乱数値など）名前をもつダミーのexeファイル（実行ファイルとして正しく機能する必要はなく、空のファイルでもいいし、拡張子がexeでなくてもよい）を用意する（ここでは&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;とする）&lt;br /&gt;
* 関連付けたい拡張子のファイルの右クリックメニューから「プログラムを開く」を選択し、&amp;lt;code&amp;gt;dummy.exe&amp;lt;/code&amp;gt;を選んで関連づける&lt;br /&gt;
** これによりレジストリキー&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe&amp;lt;/code&amp;gt;が作られた上で&amp;lt;code&amp;gt;UserChoice&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;ProgId&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;Applications\dummy.exe&amp;lt;/code&amp;gt;が書き込まれる&lt;br /&gt;
* &amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\Applications\dummy.exe\shell\open&amp;lt;/code&amp;gt;の中身を自由に変更する。&lt;br /&gt;
&lt;br /&gt;
=== 完全に独自のメニューを実装する ===&lt;br /&gt;
&lt;br /&gt;
これは、「PowerShellをここで開く」「VS Codeで開く」のように完全に独自の右クリックメニューを追加するものである。設定は意外と簡単である。また、フォルダに対する右クリックメニューや全ファイルに共通の右クリックメニューを追加するにはこの方法しかない。ただし、Windows10以前のメニューに戻さないと「その他のオプション」を押す手間がかかるので注意。&lt;br /&gt;
&lt;br /&gt;
拡張子ごとの設定は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations&amp;lt;/code&amp;gt;にある（編集時は&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;を使うのがいいだろう）（比較的新しいWindowsだと&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations&amp;lt;/code&amp;gt;キー自体が存在しないことがあるが、自分で作ればちゃんと動作する）。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーは&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\SystemFileAssociations\.xxx\shell\yourcommandname\command&amp;lt;/code&amp;gt;のような場所に作られることになる。&lt;br /&gt;
&lt;br /&gt;
また、全てのファイルを対象にするメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\&amp;amp;#42;&amp;lt;/code&amp;gt;、フォルダを右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory&amp;lt;/code&amp;gt;、ドライブ（C&amp;amp;#58;\など）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Drive&amp;lt;/code&amp;gt;、フォルダ（・ドライブ）の背景（何もないところ）を右クリックしたときのメニューは&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\Directory\Background&amp;lt;/code&amp;gt;以下でそれぞれ管理されている。また、&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\AllFilesystemObjects&amp;lt;/code&amp;gt;というのもあり、これはディレクトリとファイルの両方に適用される（ドライブやフォルダ背景には影響なし）。&lt;br /&gt;
&lt;br /&gt;
* 一覧は[https://learn.microsoft.com/ja-jp/windows/win32/shell/reg-shell-exts ここ]かな？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;複数種類に一括で追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 複数種類に一括で追加？ ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT&amp;lt;/code&amp;gt;には&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;という値があり、これに&amp;lt;code&amp;gt;video&amp;lt;/code&amp;gt;などと指定されている場合は&amp;lt;code&amp;gt;HKEY_CLASSES_ROOT\SystemFileAssociations\video&amp;lt;/code&amp;gt;にある設定が反映される（これによって複数種類のファイルに共通するメニューが作れる）…というような情報もあったのだが、手元のWindows 11では全く反映されなかった。&lt;br /&gt;
&lt;br /&gt;
そもそも&amp;lt;code&amp;gt;PerceivedType&amp;lt;/code&amp;gt;に複数種類が指定できるか不明だったりと色々と意義が怪しいので諦めて各拡張子ごとに追加するのがよいのではないかと思う。CLSIDの部分は共通化されているわけなのでそれほど非効率な二重管理ということにもならないだろう。（そもそもこの辺のWindowsの仕様はころころ変わるっぽいのであまり頑張ってもしょうがないかも？）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;directorybackgroundの表示&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Directory\Backgroundの表示 ===&lt;br /&gt;
&lt;br /&gt;
エクスプローラーの左側のエリアにあるフォルダやドライブを右クリックしたときのメニューには、なぜかDirectory\Backgroundの内容も表示されてしまう。そのうえ、これらには正しくパラメータが渡されない（commandに直接書くときは&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;などが入っていると起動せず、COM使用（少なくともDelegateExecute）で受け取る方法も不明）。&lt;br /&gt;
&lt;br /&gt;
ただ、DirectoryやDriveに同名のメニューが登録されている場合はそちらが優先される。しかし、これを利用してメニューを非表示にすることはできない。（DirectoryやDriveのほうにLegacyDisableを書いたら、そもそもそちらが無かったのと同じになるっぽい）&lt;br /&gt;
&lt;br /&gt;
実際には、Directory\Backgroundに設定するメニューはDirectoryにもDriveにも等しくあったほうがいい場合が多いと思うので、そのように設定するとよいだろう。&lt;br /&gt;
&lt;br /&gt;
=== その他設定項目 ===&lt;br /&gt;
&lt;br /&gt;
本筋とは関係ないので詳細は省くが、その他にもこれらのキーでは様々な設定ができる。&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;によるアイコンの設定&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;によるキーの設定（「&amp;amp;quot;編集(&amp;lt;u&amp;gt;E&amp;lt;/u&amp;gt;)&amp;amp;quot;のEみたいなやつ」）&lt;br /&gt;
* &amp;lt;code&amp;gt;MUIVerb&amp;lt;/code&amp;gt;（多分、言語設定ごとの表示文字列の切り替えとかができるようになるやつ）&lt;br /&gt;
* &amp;lt;code&amp;gt;AppliesTo&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DefaultAppliesTo&amp;lt;/code&amp;gt;による表示条件の設定&lt;br /&gt;
** AQS書式というのが使用可能で、かなり柔軟な指定ができる（特定フォルダ内のみに表示するなど）。ただしあまり情報がなく、[https://www.pg-fl.jp/program/winreg/classes.htm Windows レジストリ 解剖記]でもそこまで詳細な解説はない。そこからもリンクされている[https://learn.microsoft.com/ja-jp/windows/win32/search/-search-3x-advancedquerysyntax?redirectedfrom=MSDN MSの公式ドキュメント]を読むのが早そう。あと、Backgroundメニューではそもそも背景フォルダに関する情報が全く渡されてこないようで（ただしどこかに書いてあったのではなく実験の結果）、使い物にならない。&lt;br /&gt;
*** Backgroundでは使えなかったという投稿の例&lt;br /&gt;
**** [https://superuser.com/questions/1020415/windows-explorer-context-menu-to-a-especific-folder-background Windows Explorer&amp;amp;#58; Context menu to a especific folder (background) &amp;amp;#45; Super User]&lt;br /&gt;
**** [https://stackoverflow.com/questions/47325736/windows-context-menu-directory-background-appliesto shell &amp;amp;#45; Windows context menu directory\background AppliesTo &amp;amp;#45; Stack Overflow]&lt;br /&gt;
* &amp;lt;code&amp;gt;HasLUAShield&amp;lt;/code&amp;gt;による「管理者アイコン」の表示（&amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;との併用可）&lt;br /&gt;
** これも実は上と同様にAQS書式で管理者アイコンの表示条件を設定できる&lt;br /&gt;
** このアイコン自体はSystem32のimageres.dllとかUserAccountControlSettings.exeとかに入っている&lt;br /&gt;
* &amp;lt;code&amp;gt;SubCommands&amp;lt;/code&amp;gt;によるサブメニューの登録&lt;br /&gt;
** 手元のWindows11で試した限り、&amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Drive&amp;lt;/code&amp;gt;ではうまくいくが&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;だとサブメニューが出ない？&lt;br /&gt;
* &amp;lt;code&amp;gt;ExtendedSubCommandsKey&amp;lt;/code&amp;gt;値による他の&amp;lt;code&amp;gt;shell&amp;lt;/code&amp;gt;キーへの参照によるサブメニューの登録&lt;br /&gt;
** かなり強力で、循環参照も作れる。&lt;br /&gt;
** 例&amp;amp;#58; [http://nonsubject.arinco.org/2011/08/ Nonsubject&amp;amp;#58; 8月 2011]&lt;br /&gt;
** 一つのルートメニューが持てるサブメニュー上限は16個までという制限がある。[https://stackoverflow.com/questions/48625223/is-there-a-maximum-right-click-context-menu-items-limit https&amp;amp;#58;//stackoverflow.com/questions/48625223/is&amp;amp;#45;there&amp;amp;#45;a&amp;amp;#45;maximum&amp;amp;#45;right&amp;amp;#45;click&amp;amp;#45;context&amp;amp;#45;menu&amp;amp;#45;items&amp;amp;#45;limit]&lt;br /&gt;
** これは&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;でも有効。&lt;br /&gt;
* &amp;lt;code&amp;gt;Extended&amp;lt;/code&amp;gt;によってShift+右クリックしたときのみ表示させる&lt;br /&gt;
* 設定例&amp;amp;#58; [https://www.tenforums.com/tutorials/178668-add-remove-open-windows-terminal-administrator-context-menu.html Add or Remove &amp;amp;#39;Open in Windows Terminal as administrator&amp;amp;#39; context menu | Tutorials]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;contextmenuhandlersicontextmenuを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== ContextMenuHandlers（IContextMenu）を用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
先ほどのClipchampのメニュー項目などはここまで述べたようにレジストリ内に静的に設定されているものではなくCOM(Component Object Model)を用いて外部のDLLの関数から動的に追加されているものである（ただDLLの指定自体はレジストリ内のInProcServer32のようなキーにあるはず）。Clipchamp以外だと7&amp;amp;#45;ZipやPDF XChange Editorなどのメニューはこれを用いて実装されている。レジストリの&amp;lt;code&amp;gt;XXX\shellex\ContextMenuHandlers&amp;lt;/code&amp;gt;といったキー以下に設定されているものはこれに分類される。&lt;br /&gt;
&lt;br /&gt;
詳しくはIContextMenuなどのキーワードで検索すると出てくる[https://learn.microsoft.com/en-us/windows/win32/shell/shortcut-menu-using-dynamic-verbs Customizing a Shortcut Menu Using Dynamic Verbs &amp;amp;#45; Win32 apps | Microsoft Learn]などを読むとよさそうだが、実装はかなり難解である。Clipchampもこの部分で不適切な実装をしたために順番がおかしくなったのではないかと思われる。&lt;br /&gt;
&lt;br /&gt;
動作確認できたサンプルとしては、[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/NonDefaultDropMenuVerb]はIContextMenuを使って実装されており、dllをビルドしてCLSIDのInProcServer32でそれを指定するとちゃんと右クリックメニューが追加される。&lt;br /&gt;
&lt;br /&gt;
また、メニューを追加する関数であるQueryContextMenuが呼ばれる時点で、引数となっているファイルの情報がわかる（Initialize関数においてIDataObjectが渡されているのでそれをクラスのフィールドなどとして持っておけばよい）ので、特定の拡張子のファイルのみに対してメニューを表示することもできる。もちろんファイルの内容まで読み取ってからメニューを表示するといったこともできるが、そこまですると右クリックするだけで動作が重くなるといった副作用が大きくなるのでやめた方が無難だろう。ただ、スタートメニューへのピン留め&amp;lt;code&amp;gt;&amp;amp;#123;a2a9545d&amp;amp;#45;a0c2&amp;amp;#45;42b4&amp;amp;#45;9708&amp;amp;#45;a0b2badd77c8&amp;amp;#125;&amp;lt;/code&amp;gt;やPDF XChange Editor(9.3や10.2.1で確認)のメニューは実際にそのような挙動をする（余談だが、InfoTipの表示もexplorerが操作しづらくなる原因なのでshowinfotipを0にしたほうがいい）（サムネイルなどはバックグラウンドで並列に走るので操作にはあまり影響がない）。またエラーが発生した場合はexplorer自体が強制終了することもあり、全体的に実装は慎重に行ったほうがよい。&lt;br /&gt;
&lt;br /&gt;
==== コード例 ====&lt;br /&gt;
&lt;br /&gt;
拡張子が.tで始まるファイル（&amp;amp;#42;.txt, &amp;amp;#42;.ttfなど）のみにメニューを追加するサンプル（から抜粋）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;IFACEMETHODIMP CNonDefaultDropMenuVerb::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT /*idCmdLast*/, UINT /*uFlags*/)&lt;br /&gt;
{&lt;br /&gt;
    FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };&lt;br /&gt;
    STGMEDIUM medium;&lt;br /&gt;
    HRESULT hr = _pdtobj-&amp;gt;GetData(&amp;amp;fmte, &amp;amp;medium);&lt;br /&gt;
    if (SUCCEEDED(hr))&lt;br /&gt;
    {&lt;br /&gt;
        HDROP hdrop = (HDROP)medium.hGlobal;&lt;br /&gt;
        WCHAR szFile[MAX_PATH];&lt;br /&gt;
        DragQueryFile(hdrop, 0, szFile, ARRAYSIZE(szFile));&lt;br /&gt;
        const WCHAR* ext = wcsrchr(szFile, L&#039;.&#039;);&lt;br /&gt;
        ReleaseStgMedium(&amp;amp;medium);&lt;br /&gt;
        if (ext &amp;amp;&amp;amp; *(ext+1) != L&#039;t&#039;) {&lt;br /&gt;
            return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);  // Add nothing&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    WCHAR szMenuItem[80];&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKDROP, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKDROP, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    LoadString(g_hinst, IDS_CHECKNETRESOURCES, szMenuItem, ARRAYSIZE(szMenuItem));&lt;br /&gt;
    InsertMenu(hmenu, indexMenu++, MF_BYPOSITION, idCmdFirst + IDM_CHECKNETRESOURCES, szMenuItem);&lt;br /&gt;
&lt;br /&gt;
    return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (USHORT)(2));  // indicate that we added 2 verbs.&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 特定の拡張子に対して追加できるのは以下で知った&lt;br /&gt;
** できるという情報&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://stackoverflow.com/questions/43769772/how-to-add-context-menu-to-one-specific-file registry &amp;amp;#45; How to add context menu to one specific File &amp;amp;#45; Stack Overflow]&lt;br /&gt;
** 実際のコード&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/nyfair/freeimagerip/blob/master/plugin/FIShellExt/Thumb.cc freeimagerip/Thumb.cc at master · nyfair/freeimagerip]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;icontextmenuの今後について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== IContextMenuの今後について ====&lt;br /&gt;
&lt;br /&gt;
Windowsの右クリックメニューが重いと良く言われるのはこのような高い自由度をもつIContextMenuに起因するものであると思われる。Windows11ではIContextMenuよりIExplorerCommandがよいというのを見かけた（[https://twitter.com/kenichiuda/status/1417266893581295651 https&amp;amp;#58;//twitter.com/kenichiuda/status/1417266893581295651]や、そこで引用されている[https://twitter.com/madonomori/status/1417265763363168263 https&amp;amp;#58;//twitter.com/madonomori/status/1417265763363168263]）。[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/ExplorerCommandVerb]も見てみる必要があるかも。&lt;br /&gt;
&lt;br /&gt;
ただまあMicrosoftのことなのでIContextMenuもあと10年くらいは使えるだろう。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/apps/get-started/make-apps-great-for-windows#8-optimize-your-apps-context-menu-extensions-and-share-targets Windows 11 でアプリをすぐれたものにするためにできることトップ 11 &amp;amp;#45; Windows apps | Microsoft Learn] を読んだら、Windows 11の（新しい）右クリックメニューに表示するためにはIExplorerCommandを使わなければならない（IContextMenuは不可）と明確に書いてあった。また、IExplorerCommandのサンプル（[https://learn.microsoft.com/ja-jp/windows/win32/shell/samples-explorercommandverb エクスプローラー コマンド動詞のサンプル &amp;amp;#45; Win32 apps | Microsoft Learn]）を使ってみたが、IExplorerCommandState（CommandStateHandler）のほうは動作しているように見えるものの肝心のIExplorerCommand（ExplorerCommandHandler）は全く反応しなかった（右クリックを一度でも行うとdllへの上書きアクセスが禁止されるので読み込まれてはいるようだが、コンストラクタや&amp;lt;code&amp;gt;QueryInterface&amp;lt;/code&amp;gt;にデバッグ用のメッセージボックスを入れても表示されない）。&lt;br /&gt;
&lt;br /&gt;
==== サブメニュー ====&lt;br /&gt;
&lt;br /&gt;
IContextMenuは自由度が高いのでサブメニューなども実装できるはず（7&amp;amp;#45;Zipなどもそうしていると思われる）。またこのような記事もあった&amp;amp;#58; [http://nonsubject.arinco.org/2014/06/cascading-desktopbackground-menus.html デスクトップのシェルメニューをサブメニューにする | Nonsubject]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows11の右クリックメニューへの追加&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows11の右クリックメニューへの追加 ===&lt;br /&gt;
&lt;br /&gt;
これはどうやらますます面倒になりそうで、リリース済のWindowsストアアプリをインストールするか開発者モードを有効にしないと自分の好きなメニューを追加できない（多分）上、アプリ1つにつき1メニューしか追加できないらしい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windows 11の右クリックメニューに追加してくれるソフト&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/ikas-mc/ContextMenuForWindows11 https://github.com/ikas-mc/ContextMenuForWindows11]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;フォルダ背景を右クリックしたメニューに追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/44 https://github.com/ikas-mc/ContextMenuForWindows11/issues/44]）（いや、使ってみたら普通にできてるっぽい？）、アプリ1つにつき1メニューしか追加できない（[https://github.com/ikas-mc/ContextMenuForWindows11/issues/45 https://github.com/ikas-mc/ContextMenuForWindows11/issues/45]）（これはWindows側がそういう仕様っぽいので厳しそう）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Microsoftの関連するサンプル&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/microsoft/AppModelSamples/tree/master/Samples/SparsePackages AppModelSamples/Samples/SparsePackages at master · microsoft/AppModelSamples]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Meryへの追加要望&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.haijin-boys.com/discussions/6746 Windows 11の新コンテキストメニューにMeryのコマンドを追加したい]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策①comを利用する&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策①COMを利用する ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
まずは、COMを用いて実装するという方法がある。基本的にはこちらが綺麗な解決策である。&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandというインターフェースを具体的に実装している[https://learn.microsoft.com/en-us/windows/win32/shell/samples-executecommandverb Microsoftのサンプル]があったので、それを参考に、「任意コマンドを引数にとり、取得したファイル・フォルダの情報をそのコマンドの標準入力にUTF&amp;amp;#45;8で送信する」というプログラムを作成した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]&lt;br /&gt;
&lt;br /&gt;
COMを使っていることからわかるように、コマンドラインを介さず直接Explorerからデータが送られてくるので、他の方法に共通してみられるパス長さやファイル個数の制限が（事実上）皆無であり、非常に強力である。&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
=== 使い方 ===&lt;br /&gt;
&lt;br /&gt;
詳しい使い方は上記レポジトリのREADMEも参照。&lt;br /&gt;
&lt;br /&gt;
==== 基本 ====&lt;br /&gt;
&lt;br /&gt;
引数となる（実際に起動したい）コマンドはレジストリキー&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HKEY_CURRENT_USER\Software\Classes\CLSID\&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;\LocalServer32&amp;lt;/code&amp;gt;の既定の値で設定する。&lt;br /&gt;
&lt;br /&gt;
その上で該当メニューに対応する&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キー（レジストリの各所にある）に&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;という値を作成して&amp;lt;code&amp;gt;&amp;amp;#123;XXXXXXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXX&amp;amp;#45;XXXXXXXXXXXX&amp;amp;#125;&amp;lt;/code&amp;gt;を書き込むことで起動できる（&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の既定値よりも&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;が優先される）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;idroptargetを用いた実装&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== IDropTargetを用いた実装 ===&lt;br /&gt;
&lt;br /&gt;
IExecuteCommandではなくIDropTargetというインターフェースを用いてもほぼ同じことができそうであった。対応するサンプルは[https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb https&amp;amp;#58;//github.com/microsoft/Windows&amp;amp;#45;classic&amp;amp;#45;samples/tree/main/Samples/Win7Samples/winui/shell/appshellintegration/DropTargetVerb]である。IExecuteCommandとの機能的な違いはあまりよくわからないが、[https://learn.microsoft.com/en-us/windows/win32/shell/samples-droptargetverb https&amp;amp;#58;//learn.microsoft.com/en&amp;amp;#45;us/windows/win32/shell/samples&amp;amp;#45;droptargetverb]を読む限り、DropTargetのほうが古くからあるようである。CLSIDの登録までは同じだが、&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;のかわりに&amp;lt;code&amp;gt;DropTarget&amp;lt;/code&amp;gt;キーを使用し、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値のかわりに&amp;lt;code&amp;gt;CLSID&amp;lt;/code&amp;gt;値を使う（ソースを読めばわかる）。&lt;br /&gt;
&lt;br /&gt;
== 解決策②プロセス間通信で頑張る ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
「プロセス間通信を使って頑張る」という方法もある。要するに、コマンドとしては別々に渡されたとしても、既に立ち上がっているプロセスがあるときはそちらに投げて終了するようにすれば、一つのプロセスでまとめて開けるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分を代わりにやってくれるものとしては[https://github.com/zenden2k/context-menu-launcher https://github.com/zenden2k/context-menu-launcher]がある。これを少し改善したフォークとして[https://github.com/KnIfER/SingleInstance-Launcher https://github.com/KnIfER/SingleInstance-Launcher]があり、さらに自分が64bit版のビルドを加えたものが[https://github.com/ge9/SingleInstance-Launcher https://github.com/ge9/SingleInstance-Launcher]にある。&lt;br /&gt;
&lt;br /&gt;
ただ、これはCOMを使う方法とは違っていくつかの欠点がある。&lt;br /&gt;
&lt;br /&gt;
* ファイル個数の上限&lt;br /&gt;
** ProgIDを使って開く場合には、選択個数がデフォルトで15個までに設定されており、これはMultipleInvokePromptMinimum値（詳しくは他サイト）の変更により増やせるが確実ではない（上限に諸説あり）。&lt;br /&gt;
** 独自メニューの場合は、&amp;amp;quot;MultiSelectModel&amp;amp;quot;を&amp;amp;quot;Player&amp;amp;quot;にすることでファイル数上限が100個になるが、それより大きくはできない。&lt;br /&gt;
* 長さ制限（260文字）を超えるパスをもつフォルダでは失敗する（詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] を参照）。&lt;br /&gt;
* プロセス間通信を使っているため、起動時にラグがあったりすると、ごく稀に渡されたファイルの順番が乱れることがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;singleinstance&amp;amp;#45;launcher-&amp;amp;#45;-基本的な使い方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== SingleInstance&amp;amp;#45;Launcher &amp;amp;#45; 基本的な使い方 ===&lt;br /&gt;
&lt;br /&gt;
上記GitHubリポジトリから実行ファイルをダウンロードしてどこか分かりやすい場所に置く。インストールなどは不要である。筆者がリリースした実行ファイルを信用できない・改変したいなどの場合はソースコードをどうぞ。言語はC++。ファイルの順番が乱れにくくなる改善など大歓迎。&lt;br /&gt;
&lt;br /&gt;
README.mdにもあるが起動に用いる基本的な構文（レジストリに登録する値）は以下のようである（※ここでは64bit版を使うものとして説明しているが、32bit版でも全く同様）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&amp;quot;C:\path\to\singleinstance_x64.exe&amp;quot; &amp;quot;%1&amp;quot; &amp;quot;C:\Program Files\path\to\app.exe&amp;quot; &amp;quot;$files&amp;quot; --si-timeout 1000 --option-to-app-1 --option-to-app-2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;amp;quot;C&amp;amp;#58;\path\to\singleinstance_x64.exe&amp;amp;quot;、&amp;amp;quot;%1&amp;amp;quot;、&amp;amp;quot;C&amp;amp;#58;\Program Files\path\to\app.exe&amp;amp;quot;、&amp;amp;quot;$files&amp;amp;quot;の順番はおそらくこの通りである必要がある。その後にあるものはapp.exeにオプションとしてそのまま渡されるが、&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;si&amp;amp;#45;timeout n&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に限り&amp;lt;/strong&amp;gt;、singleinstance_x64.exeが解釈し、app.exeに渡されない。このオプションはSingleInstance&amp;amp;#45;Launcherに対して次のファイルが渡されてくるのを待つタイムアウト期間をミリ秒で指定するものである。短すぎると、右クリックメニューの処理が遅い場合に途中で打ち切られてしまう可能性がある。長すぎると、その期間待つまでapp.exeは呼ばれないため、タイムラグが長く不便に感じる可能性がある。特に動作が重いPCでなければ1000（1秒）くらいにしておけば十分だろう。もう少し短くてもいいかもしれない。&lt;br /&gt;
&lt;br /&gt;
%1や$filesの両側にダブルクォーテーションがないと、空白を含むファイル名を正しく扱えない。GitHubのサンプルでは付いていないものもあるので注意。&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&amp;diff=338</id>
		<title>Linuxのインストール</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Linux%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB&amp;diff=338"/>
		<updated>2025-05-06T04:36:12Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linuxのインストールおよびその後の初期設定に関する情報。Windowsとの併用に関しては[[デュアルブート|デュアルブート]] も参照。&lt;br /&gt;
&lt;br /&gt;
自分が使ったことのあるUbuntu（Debian系？）にしか通用しない話もあるかもしれないので注意。&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;iso書き込み&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== ISO書き込み ==&lt;br /&gt;
&lt;br /&gt;
インストールのためにはCD/DVDやUSB（フラッシュメモリでもHDD/SSDでも可）へのisoの書き込みが必要になる。書き込みソフトによってうまく起動したりしなかったりする（特にUSB？）ので色々なものを試すとよい。&lt;br /&gt;
&lt;br /&gt;
==== 参考サイト ====&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
参考サイト&amp;amp;#58;[https://qiita.com/Jies_/items/9774ddd55d6b2070c268 https&amp;amp;#58;//qiita.com/Jies_/items/9774ddd55d6b2070c268]&lt;br /&gt;
&lt;br /&gt;
[https://orumin.blogspot.com/2015/05/securebootlinux.html https&amp;amp;#58;//orumin.blogspot.com/2015/05/securebootlinux.html]&lt;br /&gt;
&lt;br /&gt;
[https://ramsdenj.com/2016/08/29/arch-linux-on-the-surface-pro-4.html https&amp;amp;#58;//ramsdenj.com/2016/08/29/arch&amp;amp;#45;linux&amp;amp;#45;on&amp;amp;#45;the&amp;amp;#45;surface&amp;amp;#45;pro&amp;amp;#45;4.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.rodsbooks.com/refind/installing.html#winprob https&amp;amp;#58;//www.rodsbooks.com/refind/installing.html&amp;amp;#35;winprob]&lt;br /&gt;
&lt;br /&gt;
[http://penguin.tantin.jp/unstable/Ubuntu1610OnSurfacePro4.html http&amp;amp;#58;//penguin.tantin.jp/unstable/Ubuntu1610OnSurfacePro4.html]&lt;br /&gt;
&lt;br /&gt;
== 初期設定全般 ==&lt;br /&gt;
&lt;br /&gt;
[https://sicklylife.jp/ubuntu/2004/settings.html Ubuntu 20.04 LTSをインストールした直後に行う設定 &amp;amp;amp; インストールするソフト] ここはよくまとまっていてわかりやすい。特に時計の設定とユーザフォルダ名変更はいつもやっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;grub&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Grub ==&lt;br /&gt;
&lt;br /&gt;
* quiet splash は不要？（トラブル時に分かりづらいので）&lt;br /&gt;
** セキュリティ的にあったほうが良かったりもするんだろうか&lt;br /&gt;
* デザインはは[https://wiki.archlinux.jp/index.php/GRUB/%E3%83%92%E3%83%B3%E3%83%88%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF#.E3.83.86.E3.83.BC.E3.83.9E 「テーマ」設定]で変えられる。大体dropboxリンクで配布されているが、2012年に投稿されたやつとかはだいたい404Not Foundだった。&lt;br /&gt;
&lt;br /&gt;
==== 再インストール ====&lt;br /&gt;
&lt;br /&gt;
archwikiとか[http://john1851.html.xdomain.jp/notes/ubuntu/repair-grub.html http&amp;amp;#58;//john1851.html.xdomain.jp/notes/ubuntu/repair&amp;amp;#45;grub.html] とか[https://qiita.com/air-gh/items/4265cf4308114092a7a7 https&amp;amp;#58;//qiita.com/air&amp;amp;#45;gh/items/4265cf4308114092a7a7] を見る&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;LiveCD(USB)からならchrootを使う必要がある。以下の通り&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://wiki.ubuntulinux.jp/UbuntuTips/Others/ReinstallGrub2 https&amp;amp;#58;//wiki.ubuntulinux.jp/UbuntuTips/Others/ReinstallGrub2]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://qiita.com/TsutomuNakamura/items/04176b91d791de46142c https&amp;amp;#58;//qiita.com/TsutomuNakamura/items/04176b91d791de46142c]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[http://d.hatena.ne.jp/snsw/20101211/1292036382 http&amp;amp;#58;//d.hatena.ne.jp/snsw/20101211/1292036382]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://qiita.com/gpioblink/items/708b2a5add6c854965cf https&amp;amp;#58;//qiita.com/gpioblink/items/708b2a5add6c854965cf]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://guminote.sakura.ne.jp/archives/316 https&amp;amp;#58;//guminote.sakura.ne.jp/archives/316]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://qiita.com/NewGyu/items/49703922c2f35def43b9 https&amp;amp;#58;//qiita.com/NewGyu/items/49703922c2f35def43b9]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この一番下のやつが一番今後役に立ちそう（他のやつはmbrとかでやってるのも多そう）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== トラブルなど ====&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;NVIDIAのGPUが入っているPCでgrubが出るのにその先行かない（スプラッシュで止まるとか）時はnomodesetをつける（重要）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;セキュアブート関係かわからないが、&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;plain text&amp;quot;&amp;gt;error processing package grub-efi-amd64-signed (--configure):&lt;br /&gt;
 subprocess installed post-installation script returned error exit status 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;というエラーが更新をインストールするたびに出たことがあった。これは[https://askubuntu.com/questions/763472/what-can-i-do-to-fix-this-error-on-grub-efi https&amp;amp;#58;//askubuntu.com/questions/763472/what&amp;amp;#45;can&amp;amp;#45;i&amp;amp;#45;do&amp;amp;#45;to&amp;amp;#45;fix&amp;amp;#45;this&amp;amp;#45;error&amp;amp;#45;on&amp;amp;#45;grub&amp;amp;#45;efi] の通りgrubパッケージを再インストールする。この際途中で、grubのブートローダーのファイルを消しますか？と聞かれて、めんどいので消さないことにしたりして、色々やったり再起動したりしたりしたらなんか治ったきがする。詳細忘れた。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== bcdedit ==&lt;br /&gt;
&lt;br /&gt;
Win側でブート順をいじるためのコマンド。割と使う機会が多いので覚えておくとよい。特に&amp;lt;code&amp;gt;bcdedit /enum firmware&amp;lt;/code&amp;gt;の出力結果を一通り理解しておくと安心。&amp;lt;code&amp;gt;bcdedit /set &amp;amp;#123;fwbootmgr&amp;amp;#125;&amp;lt;/code&amp;gt;あたりもよく使う割に情報が少ない気がする。&lt;br /&gt;
&lt;br /&gt;
[https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/bcdedit-command-line-options?view=windows-11 https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/manufacture/desktop/bcdedit&amp;amp;#45;command&amp;amp;#45;line&amp;amp;#45;options?view&amp;amp;#61;windows&amp;amp;#45;11]&lt;br /&gt;
&lt;br /&gt;
が公式マニュアル&lt;br /&gt;
&lt;br /&gt;
* Linux側で同じ場面で使うのはefibootmgr&lt;br /&gt;
* grubのエントリが消えたときはWinのをcopyするか、createするか（その際applicationはosloaderでもbootsectorでもよい？調べるとどっちも出てくる気がする）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;nvidia&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== NVIDIA ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
筆者による[https://turgenev.hatenablog.com/entry/2019/10/21/001851 NVIDIAドライバのLinuxへのインストール・トラブルシューティング総まとめ &amp;amp;#45; turgenev’s blog]が参考になる。[https://zenn.dev/190ikp/articles/how_to_install_nvidia_drivers こちら]も良い。&lt;br /&gt;
&lt;br /&gt;
== ブルーライトカット ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2018/11/10/171257?_ga=2.83762325.2078320998.1590755417-2046136024.1578745817 ブログ]を参照。そちらでは&amp;amp;#126;/.config/redshift.confを作成する方法を書いてしまったが、常に一定の値にしておきたいだけなら、わざわざそんなことをしなくても、redshift &amp;amp;#45;x（補正を除去）したときに6500Kの値（デフォルトのcolorramp.cでは1.0 1.0 1.0になっている）になることを利用して、そこだけ1.0 0.9 0.6とかに変えてビルドしてスクリプトには./redshift &amp;amp;#45;xだけ書けばよいかも。&lt;br /&gt;
&lt;br /&gt;
==== モニターごとに適用 ====&lt;br /&gt;
&lt;br /&gt;
一部のモニターだけに適用するには、crtcで指定する。ただしcrtcは割と不安定に変わってしまう感じがあるため、xrandrで表示されるoutputの名前（eDP&amp;amp;#45;1とかHDMI&amp;amp;#45;2とか）で指定したい。自分でxrandrの出力から計算するしかなさそう。(eDP&amp;amp;#45;1での)例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
cd `dirname $0`&lt;br /&gt;
./redshift -x&lt;br /&gt;
CRTC=`xrandr --verbose | sed -n &amp;quot;/^eDP-1/,/^\tCRTCs:/p&amp;quot; | sed -n &amp;quot;s/^\tCRTC: *\([0-9]*\)/\1/p&amp;quot;`&lt;br /&gt;
echo $CRTC&lt;br /&gt;
if [ -n &amp;quot;$CRTC&amp;quot; ]; then&lt;br /&gt;
./redshift -m randr:crtc=$CRTC -o&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
なお、eDP&amp;amp;#45;1に関するxrandrの出力のなかに&amp;lt;code&amp;gt;CRTCs&amp;amp;#58;&amp;lt;/code&amp;gt;というフィールドが出現するという仮定のもとにこのスクリプトは書かれていることに注意せよ。&lt;br /&gt;
&lt;br /&gt;
これをディスプレイがつけ外しされるたびに実行する必要がある。自動でできる&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wi&amp;amp;#45;fi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wi&amp;amp;#45;Fi ==&lt;br /&gt;
&lt;br /&gt;
ワイヤレスはWinよりも4本立つ基準が厳しい気がする（速度に有意差はなさそう？調べたらubuntuだけネットワークが遅いという投稿自体はたくさんあったが…）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;右alt&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 右Alt ==&lt;br /&gt;
&lt;br /&gt;
xmodmapを使う [https://qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7 https&amp;amp;#58;//qiita.com/macinjoke/items/746c0c0adb74cfdeb9e7]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wine&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Wine ==&lt;br /&gt;
&lt;br /&gt;
stagingを含む新しめのWineのインストール方法は公式サイトの「Download」を見るとわかる [https://wiki.winehq.org/Download https&amp;amp;#58;//wiki.winehq.org/Download]&lt;br /&gt;
&lt;br /&gt;
== 自動起動 ==&lt;br /&gt;
&lt;br /&gt;
パスに&amp;amp;quot;&amp;amp;#126;&amp;amp;quot;が入ってると正しく展開されないかもしれない。/home/usernameを使ったほうがよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;lubuntu限定っぽい話&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== (L)ubuntu限定っぽい話 ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
自分がLubuntuを使っていた時期のメモをもとにしている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hidpi&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== HiDPI ====&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#126;/.Xresourcesに&lt;br /&gt;
&lt;br /&gt;
Xft.dpi&amp;amp;#58; 180&lt;br /&gt;
&lt;br /&gt;
を書き込むのが一番確実で手軽そう、Xorg.confは怖い&lt;br /&gt;
&lt;br /&gt;
個々のソフトウェアで表示サイズを調節するのはキリがないのでやめたほうがいい&lt;br /&gt;
&lt;br /&gt;
* HiDPI対応とかに関しては例えばLinux Mintのほうが優れているのかもしれない&lt;br /&gt;
&lt;br /&gt;
==== スクロールの向き ====&lt;br /&gt;
&lt;br /&gt;
スクロールの向きはデスクトップ環境の設定でも変えられるが根本のxの設定から変えたほうが良い。（[https://qiita.com/Buuuchi408/items/35dce365ce4a00c947c3 https&amp;amp;#58;//qiita.com/Buuuchi408/items/35dce365ce4a00c947c3]）synclient&lt;br /&gt;
&lt;br /&gt;
を実行し、その結果のVertScrollDeltaとHorizScrollDeltaを負の値にする。そして&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;!/bin/sh&lt;br /&gt;
&lt;br /&gt;
synclient VertScrollDelta&amp;amp;#61;&amp;amp;#45;43&lt;br /&gt;
&lt;br /&gt;
synclient HorizScrollDelta&amp;amp;#61;&amp;amp;#45;43&lt;br /&gt;
&lt;br /&gt;
を自動起動に登録。&lt;br /&gt;
&lt;br /&gt;
==== ウインドウ ====&lt;br /&gt;
&lt;br /&gt;
ウインドウの端が狭すぎて動かしにくいので&lt;br /&gt;
&lt;br /&gt;
[https://askubuntu.com/questions/833950/size-of-grab-area-for-resizing-window-in-lubuntu https&amp;amp;#58;//askubuntu.com/questions/833950/size&amp;amp;#45;of&amp;amp;#45;grab&amp;amp;#45;area&amp;amp;#45;for&amp;amp;#45;resizing&amp;amp;#45;window&amp;amp;#45;in&amp;amp;#45;lubuntu]&lt;br /&gt;
&lt;br /&gt;
に書かれているとおりにやる。ただ、見た目の幅も変わってしまうのであまり美しくない。Alt+右ドラッグで端を持っていなくてもリサイズできるので慣れればそのほうがラクそう&amp;lt;br /&amp;gt;&lt;br /&gt;
あとはマウスカーソルのテーマを変えるとやりやすくなる。DMZみたいなテーマがいい&lt;br /&gt;
&lt;br /&gt;
* そもそも別のデスクトップ環境を選んだ方がいい&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;surface-pro-4にlubuntuを入れる&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Surface Pro 4にLubuntuを入れる ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
Surfaceはハードウェアが色々と独自仕様で、キーボードは動くけどタッチとかはできないので修正のため[https://github.com/linux-surface/linux-surface linux&amp;amp;#45;surface/linux&amp;amp;#45;surface&amp;amp;#58; Linux Kernel for Surface Devices]をインストールする（昔は[https://github.com/jakeday/linux-surface jakeday/linux&amp;amp;#45;surface&amp;amp;#58; Linux Kernel for Surface Devices]だった）。サイトが丁寧。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;※以下リンク切れ多数&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;筆者による[https://turgenev.hatenablog.com/entry/2019/01/17/004545 Surface Pro 4でlubuntu 18.04を使う &amp;amp;#45; turgenev’s blog] も参照（そちらも古い）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;shim&amp;amp;#45;signedパッケージのエラーがaptやるたびにでてるのは&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/jakeday/linux-surface/commits/master/SIGNING.md https&amp;amp;#58;//github.com/jakeday/linux&amp;amp;#45;surface/commits/master/SIGNING.md]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;（現在は最新版が削除されているので[https://github.com/jakeday/linux-surface/blob/a39cc29295318894d624977a107c0999cc0ef6ac/SIGNING.md こちら]）に従ってブートローダーに署名すれば良いっぽい&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ubuntu系に関しては [https://github.com/berglh/ubuntu-sb-kernel-signing https://github.com/berglh/ubuntu-sb-kernel-signing] を使うのが楽そう。設定項目は基本的にはデフォルトのままで進めればいいと思うが、MokManagerに関するものだけなぜかデフォルトがNoになっているのでこれはYesにしたほうがいい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;タッチパネルをすばやく操作すると反応しなくなることがある。その時は[https://github.com/jakeday/linux-surface/issues/55 https&amp;amp;#58;//github.com/jakeday/linux&amp;amp;#45;surface/issues/55]に記載の通り、&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;rmmod intel_ipts&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;modprobe intel_ipts&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;とすれば治る。いちいち打つのは面倒なのでキーボードショートカットにするが、root権限がいるので、root権限無しで実行できる特例としてシェルスクリプトを作り（[https://askubuntu.com/questions/821919/how-do-i-add-sudo-commands-to-a-keyboard-shortcut How do I add sudo commands to a keyboard shortcut? &amp;amp;#45; Ask Ubuntu]など参照）、ホットキー登録する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;USERNAME ALL=(root) NOPASSWD: /usr/local/bin/set-kbd-backlight&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;蓋キーボードハイバーネート&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 蓋（キーボード）、ハイバーネート ====&lt;br /&gt;
&lt;br /&gt;
デフォルトではカバーを閉じるとハイバーネートするようになっているがSurfaceだと起動しなくなってしまう。これは/etc/systemd/logind.confのHandleLidSwitchで設定するのだが、ignoreかpoweroffならとりあえずうまく機能する。lockだとダメでlightdmをrestartする羽目になる。&lt;br /&gt;
&lt;br /&gt;
* 何とかハイバーネートができないかとしばらく頑張ってみたが自分の環境ではあまりうまく動かなかった。たまーに成功した。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=337</id>
		<title>Windowsにおける仮想的ディスプレイ</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BB%AE%E6%83%B3%E7%9A%84%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4&amp;diff=337"/>
		<updated>2025-05-06T04:36:07Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;例えばZoomでプレゼンテーションをするときに、PowerPointの「発表者ツール」を使いたければ、普通は2つのディスプレイが必要である。しかしディスプレイが常に2つあるとは限らないので、画面共有に使用するだけの「仮想的なサブディスプレイ」があればいいのではないか、という発想がうまれる。他には、リモートのみで使用するPCや、ゲーム画面の配信などにおいても需要があるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策1-&amp;amp;#45;-ダミープラグ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策1 &amp;amp;#45; ダミープラグ ==&lt;br /&gt;
&lt;br /&gt;
そこそこ普及している、ハードウェア的な解決策である。端子に差し込むとディスプレイが接続しているものと誤認させることができる。EDIDエミュレータとも呼ぶ？価格は500&amp;amp;#45;1000円程度。4K対応かどうかなどスペックにより値段に多少の差はあるだろう。近年はHDMIが主流と思われるが、VGAのものもある（こちらは自作が可能との情報も）。&lt;br /&gt;
&lt;br /&gt;
金はかかるが、後者の解決策にないメリットとして、一気に複数のOSに対応できる（製品による？）というのがある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;解決策2-&amp;amp;#45;-ソフトウェア的に&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 解決策2 &amp;amp;#45; ソフトウェア的に ==&lt;br /&gt;
&lt;br /&gt;
しかしPCを騙すためだけの虚構的な存在に金を払うのも考えれば面白くない話である。ソフトウェア的に解決できないだろうか。ということでこの記事ではWindowsに対するソフトウェア的解決策を紹介する。なおLinuxについてはxvfb?だとか、そういうのを使えばできそうな気がしたが今のところ手元ではできていない。できたら記事を書くかも。Macは持っていないので試せないが、[https://github.com/tSoniq/displayx https&amp;amp;#58;//github.com/tSoniq/displayx]とか、betterdisplayとかがあるらしい。PowerPointやゲーム実況という用途を考えるとWindowsが一番需要が大きそうではある。&lt;br /&gt;
&lt;br /&gt;
ソフトウェア的解決策が欲しいといってすぐソフトが出てくればいいが、調べてもあまり出てこない。比較的それっぽくて怪しくなさそうだったのが&lt;br /&gt;
&lt;br /&gt;
[https://www.amyuni.com/forum/viewtopic.php?t=3030 https&amp;amp;#58;//www.amyuni.com/forum/viewtopic.php?t&amp;amp;#61;3030]&lt;br /&gt;
&lt;br /&gt;
だが、それでもやはりちょっと素性が知れない。もう少し調べていくと、Indirect Display Driver (IDD)という技術を使うとそういうソフトウェアが書けるというMicrosoftのドキュメントが出てきた。そこからさらに調べてみるとこんなものがあった。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/roshkins/IddSampleDriver https://github.com/roshkins/IddSampleDriver]&lt;br /&gt;
&lt;br /&gt;
これを試したら無事動いたので、ついでに解像度を変えてみたら、普通に8Kくらいまで動いた（ただしその分重くなる）。↑のレポジトリでも解像度増やしてというissueがあったので、forkして公開した。さらにver0.0.1.2では&amp;amp;quot;C&amp;amp;#58;\IddSampleDriver\option.txt”というファイルを設定することで解像度オプションやディスプレイの個数をユーザーが設定できるように変更した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/IddSampleDriver https://github.com/ge9/IddSampleDriver]&lt;br /&gt;
&lt;br /&gt;
本家のreadmeで紹介された結果、どうやらゲーム配信関係のRedditとかに載ったみたいで、実質的にはほぼ何もしていないのに800以上のstarを獲得している。&lt;br /&gt;
&lt;br /&gt;
また、さらにこれをforkしたものとして[https://github.com/VirtualDrivers/Virtual-Display-Driver https://github.com/VirtualDrivers/Virtual-Display-Driver]が作られ、これはすでに5000starを超える大きなプロジェクトになっている。&lt;br /&gt;
&lt;br /&gt;
以下、このソフトの話を主にしていく。&lt;br /&gt;
&lt;br /&gt;
== インストール手順 ==&lt;br /&gt;
&lt;br /&gt;
Scoopを使う方法と使わない方法の2種類がある。いずれもリポジトリのREADME.mdに書いてある通りで、それほど難しくはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;scoopを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Scoopを使う ====&lt;br /&gt;
&lt;br /&gt;
筆者がかかわったものではないが、Scoopを用いてインストールができるようにしてくれた方がいるようである。インストールを行うスクリプトのソースコードは[https://github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver-ge9-np.json https&amp;amp;#58;//github.com/ScoopInstaller/Nonportable/blob/master/bucket/iddsampledriver&amp;amp;#45;ge9&amp;amp;#45;np.json]にある。&lt;br /&gt;
&lt;br /&gt;
==== 通常のインストール ====&lt;br /&gt;
&lt;br /&gt;
途中で、バッチファイルを用いて証明書（.cerという拡張子のファイル）を&amp;lt;em&amp;gt;ローカルコンピューター&amp;lt;/em&amp;gt;の「&amp;lt;em&amp;gt;信頼されたルート証明機関」に&amp;lt;/em&amp;gt;登録する必要がある。そのバッチファイルではcertutilが使用されている（ちなみに以前のリリースではcertmgrが使用されていた）が、証明書を開いて表示される画面からの操作などによっても可能である。&lt;br /&gt;
&lt;br /&gt;
登録を行わないと、デバイスマネージャで「このドライバーはデジタル署名されていません。」と警告が出て、最終的に「デバイスをインストール中にエラーが発生しました。」「ストアへドライバーを追加する際に問題が発生しました。」と言われて失敗する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/installing-test-certificates https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/install/installing&amp;amp;#45;test&amp;amp;#45;certificates]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://garafu.blogspot.com/2014/04/blog-post.html https&amp;amp;#58;//garafu.blogspot.com/2014/04/blog&amp;amp;#45;post.html]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 開発者向け情報 ==&lt;br /&gt;
&lt;br /&gt;
Indirect Display DriverについてはMicrosoft公式のドキュメントや公式サンプル[https://github.com/microsoft/windows-driver-samples/tree/master/video/IndirectDisplay https&amp;amp;#58;//github.com/microsoft/windows&amp;amp;#45;driver&amp;amp;#45;samples/tree/master/video/IndirectDisplay] を参照（IddSampleDriverはこれを編集してできたようである）。前述の通り自分は解像度を増やしただけなので技術的なことについては何もわかっていない。&lt;br /&gt;
&lt;br /&gt;
公式サンプルはなんといっても公式のものであるから、まずはこれをビルドできる状態にするのが確実だろう。以下の説明は2021年8月頃にWindows10で試したときのものである。ビルドしようとするとWindowsUserModeDriver10.0がないと言われるので、[https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk https&amp;amp;#58;//docs.microsoft.com/ja&amp;amp;#45;jp/windows&amp;amp;#45;hardware/drivers/download&amp;amp;#45;the&amp;amp;#45;wdk] を入れる。&lt;br /&gt;
&lt;br /&gt;
すると次は「Spectre軽減策」（セキュリティ関係？）に関するエラーが出た。そこでVisual Studioのインストール時の「個別のコンポーネント」→「コンパイラ、ビルドツール、およびランタイム」のところから「最新」「（ARMではなく）x86とx64」と書いてある「Spectre軽減ライブラリ」を入れる（細かい表示は正確に記録していないかもしれないor変わっているかもしれない）。「SDK、ライブラリ、およびフレームワーク」にあるMFCとかATLみたいなやつは要らなさそうっぽい。&lt;br /&gt;
&lt;br /&gt;
これでビルドが通った。exeを管理者権限で起動するとBluetoothのところのその他のデバイスとかに表示されるところまではいった。tmhがないとかSpectre関連のエラーとかwdfのエラーとか色々出ていたが全部大丈夫になった。&lt;br /&gt;
&lt;br /&gt;
* [https://learn.microsoft.com/ja-jp/windows/win32/api/swdevice/nf-swdevice-swdevicecreate https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/windows/win32/api/swdevice/nf&amp;amp;#45;swdevice&amp;amp;#45;swdevicecreate]に書いてあるように、SwDeviceCreateを呼びだすには管理者権限が必要である。従って、IddSampleDriverのようなソフトウェアをインストールするには管理者権限が事実上必須ということになる。ただし、インストールされたIddSampleDriverというデバイス自体は一般ユーザーでも使用可能である。&lt;br /&gt;
&lt;br /&gt;
では次に本題のIddSampleDriverをビルドする。公式サンプルがビルドできている状況ならこちらも通るものと期待できる。少なくとも手元ではそうなった。逆にIddSampleDriverから始めてみても同様に、WindowsUserModeDriver10.0のエラー→Spectreのエラー、などとなった。&lt;br /&gt;
&lt;br /&gt;
以下、当時の元リポジトリをビルドした際のメモ&lt;br /&gt;
&lt;br /&gt;
* ソースコードに赤線は出ていたがコンパイルは通る。署名に関するエラー（file digestがなんとか）が出るのでプロジェクトのプロパティの下のほうのDriver SigningのFile Digest Algorithmに SHA256 と書く。&lt;br /&gt;
* 解像度やリフレッシュレートの設定が不適切だと、デバイスマネージャで何度か再読み込みされる感じの動作をしたあと自動的に停止され警告アイコンが表示される。&lt;br /&gt;
* 日付を超えるとタイムゾーン（筆者はJST&amp;amp;#61;UTC+9）の関係でInf2Catが失敗する。プロジェクトのプロパティからInf2Catのメニューに行き、General → Use Local Time を「はい (/uselocaltime)」に設定する。参考&amp;amp;#58; [https://monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html https&amp;amp;#58;//monoist.atmarkit.co.jp/mn/articles/1307/26/news003_3.html]&lt;br /&gt;
** さらに、これを設定してもなぜか現地時間の21&amp;amp;#58;00～24&amp;amp;#58;00の間にビルドしたものは正常動作しなかった（ビルドは通るしデバイスマネージャでの警告アイコンも出ないのにサブディスプレイが出ない）ので、ビルド時はその範囲外になるようにPCの時計設定を適宜変更する（報告済み [https://github.com/roshkins/IddSampleDriver/issues/5 https://github.com/roshkins/IddSampleDriver/issues/5]）&lt;br /&gt;
&lt;br /&gt;
自分でビルドしたやつのインストール時は、（おそらく自分のユーザー名を用いて署名が作られているため？）最初の一回のみ改めて.cerを登録する必要がある。二回目以降は、サブフォルダに生成されてるcat, dll, infをもってきて置き換えたあとデバイスマネージャから「ドライバーの更新」をすればよい。デバイスマネージャーは使ったフォルダをちゃんと覚えているようなので、頻繁に移動しなくていい安定した場所でビルドを行うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hdr対応について&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HDR対応について ==&lt;br /&gt;
&lt;br /&gt;
* HDRの基本についてはここがよさそう？ [https://zenn.dev/okuoku/scraps/ca346768627367 https&amp;amp;#58;//zenn.dev/okuoku/scraps/ca346768627367]&lt;br /&gt;
&lt;br /&gt;
GitHubのissueでも複数回挙がっているのが、HDR (High Dynamic Range)への対応であるが、現在のところ解決の目処は立っていない。&lt;br /&gt;
&lt;br /&gt;
* IDDの枠組みではそもそもサポートされてない？&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/MicrosoftDocs/windows-driver-docs-ddi/issues/199 https://github.com/MicrosoftDocs/windows-driver-docs-ddi/issues/199]&lt;br /&gt;
* 報奨金を設定した人がいる&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/5andr0/Virtual-HDR-Display/issues/1 https://github.com/5andr0/Virtual-HDR-Display/issues/1]&lt;br /&gt;
&lt;br /&gt;
=== その他参考情報 ===&lt;br /&gt;
&lt;br /&gt;
このIDDというのはUser&amp;amp;#45;modeで動作するやつなのだがKernel&amp;amp;#45;modeで動作するKMDODとかいうものもあるらしく、そっちの方が多くのことができるのかもしれない。ただし調べた感じ、ただちに使えそうなものは見つからなかった。まあWindowsのディスプレイドライバなんか趣味でそうそう書くもんではないのでしょうがない。&lt;br /&gt;
&lt;br /&gt;
一応適当に調べて出てきた参考リンクなど&lt;br /&gt;
&lt;br /&gt;
* IDDとKMDODに関する議論（2019年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/291368/wddm-display-only-driver-to-create-a-virtual-display-monitor https&amp;amp;#58;//community.osr.com/discussion/291368/wddm&amp;amp;#45;display&amp;amp;#45;only&amp;amp;#45;driver&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;monitor]&lt;br /&gt;
* KMDODで仮想ディスプレイを作れるかどうかについて(2017年)&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://community.osr.com/discussion/286843/how-to-implement-virtual-display-adapter https&amp;amp;#58;//community.osr.com/discussion/286843/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter]&lt;br /&gt;
** そこで言及されているLin JiaBang氏のソフト（動作未確認）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://github.com/LinJiabang/virtual-display https://github.com/LinJiabang/virtual-display]&lt;br /&gt;
* WDDMで仮想ディスプレイを作れるかどうかについて（2016年）&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/2d60c1c2-5198-47e2-b5d9-2ba28461e72e/how-to-implement-virtual-display-adapter-driver-on-windows-10?forum=wdk https&amp;amp;#58;//social.msdn.microsoft.com/Forums/vstudio/ja&amp;amp;#45;JP/2d60c1c2&amp;amp;#45;5198&amp;amp;#45;47e2&amp;amp;#45;b5d9&amp;amp;#45;2ba28461e72e/how&amp;amp;#45;to&amp;amp;#45;implement&amp;amp;#45;virtual&amp;amp;#45;display&amp;amp;#45;adapter&amp;amp;#45;driver&amp;amp;#45;on&amp;amp;#45;windows&amp;amp;#45;10?forum&amp;amp;#61;wdk]&lt;br /&gt;
&lt;br /&gt;
== 課題 ==&lt;br /&gt;
&lt;br /&gt;
あくまで仮想的なディスプレイであるからその中身を目視で確認することはできない（ただし別途その内容をウインドウに表示するソフトなどは作れそう）。従って例えば、これを使って共有している間にZoomのミーティングコントロールが非表示になってミュートのon/offなどができなくなるなどの不便さはある。&lt;br /&gt;
&lt;br /&gt;
ちなみに、Windowsでのマルチモニター管理を切り替えるメニューのショートカットはWin+Pであるが、ここで「セカンドスクリーンのみ」を選ぶなどして仮想でないほうのディスプレイが真っ暗になってしまったときはWin+Pを押せば復帰できる。&lt;br /&gt;
&lt;br /&gt;
== 変更記録 ==&lt;br /&gt;
&lt;br /&gt;
もともとディスプレイは5個追加されるが、重過ぎるのでNUM_VIRTUAL_DISPLAYSを1に変更。&lt;br /&gt;
&lt;br /&gt;
解像度を大きくしたいのでソースコードを「1920」で検索し、3840x2160と2560x1440を追加する。&lt;br /&gt;
&lt;br /&gt;
まず s_KnownMonitorModes のところ。この際リフレッシュレートが60HzになるようにPixel Clock Rateをちゃんと計算する必要がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;{&lt;br /&gt;
      229008 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, 2560 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 229008 * KHZ, (2560 + 40) * (1440 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 2560, 1440 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 2560 + 40, 1440 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
      509366 * KHZ,                                      // pixel clock rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, 3840 + 40 },                         // fractional horizontal refresh rate [Hz]&lt;br /&gt;
    { 509366 * KHZ, (3840 + 40) * (2160 + 28) },          // fractional vertical refresh rate [Hz]&lt;br /&gt;
    { 3840, 2160 },                                    // (horizontal, vertical) active pixel resolution&lt;br /&gt;
    { 3840 + 40, 2160 + 28 },                         // (horizontal, vertical) total pixel resolution&lt;br /&gt;
    { { 255, 0 }},                                   // video standard and vsync divider&lt;br /&gt;
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE&lt;br /&gt;
},&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のようにする。Pixel Clock Rateの数値は多少のズレがあってもいいみたい？だけど気分的に少しだけ大きめに設定してある。&lt;br /&gt;
&lt;br /&gt;
そのすぐ下のEDIDのところはそのままでよさげ。&lt;br /&gt;
&lt;br /&gt;
そして、一番下のほうのTargetModesのところを変える。配列サイズの変更も忘れずに。いやvectorだから関係ないか。&lt;br /&gt;
&lt;br /&gt;
ちなみにs_KnownMonitorModesがノータッチだとここには1920x1280までしか書けないっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;edid編集に関してメモ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== EDID編集に関して（メモ） ==&lt;br /&gt;
&lt;br /&gt;
HDR機能の追加に使えるかと思ったが結局効果はなかった。&lt;br /&gt;
&lt;br /&gt;
Deltacast E&amp;amp;#45;EDID Editorがふつうに有能。ここに書いてあった&amp;amp;#58; [https://ameblo.jp/holycater/entry-12467348533.html https&amp;amp;#58;//ameblo.jp/holycater/entry&amp;amp;#45;12467348533.html]&lt;br /&gt;
&lt;br /&gt;
[https://www.ninshoshiken.com/about-ajsc1-edid-editor/ https&amp;amp;#58;//www.ninshoshiken.com/about&amp;amp;#45;ajsc1&amp;amp;#45;edid&amp;amp;#45;editor/]&lt;br /&gt;
&lt;br /&gt;
[http://blawat2015.no-ip.com/~mieki256/diary/201602063.html http&amp;amp;#58;//blawat2015.no&amp;amp;#45;ip.com/&amp;amp;#126;mieki256/diary/201602063.html]&lt;br /&gt;
&lt;br /&gt;
[http://www.edidreader.com/ http&amp;amp;#58;//www.edidreader.com/]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki:Mobile.css&amp;diff=336</id>
		<title>MediaWiki:Mobile.css</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki:Mobile.css&amp;diff=336"/>
		<updated>2025-05-06T01:01:14Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ここに記述した全てのCSSはモバイル版サイトの利用者に影響します */&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki:Mobile.css&amp;diff=335</id>
		<title>MediaWiki:Mobile.css</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=MediaWiki:Mobile.css&amp;diff=335"/>
		<updated>2025-05-06T00:59:32Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: ページの作成:「/* ここに記述した全てのCSSはモバイル版サイトの利用者に影響します */ #catlinks {     display: yes; }」&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ここに記述した全てのCSSはモバイル版サイトの利用者に影響します */&lt;br /&gt;
#catlinks {&lt;br /&gt;
    display: yes;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=334</id>
		<title>デュアルブート</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%96%E3%83%BC%E3%83%88&amp;diff=334"/>
		<updated>2025-05-05T01:30:35Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
WindowsとLinuxのデュアルブートにおいて役に立つ情報を記述する。古いメモを多く含む。[[Linuxのインストール|Linuxのインストール]]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsのプロダクトキー関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsのプロダクトキー関連 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|デュアルブート}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bitlocker ==&lt;br /&gt;
&lt;br /&gt;
とにかく前もって&amp;lt;strong&amp;gt;回復キーを保存しておくこと！！&amp;lt;/strong&amp;gt;逆に回復キーさえあればBitlockerで大きなトラブルになることは多くない。&lt;br /&gt;
&lt;br /&gt;
* [https://www.pcdock24.com/blog/?p=53931 BitLockerとは【BitLockerの要件と自動有効化の問題点】｜パソコン修理パソコンドック24] によるとローカルアカウントでBitlockerの有効/無効を確認するときはdiskmgmtから行かなきゃいけないらしい。&lt;br /&gt;
* Bitlockerを有効にしたあとにwinを起動すると再起動ループにハマることがある。解決法(Manage&amp;amp;#45;bdeを使う)→[https://community.spiceworks.com/how_to/124388-stop-a-bitlocker-boot-loop Stop a BitLocker boot loop &amp;amp;#45; Windows Forum &amp;amp;#45; Spiceworks]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsパーティションntfsのマウント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windowsパーティション（NTFS）のマウント ==&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
==== remove_hiberfileについて ====&lt;br /&gt;
&lt;br /&gt;
マウントが成功するにはWindowsが完全シャットダウンされている必要がある（またはそれが望ましい）。ただ、[https://unix.stackexchange.com/questions/107978/cant-access-windows-drive-windows-is-hibernated-refused-to-mount https&amp;amp;#58;//unix.stackexchange.com/questions/107978/cant&amp;amp;#45;access&amp;amp;#45;windows&amp;amp;#45;drive&amp;amp;#45;windows&amp;amp;#45;is&amp;amp;#45;hibernated&amp;amp;#45;refused&amp;amp;#45;to&amp;amp;#45;mount]にある通り、windowsを正しくシャットダウンしてもなぜか「ハイバーネートされててマウントできません」的なのが出ることがあるので、マウントオプションにremove_hiberfileを追加するとよい。&lt;br /&gt;
&lt;br /&gt;
* 高速スタートアップを無効にしているにもかかわらず完全シャットダウンされていないことがある気がしたので、Windowsでシャットダウン時に実行するスクリプトとして完全シャットダウンコマンドを追加したりした&lt;br /&gt;
* デスクトップPCではだいたい不要？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker無し&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker無し ===&lt;br /&gt;
&lt;br /&gt;
普通にntfs&amp;amp;#45;3gを使う。数字など適宜読み替えること。主にWindowsのDドライブ想定。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;ntfs-3g -o remove_hiberfile /dev/nvme0n1p5 /media/win&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstabの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;/dev/sda2     /media/ddrive ntfs-3g noauto,rw,nofail 0  0&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bitlocker有り&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Bitlocker有り ===&lt;br /&gt;
&lt;br /&gt;
ntfs&amp;amp;#45;3gの前にDislockerで暗号化を解除する。参考→[http://www7390uo.sakura.ne.jp/wordpress/archives/270 http&amp;amp;#58;//www7390uo.sakura.ne.jp/wordpress/archives/2]&lt;br /&gt;
&lt;br /&gt;
dislocker&amp;amp;#45;fileの方式だと一旦復号したのをファイルに書き出して静的にマウントするので、（事実上）readonlyとなる。よってdislocker&amp;amp;#45;fuseを使う→[https://www.systutorials.com/docs/linux/man/1-dislocker-fuse/ https&amp;amp;#58;//www.systutorials.com/docs/linux/man/1&amp;amp;#45;dislocker&amp;amp;#45;fuse/]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;コマンド例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ sudo dislocker-fuse -V /dev/nvme0n1p3 --recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx -- /media/dl-fuse&lt;br /&gt;
$ sudo mount -o loop,rw /media/dl-fuse/dislocker-file /media/win/&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;fstab例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;/dev/nvme0n1p3     /media/bitlocker     fuse.dislocker recovery-password=xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx  0 0&lt;br /&gt;
/media/bitlocker/dislocker-file   /media/win10   ntfs-3g   rw,nofail,remove_hiberfile,permissions 0  2&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;と、二行に分けて記載する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;permissions については後述&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セキュリティ問題 ====&lt;br /&gt;
&lt;br /&gt;
recovery&amp;amp;#45;passwordを暗号化されていないパーティションに書いてしまうと結局Bitlockerの意味が全くなくなってしまうので、Linux側でもBitlockerのような暗号化パーティション（LUKSとか？）やユーザーログイン時に復号される暗号化フォルダ（ecryptfsとか）といったディスク上で暗号化される領域に書いておく必要がある（もちろん毎回パスワードの類を打ち込むのでよければそれでもいい）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;permissions-inheritについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== permissions, inheritについて ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tuxera/ntfs-3g/wiki/File-Ownership-and-Permissions https&amp;amp;#58;//github.com/tuxera/ntfs&amp;amp;#45;3g/wiki/File&amp;amp;#45;Ownership&amp;amp;#45;and&amp;amp;#45;Permissions] 詳しくはこちらも参照。&lt;br /&gt;
&lt;br /&gt;
まず、マウントオプションとして&amp;lt;strong&amp;gt;permissions&amp;lt;/strong&amp;gt;を指定しない限り、ntfs&amp;amp;#45;3gでマウントしたファイルは全てパーミッション・所有者が固定（uid, gid, umaskなどで指定）となり、個別のファイルについて変更することはできない。&lt;br /&gt;
&lt;br /&gt;
そして、この場合、ntfs&amp;amp;#45;3g経由で作成したファイルはWindows側で見るとすべてAdministratorの所有となり、さらにEveryoneにフルコントロール権限が付与される（この動作を変更するのは筆者の知る限り不可能）。&lt;br /&gt;
&lt;br /&gt;
Linuxではフォルダの実行権限（x）が無ければその中に含まれたファイルにはアクセスが通らず、パスを推測することも不可能だが、Windowsではたとえ一切権限のないフォルダであっても中にあるファイル・フォルダのパスがわかれば直接パスを打つことでアクセスが通ってしまうようである（試した限り）。そのため、permissions無しでntfs&amp;amp;#45;3gで作成したファイルはパスさえわかればWindows上の全ユーザーが閲覧・編集・削除できる状態ということになる。&lt;br /&gt;
&lt;br /&gt;
従って、Gitを使用する場合や複数ユーザーで使用したい場合などパーミッション管理が必要なデータを扱う場合はもちろん、単に中にあるデータを保護したいという場合でもpermissionsオプションを指定することが必須になる。&lt;br /&gt;
&lt;br /&gt;
次に、permissionsを指定して、かつUserMappingを指定しない場合、Linux上でrootが所有するファイルをWindows側で見ると、全てAdministratorsの所有物になり（ここはpermissionsがない場合と同じ）、そのアクセス権はLinux上での見え方と概ね一致するように設定されるようである。他のユーザーが所有するファイルにはS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000というような上位桁が円周率に由来する（この部分はハードコードされている）SIDが割り当てられ、こちらもアクセス権が適切に設定される。UserMappingを指定することで、このSIDの部分の割り当てを変更することができる。&lt;br /&gt;
&lt;br /&gt;
Windowsに挙動を近づけるための他のオプションとしては&amp;lt;strong&amp;gt;inherit&amp;lt;/strong&amp;gt;というのもあり、これは新規作成時に上位フォルダの権限を継承するものである。しかし、これは&amp;lt;u&amp;gt;所有者を継承するオプションではない&amp;lt;/u&amp;gt;（そして、所有者が違えばまともに継承もされない）。&lt;br /&gt;
&lt;br /&gt;
以上のことから、Windowsの一般ユーザーフォルダの内容などをLinuxから良い感じに（Windows側の権限設定を汚染せずに）使えるようにするには、明示的なUserMappingが事実上必須であることがわかる。&lt;br /&gt;
&lt;br /&gt;
一方で、Administrator所有・全ユーザー閲覧可能（あるいは不可能）、といった、Windows側の全ての一般ユーザーに対して共通のアクセス権を適用する設定であれば、UserMappingを使用しなくても簡単に設定が可能である。個人用PCかつ、画像・動画などのメディアファイルやLinuxでしか使用しない大きめのソフトウェアを入れておく用途であれば、こちらで問題ないだろう。&lt;br /&gt;
&lt;br /&gt;
Linux側で別ユーザーの所有に見せたい場合は、上記のS&amp;amp;#45;1&amp;amp;#45;5&amp;amp;#45;21&amp;amp;#45;3141592653&amp;amp;#45;589793238&amp;amp;#45;462643383&amp;amp;#45;10000のようなSIDが見えてしまう状態でもよければ（かつ、権限設定にも問題がなければ）それでもいいし、下記のbindfsと併用する方法もある。いずれにしても、Linux側で全員が読み取り・書き込み・実行が可能なファイルは、Linux側での親フォルダの権限によらず、Windows側では（パスさえわかれば）対応する権限でアクセスができてしまうということに注意が必要である。&lt;br /&gt;
&lt;br /&gt;
また、Windowsではファイルの新規作成時には必ず実行権限が付加されるので、Linux側でそれを見た場合も実行可能になる（実行権限を外すと.exeなどが実行できなくなる）。従って、GitのレポジトリのフォルダをWindows/Linux間で共用するようなことをすると、Windows側では実行権限無しで（これがデフォルトであるため）コミットされたファイルがLinux側では実行権限有りに見えるため差分が出てしまうといったことが発生する。これはUserMappingでも解決はできないので、Gitリポジトリのあるフォルダを共用するのは不可能である。&lt;br /&gt;
&lt;br /&gt;
==== bindfs ====&lt;br /&gt;
&lt;br /&gt;
既存のディレクトリを、所有ユーザーやパーミッションを変更してマウントしてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --mirror=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
または&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;sudo bindfs --force-user=myname --force-group=myname /media/win ~/.mnt_win/&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
この2つの違いは不明&lt;br /&gt;
&lt;br /&gt;
sudoがないと&amp;lt;code&amp;gt;fusermount&amp;amp;#58; option allow_other only allowed if &amp;amp;#39;user_allow_other&amp;amp;#39; is set in /etc/fuse.conf&amp;lt;/code&amp;gt;とか言われたりする&lt;br /&gt;
&lt;br /&gt;
fstabの例&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;/media/win /home/myname/.mnt_win fuse.bindfs nofail,map=root/myname:@root/@myname,create-with-perms=g-w 0 0&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Linuxだとrootのデフォルトのumaskが022で一般ユーザーが002なせいで一般ユーザーが作ったファイルが775とか664になってしまったりするがg&amp;amp;#45;wをつけることによって755とか644になる（もちろんchmodすれば変えられる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;minecraft&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Minecraft ==&lt;br /&gt;
&lt;br /&gt;
.minecraftフォルダをWindowsとLinuxで共有したはいいが、（それ自体.minecraftの中にある）ゲームディレクトリの指定も共有することを考えると、両OSでパスの仕様がやや異なるのが問題になる。&lt;br /&gt;
&lt;br /&gt;
例えば以下ではWindowsのルートが/media/winにマウントされているとする。&lt;br /&gt;
&lt;br /&gt;
まずLinuxのランチャーは相対パスどころかシンボリックリンクすら変換して普通の絶対パスにしてしまう（設定を書き換えてしまう）っぽいので、linuxでは絶対パス指定で/media/win/Users/pathのようにする。で、この書き方をするとWindowsでは相対パスと解釈されるのだが、基準となるフォルダが謎で、「PLAY」を押した時のチェック時は.minecraftが基準なのだが、実際に見られるのはランチャーがあるフォルダが基準（＝こっちになかった場合ゲームディレクトリが新たに作られる）&lt;br /&gt;
&lt;br /&gt;
* ストアアプリ版の（新しい方の？）Minecraftランチャーでは、この「ランチャーがあるフォルダ」は&amp;lt;code&amp;gt;AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local&amp;lt;/code&amp;gt; あたりである。&lt;br /&gt;
&lt;br /&gt;
従って、ランチャーのフォルダと.minecraft内の両方にmediaというフォルダを作って中にwinという名前でC&amp;amp;#58;\へのジャンクション置くとうまくいく。&lt;br /&gt;
&lt;br /&gt;
.minecraftの中にはゲームディレクトリ専用のフォルダを作り、その中にmain, snapshotなど用途に応じたフォルダを作っておくとよい&lt;br /&gt;
&lt;br /&gt;
== google&amp;amp;#45;drive&amp;amp;#45;ocamlfuse ==&lt;br /&gt;
&lt;br /&gt;
labelを使うと複数アカウントをマウントできる。デフォルトのラベル名はdefault&lt;br /&gt;
&lt;br /&gt;
しばらく使っていないと起動時におそらく認証の失敗が原因でマウントポイントのあるフォルダに対するlsがしばらく一切反応しなくなる（&amp;amp;#126;/.gdfuse内の該当ラベル名のフォルダを削除して最初からやり直せば治る）。よってマウントポイントをホームディレクトリ直下に作るのは避けたほうがよい（gdfというフォルダを作っている）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mega&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== MEGA ==&lt;br /&gt;
&lt;br /&gt;
Winが完全にはシャットダウンされていない状態でLinuxを起動するとCドライブ上のMEGAのフォルダが読めずに同期が無効になってしまう。MEGA自身のかわりに、Cが読める状態でのみMEGAを起動するシェルスクリプト（mega&amp;amp;#45;mounted.sh）をスタートアップに登録しておく。Cが読めなかった場合にはdialogコマンドで通知ダイアログを表示する。（このスクリプトではC自身のかわりにC&amp;amp;#58;\Windowsをみている）（gdialogは一部のディストリにしか入っていないかもしれない。実際にコマンド打ってみてどんな表示になるかも含めて確かめておいたほうがよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
if [ -d /media/win-rw/Windows ]; then&lt;br /&gt;
megasync&lt;br /&gt;
else&lt;br /&gt;
gdialog --title &amp;quot;Warning&amp;quot; --infobox &amp;quot;MEGAsync is not started because Windows partition is not mounted&amp;quot; 0 0&lt;br /&gt;
fi&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bluetooth機器&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Bluetooth機器 ==&lt;br /&gt;
&lt;br /&gt;
同じBluetooth機器を同じPCのWindowsとLinux双方にペアリングするというもの。自分はマウスでしかやったことがない。意外と難しいが何とかなる。&lt;br /&gt;
&lt;br /&gt;
==== 参考 ====&lt;br /&gt;
&lt;br /&gt;
* [https://orumin.blogspot.com/2019/02/bluetooth.html https&amp;amp;#58;//orumin.blogspot.com/2019/02/bluetooth.html]&lt;br /&gt;
* [https://qiita.com/yoko-yan/items/9b0235678fd804b4fe0d https&amp;amp;#58;//qiita.com/yoko&amp;amp;#45;yan/items/9b0235678fd804b4fe0d]&lt;br /&gt;
* Bluetooth Low Energyという仕様もあるらしく、自分のマウスはこっちだった。これに関しては[http://aimingoff.way-nifty.com/blog/2018/09/windows-linux-b.html http&amp;amp;#58;//aimingoff.way&amp;amp;#45;nifty.com/blog/2018/09/windows&amp;amp;#45;linux&amp;amp;#45;b.html]を参照。割と情報が少ないので感謝。&lt;br /&gt;
** &amp;lt;code&amp;gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\xxxxxxxxxxxx&amp;lt;/code&amp;gt;を見るためにpstoolsをダウンロードして&amp;lt;code&amp;gt;PsExec64 &amp;amp;#45;s &amp;amp;#45;i regedit&amp;lt;/code&amp;gt;とする必要があることに注意。なお、セキュリティソフトによってPsexecが脅威と見なされ強制削除されてしまうときは代わりにフリーソフトのAdvancedRunを使うとよい。&lt;br /&gt;
** まとめ&lt;br /&gt;
*** CSRKをLocalSignatureKey&lt;br /&gt;
*** LTKをLongTermKey&lt;br /&gt;
*** EDIVをEdiv（16進→10進に変換）&lt;br /&gt;
*** ERandをRandに（&amp;lt;strong&amp;gt;バイト&amp;lt;/strong&amp;gt;(2文字のかたまり)&amp;lt;strong&amp;gt;をすべて逆順にしてから&amp;lt;/strong&amp;gt;10進変換）。ちなみにこれを間違えた結果、マウスを動かすたびにbluetoothアイコンが白↔黒と高速で切り替わる謎のバグっぽい現象が起こったことがあった。&lt;br /&gt;
*** 小文字を大文字に変える必要はない。また、IRKをIdentityResolvingKeyに書くのも不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;マルチデバイス対応マウスlogicool&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== マルチデバイス対応マウス（Logicool） ====&lt;br /&gt;
&lt;br /&gt;
マルチデバイス対応（切り替えボタンがあるやつ）のマウス（LogicoolのM595）を使ったら、&amp;lt;strong&amp;gt;登録情報を一旦削除して再接続するごとにMacアドレスがひとつインクリメント&amp;lt;/strong&amp;gt;されて困った。Linuxで接続→Winで接続→Linuxで上記の書き換え、とやったあと、フォルダ名を変更（1を足せばよいはずだが正確にはWinの情報を見るのがよい）するとうまくいった。[https://twitter.com/e9g/status/1381111849664409600 自分のツイート]にも記録あり&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=333</id>
		<title>Windowsでエクスプローラーからフォルダを各種ターミナルで開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=333"/>
		<updated>2025-05-05T01:30:30Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Explorerの右クリックメニューやアドレスバーからフォルダを各種ターミナルで開くための設定方法の紹介。cmd.exe, powershell（pwsh含む）, Cygwin, Git Bashの4つに対応。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
&lt;br /&gt;
* [[Windowsの右クリックメニューから複数ファイルをまとめて開く|Windowsの右クリックメニューから複数ファイルをまとめて開く]] のように、レジストリでフォルダ・フォルダ背景の右クリックメニューを編集できる。&lt;br /&gt;
** Windows10までの右クリックメニューに戻そう。&lt;br /&gt;
** &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定値に直接コマンドを書く方法と、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値（など）を使ってCOMを通じて実行する方法（このために[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]（使い方はレポジトリの説明を参照）を作った）がある。&lt;br /&gt;
** HKLMにあるマシン全体の設定は、それ自体は管理者権限（あるいはTrustedInstallerなどさらに上の権限）がないと書き換えられないが、&amp;lt;strong&amp;gt;HKCUに値があればそちらが優先される&amp;lt;/strong&amp;gt;ので、自分だけに関する設定変更ならユーザー権限だけで可能である。&lt;br /&gt;
** &amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;の直下に&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という名前でキーを作った場合は、自動的に&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の内容が管理者権限で実行される。ただ、&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という固定のただ一つの名前しか使えないため、例えば管理者としてコマンドプロンプトを開くメニューとPowerShellを開くメニューを共存させることができない。そのためこの記事では&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;キーを使用するのではなくコマンドの中で明示的に管理者としての実行を行っている。&lt;br /&gt;
* Explorerのアドレスバー（address bar, location barなど）にcommandと入力してEnterを押すと、そのフォルダをカレントディレクトリとして&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;というコマンドが実行される。&lt;br /&gt;
** このアドレスバーの仕様はおそらく「ファイル名を指定して実行」とほぼ同じ。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;で（メインとして）指定するファイルはフルパスなら必ず動作し、Pathが通っているまたはApp Pathsに登録されているならファイル名だけでよく、さらにbatやexeの場合は拡張子も省略できる。さらに、ほとんど知られていないが実は&amp;lt;strong&amp;gt;App Pathsの値には実行ファイル以外も書ける&amp;lt;/strong&amp;gt;ようである。&lt;br /&gt;
** つまり、パスの通っているフォルダにあるimage.pngはフルパスを打たなくても「image.png」で開けるし、さらにはApp Pathsの&amp;lt;code&amp;gt;openimage.exe&amp;lt;/code&amp;gt;というキーにimage.pngのフルパスを書けば&amp;lt;code&amp;gt;openimage&amp;lt;/code&amp;gt;と打つだけで（実際にはそのような実行ファイルは全く存在しないにもかかわらず）image.pngが開くようになる。当然、vbsなども拡張子無しで呼び出せることになる。&lt;br /&gt;
&lt;br /&gt;
== ポイント ==&lt;br /&gt;
&lt;br /&gt;
==== パス名のルール ====&lt;br /&gt;
&lt;br /&gt;
* Windowsではパスの長さが260文字以下という制限がある。詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] 参照。&lt;br /&gt;
** 制限を超えるような長いパスは&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;というプレフィックスを付けて（UNCパスの一種として）扱われる。&lt;br /&gt;
*** このようなフォルダをカレントディレクトリとしてコマンドを実行することはできないので、アドレスバーに打ち込む方式は使えない（System32をカレントディレクトリとして実行される）。wt &amp;amp;#45;dなどにも指定できない。&lt;br /&gt;
*** 右クリックメニューでは、commandの既定の値に直接書く方式の場合は、&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を設定しないと呼び出されなくなる。&lt;br /&gt;
*** シンボリックリンク/ジャンクションでパスを短くしてやれば普通に扱えるようになる&lt;br /&gt;
* 普通に入力できる文字でWindowsのファイル名に使えないのは、&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#58;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;の9個（エクスプローラーの画面で入れようとすると表示される）。&lt;br /&gt;
** その他、ヌル文字やタブスペースのような0x20未満の制御文字も使えない（はず）。&lt;br /&gt;
*** これらを含むファイルはGit Bash/Cygwinを使っても作れない。&lt;br /&gt;
*** NTFS自体の制限はおそらく&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;だけで、それ以外に関してはLinux上で作ってからWindowsで見ると見られることもある。中身の閲覧などは不可。&lt;br /&gt;
* また、末尾が空白またはピリオドのファイルも禁止で、Explorerやcmdでは作れない（自動で除去される）。&lt;br /&gt;
** これらはGit Bash/Cygwinなら作れる。前者はエクスプローラーで閲覧など多少の操作ができるが後者はほとんど何もできず、DelegateExecuteの右クリックメニューでもピリオドが外れた名前しか取得できない。&lt;br /&gt;
* 先頭が空白のファイルはExplorerだと作れないがcmdなら作れる。禁止ではないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
* Git BashではWindowsの実行ファイルにスラッシュ付きオプションを渡すときはスラッシュを2つにする必要がある。&amp;lt;code&amp;gt;cmd //c&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;bcdedit //v&amp;lt;/code&amp;gt;など。&lt;br /&gt;
* printf関数の%qオプションを使うと、文字列を&amp;lt;strong&amp;gt;エスケープされた状態にして&amp;lt;/strong&amp;gt;返してくれる。これはshからの呼び出し先の別のshで再びフォルダ名をcdなどの引数として利用したいときに使える。&lt;br /&gt;
** bash（POSIX互換ではない）の組み込みコマンドのprintfと、独立実行ファイル（GNU Coreutilsの一部）である/bin/printfがある。基本的な趣旨としては同一のコマンドだが、組み込みコマンドのほうは入力に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が含まれていない限り結果にも&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が使われることはないようで、このおかげで意図しない動作を回避できることがある。今回扱う例に関しては前者が後者の上位互換であるということになる。後者を使っているものはそれでも動いたものである。&lt;br /&gt;
** そもそも%qは組み込みコマンドのほうにしかないという話もある。環境によって違いそう。&lt;br /&gt;
* &amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くような長いパスをカレントディレクトリにしていても、Git Bash/Cygwinに付属の（というかMSYS/Cygwin向けにコンパイルされた？）exeなら実行できる。&lt;br /&gt;
* Git Bashの(ba)shは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけて起動してもカレントディレクトリが維持されるが、&amp;lt;s&amp;gt;Cygwinの(ba)shは&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;をつけると強制的にホームディレクトリに移動する。&amp;lt;/s&amp;gt;&lt;br /&gt;
** 2024/4頃、Cygwinの挙動が変化し、カレントディレクトリが維持されるようになっていることに気付く。変わっていた方のバージョンは3.5.3、変わっていない方は3.3.6であった。&lt;br /&gt;
** ところで、[https://superuser.com/questions/345964/start-bash-shell-cygwin-with-correct-path-without-changing-directory Start bash shell (cygwin) with correct path without changing directory &amp;amp;#45; Super User]の通り、&amp;lt;code&amp;gt;CHERE_INVOKING&amp;lt;/code&amp;gt;という変数を1に設定しておけばカレントディレクトリは維持される。&lt;br /&gt;
* Git Bashにおいては環境変数を正しく設定するため&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;の時点で環境変数&amp;lt;code&amp;gt;MSYSTEM&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;にしておく必要がある。[[Windowsでのターミナル環境|Windowsでのターミナル環境]] 参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershellpwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell/pwsh ====&lt;br /&gt;
&lt;br /&gt;
* バージョン5まで（Windows PowerShell）はpowershell.exe、6以降（PowerShell Core, PowerShell）はpwsh.exeと実行ファイル名が違う&lt;br /&gt;
** 以後、「powershell(.exe)」と「pwsh(.exe)」で呼び分ける。ただし手元ではpowershellの5.1とpwshの7.2～7.3くらいでしか試していないので、一部バージョンではまた違う可能性もある。&lt;br /&gt;
** pwshは必ずしもWindowsに標準では入っていないので、以下の例でもあまり依存しないように気を付ける。&lt;br /&gt;
** 基本、シングルクォートで囲えばほとんどの特殊文字が無効になり、シングルクォート自体を書くときは2つ並べる。ただし注意点として、驚くべきことにpowershell/pwshでは「&amp;lt;strong&amp;gt;全角のシングルクォート&amp;lt;/strong&amp;gt;（U+2018&amp;amp;#45;U+201B、&amp;lt;code&amp;gt;‘&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‚&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‛&amp;lt;/code&amp;gt;の4つ）」も通常のシングルクォートと同じ効力があるので、同じようにエスケープする必要がある（参照&amp;amp;#58; [https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-02?view=powershell-7.2 https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/powershell/scripting/lang&amp;amp;#45;spec/chapter&amp;amp;#45;02?view&amp;amp;#61;powershell&amp;amp;#45;7.2]）。掲載したスクリプトでは省略しているがやることは同じ。&lt;br /&gt;
* powershell.exe&lt;br /&gt;
** &amp;amp;#45;Commandがなくても付けたのと同じ扱いになる？&lt;br /&gt;
*** 逆に、&amp;amp;#45;Commandを付けなければいけないという点を除いてはpwshがpowershellの上位互換という感覚である（新しいのでそれはそう）。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダの扱いにバグがあり、cmdなどでこれらのフォルダをカレントディレクトリとした状態で5系のPowerShellを起動すると&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;amp;gt;&amp;lt;/code&amp;gt;をカレントディレクトリとして起動される（たとえば&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#93;&amp;amp;#91;&amp;lt;/code&amp;gt;なら前者、&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;なら後者）。&lt;br /&gt;
** &amp;amp;#45;Fileを使用してスクリプトを実行するとき、ダブルクォーテーションで囲われていない &amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt; が引数に含まれているとエラーになるバグがある。&lt;br /&gt;
* powershell.exe・pwsh.exe共通&lt;br /&gt;
** 連続した&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;があるフォルダに関する挙動にバグがある。コンソールプログラムを実行しても新規ウインドウで開かれる、そこをカレントディレクトリとしたときにファイルをmvできないなど。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダに関しても、絶対パス指定したりきちんとエスケープしたりすれば操作自体はできる（場合もある）。&lt;br /&gt;
*** エスケープはいずれも直前に&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;を付ける。&lt;br /&gt;
*** これらを特殊文字として扱いたくないときは&amp;lt;code&amp;gt;&amp;amp;#45;LiteralPath&amp;lt;/code&amp;gt;を付けると良い場合もある。&lt;br /&gt;
** UNCパスをカレントディレクトリにすることができるが、&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;lt;/code&amp;gt;とかいう謎のプレフィックスが付く。&lt;br /&gt;
** 末尾が空白のフォルダについてはcdできず、Cygwinなどでそのようなフォルダをカレントディレクトリとして起動したとしても&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\PowerShell\7&amp;lt;/code&amp;gt;に移動してしまう。&lt;br /&gt;
** 8.3形式のパスを強制的に長い名前に戻してcdしてしまう。その結果、長いフォルダをカレントディレクトリとして外部プログラムを実行できなくなる。&lt;br /&gt;
* PSModulePath環境変数の関係な気がするが、pwshの中でcmdを起動してその中でpowershellを起動したりするとPSReadLineモジュールが読み込めない（&amp;lt;code&amp;gt;PSReadline モジュールを読み込めません。コンソールは PSReadline なしで実行されています。&amp;lt;/code&amp;gt;）とか言われたりする&lt;br /&gt;
&lt;br /&gt;
==== 環境変数への置換 ====&lt;br /&gt;
&lt;br /&gt;
cmdなどを使うと&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で囲われた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が置換される。&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はファイル名にも普通に使える文字なので、注意が必要となる&lt;br /&gt;
&lt;br /&gt;
* 該当の名前の環境変数が定義されていたときのみ置換が行われ、定義されていなければそのままになる。&lt;br /&gt;
* &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;の置換は必ずしも&amp;lt;strong&amp;gt;cmdだけで行われるわけではない&amp;lt;/strong&amp;gt;。「ファイル名を指定して実行」、VBSのWscript.Shellのrun、conhost、wtの引数などでも行われる。しかしCreateProcessやShellExecute(Ex)やレジストリ値では行われない（無理やりREG_EXPAND_SZにしたら展開されるが、後述の&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;との適用順などは不明）。&lt;br /&gt;
* 一般には、環境変数には英数字とアンダースコアしか使えないとの説明もよくあるが、実際にはほとんどの記号が有効である。従って、&amp;lt;code&amp;gt;^%PATH^%&amp;lt;/code&amp;gt;のようなキャレットによるエスケープはcmd向けにはある程度有効だが、&amp;lt;code&amp;gt;PATH^&amp;lt;/code&amp;gt;という環境変数が定義されているとうまく動かない。&lt;br /&gt;
* （そういう変数が定義されていることは現実にほとんどないだろうし、それが保証できるなら以下の部分を読む必要はない）&lt;br /&gt;
&lt;br /&gt;
これを防ぐ方法はいくつかある。ちなみに、&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;でのエスケープというのはバッチファイルの中だけの話で、今回の場面では以下より簡単なエスケープ方法は多分ないと思う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;既に定義されているかもしれない環境変数をバックアップし、一時的にその中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変えて使用することでリテラル文字としての&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を表現し、後で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;すなわち、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;のような変数の中身をバックアップし、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変え、未知の文字列中の&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をすべて&amp;lt;code&amp;gt;%MY_PERCENT%&amp;lt;/code&amp;gt;にすることで&amp;lt;strong&amp;gt;この部分が置換によって&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に変わるのを利用して&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をそのまま渡すということである（環境変数の置換は左から順に行われるため、たとえば&amp;lt;code&amp;gt;%MY_PERCENT%PATH%MY_PERCENT%&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;が置換されることはない）。受け渡しが終わったら&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を復元する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、変数のバックアップとリストアを同じプロセス・スクリプト内で行える（&amp;lt;strong&amp;gt;呼び出した後に元に戻ってくる&amp;lt;/strong&amp;gt;）場面で有用である。呼び出し先プロセスでリストアすることも不可能ではないと思うが、環境変数には任意の文字が入る可能性があることを考えるとエスケープが大変困難になることが予想される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;VAR1, VAR2, VAR3, …のような無限個の変数を最初からチェックし、最初の未定義の変数を上記と同様に使用し、後で未設定にする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ほぼ上記と同じだが、内容のリストアでなく未設定にするだけなので、呼び出し先プロセスでも容易に行える。ただし実装が面倒である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;へと置換して、置換のプロセスを抜けた段階で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これは、&amp;lt;strong&amp;gt;最初の文字以外に&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;が含まれる&amp;lt;/strong&amp;gt;環境変数名は（実際に環境変数が設定されていたとしても絶対に）置換されないことがわかったためである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%&amp;amp;#61;%&amp;lt;/code&amp;gt;（あるいは、&amp;lt;code&amp;gt;%&amp;amp;#61;VAR%&amp;lt;/code&amp;gt;など）は少なくともcmdの対話シェル上だと置換されてしまうので&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;へのエスケープだと不十分に見えるが、実際には&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;一つでも問題なく動く場合もあった。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;しかし、動かないときもあるので、多くの例では&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にエスケープしている。&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;になっているものは、試した限りはそれでも問題なく動いているものである。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables Environment Variables &amp;amp;#45; Win32 apps | Microsoft Learn]では「&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;は環境変数に使えない」と書かれていて、ダイアログからでも設定はできないが、レジストリだと無理やり設定できる。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ユーザー環境変数に設定する分にはとりあえず問題なさそうだが、システム環境変数にレジストリから&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;（と、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を名前に含むいくつかの変数。どれが原因かは正確にはわからない）を無理やり追加したら&amp;lt;strong&amp;gt;0xc000021のブルースクリーンでWindowsが起動しなくなった&amp;lt;/strong&amp;gt;（該当の変数を全て削除したら治った）のでこれはやってはいけない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみに、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はUnix側では特殊文字ではないので、printfとの適用順はあまり気にする必要はない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;この方法のメリットは、一度置換してしまえばその文字列を何度使いまわしても変化がないことが保証されることと、未定義の変数の探索や変数のリストアが必要ないことである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;要は&amp;lt;code&amp;gt;%(&amp;amp;#61;を含まない文字列)%&amp;lt;/code&amp;gt;を含まない文字列だけを値にとる単射を構成すればいいだけなので、base64エンコーディングのようにしても構わない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただ、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に置換するという操作はPowerShellやshにとっては容易でもcmdにとっては不可能に近いので、最終的な呼び出し先がcmdであるときには採用しづらい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、今回の記事ではcmdやvbsのRunを経由してコマンドを実行しているものが多くあるが、&amp;lt;strong&amp;gt;このスクリプトの内容自体もエスケープが必要&amp;lt;/strong&amp;gt;である。つまり、例えば&amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt;の内側に&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;,&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;というPowershellコードが含まれるなら、&amp;lt;code&amp;gt;&amp;amp;#39;,&amp;amp;#39;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;という環境変数が定義されていた時にその部分が置換されてしまう。これを回避するのはそこまで難しくなく、この例であれば&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;),&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;のように&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を含む無意味なコードを挿入すればよい。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をいったん&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にしている部分に関しては、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#61;&amp;amp;#61;&amp;lt;/code&amp;gt;にすることで問題を避けられるだろう。無駄に複雑になるのでスクリプト例ではそのような措置はしていない。&lt;br /&gt;
&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
* UNCパス（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;だけでなく普通のUNCパスも含む）をカレントディレクトリにすることはできない（rdなど一部コマンドでの取り扱いは可能）。&lt;br /&gt;
* 末尾が空白のフォルダにcdすることはできないが、Cygwinなどでそのようなフォルダをカレントディレクトリとした状態でcmdを起動した場合は、そのフォルダをカレントディレクトリとして起動する（外部プログラムの起動はできないがcdなどの内部コマンドは有効で、一度でも出たら戻れない）。&lt;br /&gt;
* 各種のパース規則が本当に謎。特に引用符周りは地獄である。[https://thinca.hatenablog.com/entry/20100210/1265813598 cmd.exe のコマンドラインの仕様を解析してみた &amp;amp;#45; 永遠に未完成]を読むとわかるが、例えば「ファイル名を指定して実行」で以下の挙動を確かめよう。&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;と出る&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c &amp;amp;amp; d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;echo &amp;amp;quot;a b&amp;amp;quot;c&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;d&amp;amp;quot;&amp;lt;/code&amp;gt;がそれぞれ別々に実行される&lt;br /&gt;
** すなわち、&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が一見特殊文字でないかのような振る舞いをする（そのまま出力される）割に、その前後で特殊文字の扱いが切り替わっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
* 以下、wtと略す（実行ファイル名がwt.exeなため）。パスが通っているものと仮定する。&lt;br /&gt;
* wtでは&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;が特殊文字になるようで、&amp;lt;code&amp;gt;\&amp;amp;#59;&amp;lt;/code&amp;gt;とエスケープが必要。[https://github.com/microsoft/terminal/issues/13264 https://github.com/microsoft/terminal/issues/13264] かな？&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;も&amp;lt;code&amp;gt;\&amp;amp;quot;&amp;lt;/code&amp;gt;にする必要がある。一方で、単一の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;は（うしろに&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;などがなければ）そのまま&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;になるようである。大丈夫なのか…？&lt;br /&gt;
* 起動時にカレントディレクトリがユーザーフォルダ（%USERPROFILE%）になる&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#45;d&amp;lt;/code&amp;gt;オプションで明示的に指定することができる&lt;br /&gt;
&lt;br /&gt;
==== 連続空白 ====&lt;br /&gt;
&lt;br /&gt;
空白が連続するファイル名の対応は割と厄介である。Windows側では引数を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;で囲うことで、またsh側では適宜&amp;lt;code&amp;gt;IFS&amp;amp;#61;&amp;lt;/code&amp;gt;と設定することで対処できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Unicode対応 ====&lt;br /&gt;
&lt;br /&gt;
* UTF8を使おう&lt;br /&gt;
* &amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が一応使えるが、一旦シェル内部に入らないと使えないのでやや不便&lt;br /&gt;
** 使わなくても大丈夫なときもある。あまりちゃんと理解できていないが、経験上、powershellで&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;変数を用いて標準入力を受け取る際には&amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が必要そう。&lt;br /&gt;
* /bin/printfやprintfの実行時には&amp;lt;code&amp;gt;LANG&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;en_US.UTF8&amp;lt;/code&amp;gt;とかに設定する。&lt;br /&gt;
** Cygwinなら不要？&lt;br /&gt;
&lt;br /&gt;
==== デバッグ時 ====&lt;br /&gt;
&lt;br /&gt;
* 管理者権限のものを試すときでもまず&amp;lt;code&amp;gt;&amp;amp;#45;Verb Runas&amp;lt;/code&amp;gt;を外して動作確認するとよい。&lt;br /&gt;
* 後述のwaitrunも役に立つだろう。&lt;br /&gt;
* 特殊文字に関しては、最初は空白のないフォルダ、次に空白のあるフォルダや連続空白のあるフォルダ、次にシングルクォートや&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;を含むフォルダなどとだんだん難しくしていくとよい。&lt;br /&gt;
* それとは別に、Unicode対応、&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;（ドライブ直下）対応、259文字のフォルダ対応（後述）などをチェックする&lt;br /&gt;
* 難しい例は、例えば&amp;lt;code&amp;gt;z  𠮷𠮷%PATH%  &amp;amp;#39;  &amp;amp;#39;&amp;amp;#39;  `  `` $PATH &amp;amp;amp; &amp;amp;amp;&amp;amp;amp;   %%PATH%%&amp;amp;#91;&amp;amp;#93; &amp;amp;#93; &amp;amp;#91;  ^  ^^   &amp;amp;#39;  &amp;amp;#59;  &amp;amp;#59;&amp;amp;#59;  𩸽𩸽!PATH!&amp;amp;#35;$%&amp;amp;amp;&amp;amp;#39;()&amp;amp;#61;&amp;amp;#126;&amp;amp;#123;`+&amp;amp;#125;_,.&amp;amp;#93;&amp;amp;#91;&amp;amp;#59;@^&amp;amp;#45; &amp;amp;#45; ‘ ’ ‚ ‛&amp;lt;/code&amp;gt;のような感じ（適当）。こんなファイル名を現実に見ることはないが、エクスプローラー上で普通に入力できる内容である。&lt;br /&gt;
** 「𠮷」はBMP外かつJIS外の漢字としては最も変換で出しやすいのでテストに重宝する。（𩸽はBMP外だがJIS外ではない（第4水準））&lt;br /&gt;
&lt;br /&gt;
==== その他 ====&lt;br /&gt;
&lt;br /&gt;
* デフォルトシェルは、通常ユーザーはwtでも管理者の場合はconhostに設定されているっぽい？&lt;br /&gt;
* &amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のようなドライブ直下のパスは末尾に&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を付けなければいけないことが多い。たとえばwt &amp;amp;#45;dの引数にする場合など。またcmdでcdコマンドや&amp;lt;code&amp;gt;CD&amp;lt;/code&amp;gt;環境変数を見るときもドライブ直下のときだけは&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;が付いて返ってくる。&lt;br /&gt;
** ただ、wt &amp;amp;#45;d に&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;lt;/code&amp;gt;が渡されるように見えるのになぜか動いているものもある。未調査。&lt;br /&gt;
* shやcmdなどの中に一旦入ってしまうと一部の環境変数などが書き換わってしまうかもしれないが、多少は許容することとする。&lt;br /&gt;
* コマンド例は網羅的でない可能性があり、色々な書き方を提示しようとあえて統一していないところもある。現実にはもっと簡単なやり方があるかもしれない。あくまで一例ということで。&lt;br /&gt;
* CygwinとGit Bashはほぼ同じなのでGit Bashを主に載せてCygwinは適宜差分のみ記述する。&lt;br /&gt;
* shは、特にベースのシェルとして使うにはエスケープの方式などでWindowsと相性が悪く使いづらい感じがする。逆にcmdは内部コマンドは地獄だがベースのシェルとしては意外と副作用が少なく、そう悪くはない。&lt;br /&gt;
* 以下の例ではCygwinやGit Bashの実行ファイルにはPATHを通していないことを想定している。&amp;lt;code&amp;gt;C&amp;amp;#58;\cygwin64&amp;lt;/code&amp;gt;あたりは適当に読み替えていただきたい。&lt;br /&gt;
* 2021年途中ごろまで、wtなどのストアアプリ系？の実行ファイル（Explorer上で0バイトになってるエイリアス）をGit Bashから実行できない（Permission deniedとなる）バグがあった。 [https://github.com/git-for-windows/git/issues/2675 https://github.com/git-for-windows/git/issues/2675]&lt;br /&gt;
* ネットワークドライブは各ユーザー対象に割り当てられているせいなのか、&amp;lt;strong&amp;gt;管理者として実行すると利用できない&amp;lt;/strong&amp;gt;らしい。割り当てられる前のネットワークパス自体は有効。&lt;br /&gt;
* wtを管理者権限で呼び出すときに（確率的に）ウインドウが最前面にならないことがある。chcpの有無で変わったりするなど詳細不明。conhostだとならない気がする。startrunなどを介して実行すると必ず最前面に出るようになるっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;準備&amp;amp;#58;-win&amp;amp;#45;console&amp;amp;#45;delegator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 準備&amp;amp;#58; win&amp;amp;#45;console&amp;amp;#45;delegator ==&lt;br /&gt;
&lt;br /&gt;
cmdやPowerShellやCygwinのbashなどのシェルを使えば、スクリプトを起動して複雑なコマンドを呼び出せたり、パイプ実行が可能になったりと色々便利だが、それだけのためには大仰すぎて、特殊文字の扱いなどがかえって仇になることもある。&lt;br /&gt;
&lt;br /&gt;
そこで、シェル関連の操作に汎用的に使えるコマンドをいくつか作成して公開した。[https://github.com/ge9/win-console-tools https://github.com/ge9/win-console-tools]&lt;br /&gt;
&lt;br /&gt;
* 以前はC++で書いていた（[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]）が、C&amp;amp;#35;のほうが文字列の扱いなどが簡明。&lt;br /&gt;
&lt;br /&gt;
ただし、これはあくまで筆者が独自に作ったものであり、Windows標準のもので何とかしようとするのが面白いところでもあるので、それほど積極的には使わない。今後出てくる例はすべて、これらを一切使わなくても（余計な環境変数が設定されてしまうかもしれないという点をのぞけば）同等の機能が実現できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられた引数を特定の文字列とつなげて実行してくれるプログラム。この実行ファイル自体の名前を適宜変更して使用し、「特定の文字列」は別のファイルから読ませる。使用例は[[Windowsでのターミナル環境|Windowsでのターミナル環境]] を参照。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;amp;#45;gui&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;runotherとほぼ同じだが、コンソールアプリケーションではなくWindowsアプリケーション（黒いウインドウが出ない、cmd上で実行したときに終了待ちが行われないなど）。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;evalrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行し、その出力をそのままコマンドラインとして実行するコンソールアプリケーション。（テキストファイルからのコマンドラインの読み込みなどに使える）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;startrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインをWindowsのデフォルトシェルで起動するだけのWindowsアプリケーション。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;waitrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行したあとキー入力を待ってから終了するコンソールアプリケーション。一瞬でウインドウが消えてしまうときのデバッグに使いやすい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;hiderun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;コンソールウインドウ非表示の状態で与えられたコマンドを実行するWindowsアプリケーション。（GUIアプリケーションなどを与えた場合は非表示にならないかも）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;vbsのvbHideでも非表示にできるが、コンソールウインドウの表示位置をみると非表示のウインドウが一つ挟まっていることが分かるのに対して、こちらの場合はそうならない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを最初の&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;とそれ以降の2つに区切ってそれぞれコマンドとしてパイプでつなげて実行するコンソールアプリケーション。ただし最初のコマンドのほうに&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;自体を入力したいときは&amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;でエスケープする。また2つ目のコマンドの先頭の空白は除去される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperunex&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;piperunと似ているが、2つだけでなく3つ以上の任意個のパイプ実行を一度に行う。一見便利だが、コマンドの後ろ側に未知の文字列が渡される場合、&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;をエスケープする必要が生じる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun piperunex command1 || command2 || ... || commandN | unknown_commandline&amp;lt;/code&amp;gt;のように外側を&amp;lt;code&amp;gt;piperun&amp;lt;/code&amp;gt;で囲うと安全。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;adminrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを管理者として実行するWindowsアプリケーション。&amp;lt;code&amp;gt;ShellExecuteEx&amp;lt;/code&amp;gt;では実行ファイルパスと引数は別々に指定しなければいけないので最低限の引数の解析を行っている。PowerShell経由で管理者権限で実行するときのような面倒なエスケープが全て不要になるため非常に使いやすいが、この記事ではこれに依存しないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみにこういうのもある。[https://github.com/mattn/sudo mattn/sudo&amp;amp;#58; sudo for windows] これは、通常のUACのように別ウインドウで実行するのではなく、localhostのランダムなポートを使い、自分自身にポート番号を渡しつつ管理者権限で呼び出すことで標準入出力を転送し、元の端末でそれを読み書きできるという点で、linuxのsudoに近い。しかし標準入出力を介しているので、&amp;lt;code&amp;gt;cmd /c for /?&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cmd /c pause&amp;lt;/code&amp;gt;の挙動が変わってしまうという問題がある。また、呼び出し元でchcp 65001をしていると文字化けする。また、コマンドライン引数を一旦配列に分割してから組み直しているので情報が一部落ちている。あと、セキュリティ的にも懸念があるかもしれないが、これはそもそもLinuxのsudo自体がまずどうなの？という気持ちになった。（未解決）（参照&amp;amp;#58; [https://twitter.com/e9g/status/1687385469921931264?s=20 https&amp;amp;#58;//twitter.com/e9g/status/1687385469921931264?s&amp;amp;#61;20]）&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;uacrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startrunと同じだが、コンパイル時のマニフェスト設定でこのプログラム自体の実行に管理者権限を要求するようにしたので、adminrunと同じように使える（管理者権限で実行する対象が渡されたコマンドではなくuacrun自体になるという違いはある）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pecho&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドライン引数をそのままコンソールに出力する。→WindowsでUnicode文字（特にU+10000以上）を正しく表示（&amp;amp;amp;ファイルに書き込み）するには、「出力先がコンソールならWriteConsoleW、そうでなければWriteFileを使用する」といった非常に面倒な実装が必要であり（参照&amp;amp;#58; [https://twitter.com/mattn_jp/status/542581083242364928 https&amp;amp;#58;//twitter.com/mattn_jp/status/542581083242364928] など）、C++やC&amp;amp;#35;では扱いづらい。そこでrustを用いて実装した。→[https://github.com/ge9/pure-echo-win pure&amp;amp;#45;echo&amp;amp;#45;win]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;printcd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;カレントディレクトリをコンソールに出力する。（ちなみにpwdの由来はprint working directoryなのでそれに倣った）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;注意&amp;amp;#58;-当初は後述のnoworkingdirectoryを知らなかったので1の方法に頼っていたが実際には2の方法のほうが簡明なのでそちらを使うことを勧める1は残しておくが読む必要はあまりない&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 注意&amp;amp;#58; 当初は後述のNoWorkingDirectoryを知らなかったので1.の方法に頼っていたが、実際には2.の方法のほうが簡明なので、そちらを使うことを勧める。1.は残しておくが、読む必要はあまりない。 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1標準入力から受け取る場合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.標準入力から受け取る場合 ==&lt;br /&gt;
&lt;br /&gt;
まず「標準入力からディレクトリのフルパスを受け取り、そのディレクトリで各種ターミナルを起動するコマンド」を紹介する。&lt;br /&gt;
&lt;br /&gt;
そのようなコマンドを仮に&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;とすると、ExecuteCommand&amp;amp;#45;Pipeを使用して、レジストリ（該当CLSIDのLocalServer32の既定の値）に以下のように書くことで、CLSIDが右クリックメニューのDelegateExecute値に使えるようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\ExecuteCommand4000.exe h openterm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;はコンソールウインドウを非表示にするExecuteCommand&amp;amp;#45;Pipeのオプションである。&lt;br /&gt;
&lt;br /&gt;
また、この&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分は非常に長くなることがあり、その場合レジストリに書いて直接編集するのは手間がかかる（操作もしづらいし、更新を即座に反映させるために「&amp;lt;code&amp;gt;LocalServer32&amp;lt;/code&amp;gt;」キーの名前などを変えて戻す必要もあって面倒）。そこで、runotherを使ってtxtに&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の内容をそのまま書くことで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分にそのexeの名前だけを書けばよくなる。&lt;br /&gt;
&lt;br /&gt;
また、いくつかはCygwin/Git Bash向けに冒頭でcygpathによる変換を入れているが、これを取り除けば、Cygwin/Git Bash用のパスを受け取って動作するコマンドということになる。&lt;br /&gt;
&lt;br /&gt;
では以下で、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分についてそれぞれ紹介する。&lt;br /&gt;
&lt;br /&gt;
* 直接コマンド記入でも&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を指定すれば&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;に対応できるというのをこのセクションの大部分を書き終えてから知ったので、&amp;lt;strong&amp;gt;このセクションは内容の多さの割には実際の必要性はそこまで大きくないかもしれない&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git&amp;amp;#45;bashexeで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;で開く ====&lt;br /&gt;
&lt;br /&gt;
この場合shの感覚で&amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;に引数を渡せば勝手にminttyのウインドウで開いてくれるので最も楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.utf8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Git BashのcygpathでGit Bash用のパスに変換&lt;br /&gt;
* printfでエスケープ、utf8を設定&lt;br /&gt;
* git&amp;amp;#45;bash.exeに渡す&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-①startrunを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ①startrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\Git\bin&amp;lt;/code&amp;gt;のbashではなく/usr/binのbash.exeを使う。以後同じ。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-②cmdのstartを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ②cmdのstartを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/\\^/^^/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;amp;/^&amp;amp;amp;/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125; ^| sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* この場合、cmdによる環境変数への置換を避ける必要があるほか、キャレットによるエスケープにも対応する必要がある。&lt;br /&gt;
* Git Bashからcmdを実行しているので&amp;lt;code&amp;gt;//c&amp;lt;/code&amp;gt;のところのスラッシュは2つ。&lt;br /&gt;
&lt;br /&gt;
==== conhostで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; conhost &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conhostによる環境変数の置換を抑制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminalで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminalで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8 printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g) \\&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記に加えてセミコロンへの対応が必要なのと、こっちは/bin/printfじゃなくて組み込みのprintfでこうしないとだめだった。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Cygwin ====&lt;br /&gt;
&lt;br /&gt;
付属のminttyを使うものだけはGit Bashと割と差があるので載せる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\mintty.exe&amp;amp;quot; &amp;amp;#45;e &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-startrun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, startrun ====&lt;br /&gt;
&lt;br /&gt;
* パスのエスケープがおかしい気がするが、なぜか動いている&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun powershell  &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;quot;&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;&amp;amp;#39;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-cmdのstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, cmdのstart ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;\&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;\&amp;amp;#39;.Replace(\&amp;amp;#39;&amp;amp;#61;^%\&amp;amp;#39;,\&amp;amp;#39;%\&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] でも書いた通り、Windows側は&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのフォルダだけは（その必要があるにもかかわらず）8.3形式を使った短いパスにして渡してくれない。そこで、パス長さが258を超えていればcmdに渡して8.3形式の名前に変換する処理をPowerShell側で行う。この際はエスケープされていない正確なパス名をcmdに渡さなければならないので&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の値を一時的に&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に設定する方法をとっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;念のため再確認しておくが、この&amp;lt;code&amp;gt;&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;&amp;lt;/code&amp;gt;の部分は&amp;lt;code&amp;gt;&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;などと変えておかないと、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;が定義されていた場合に正しく動作しない。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cmdでは&amp;lt;strong&amp;gt;ちょうど258文字&amp;lt;/strong&amp;gt;のフォルダでもdirが失敗するなど挙動が不自然であるため、もう少し保守的に&amp;lt;strong&amp;gt;257&amp;lt;/strong&amp;gt;を超えていれば短くするという仕様でもいいかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（追記）8.3形式のパスを取得するのは普通にPowerShell内でもできるらしい…。以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; (New&amp;amp;#45;Object &amp;amp;#45;ComObject Scripting.FileSystemObject).GetFolder($mypath).ShortPath&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
259文字のフォルダを無視するなら以下のように簡潔に済む。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command wt &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39; $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
これは案外難しい。なぜなら、cmd内でcdさせるのは%のエスケープの関係で難しく（cmd内で&amp;amp;#61;を含む文字列を置換することがどうやってもできなさそう（外部プログラムを呼び出すのも難しそうだった）なので、未定義の変数を探索するやり方しかない）、Start&amp;amp;#45;Processの&amp;amp;#45;WorkingDirectoryやCygwinのshは8.3形式に対応していないからである。要は「与えられたディレクトリ（8.3形式のパスが含まれるかもしれない）をカレントディレクトリとして与えられたコマンドを実行する」だけやってくれるプログラムがあればよく、これ自体はそう難しくないことのはずだが、現状、Windows標準環境でこれができるのは自前でプログラムをコンパイルする以外だと（pwshを入れていいならpwshと）&amp;lt;strong&amp;gt;vbsしかない&amp;lt;/strong&amp;gt;ようである。結局、この部分をついでにやってくれるWindows Terminalのほうが楽ということになる。&lt;br /&gt;
&lt;br /&gt;
たとえば以下のようなvbsを用意する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Set objShell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)&lt;br /&gt;
objShell.CurrentDirectory = WScript.Arguments(1)&lt;br /&gt;
objShell.Run(WScript.Arguments(0)),,False&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;startatdir.vbs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のように書ける。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なお&amp;lt;code&amp;gt;startatdir.vbs&amp;lt;/code&amp;gt;のパス指定はフルパスが必要そう（ただしここはcmd /cの中なので&amp;lt;code&amp;gt;%USERPROFILE%&amp;lt;/code&amp;gt;とかを使って書いてもよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11標準入力から受け取る場合-&amp;amp;#45;-管理者権限あり&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.1.標準入力から受け取る場合 &amp;amp;#45; 管理者権限あり ==&lt;br /&gt;
&lt;br /&gt;
上記の続きで、こちらは管理者権限ありのもの。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39; &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39;, &amp;amp;#39;&amp;amp;quot;`&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe`&amp;amp;quot;&amp;amp;quot;&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;i&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start&amp;amp;#45;Process自体がstartみたいなものなので、引数にコンソールアプリケーションを指定したらデフォルトシェルで開かれる。&lt;br /&gt;
* 最後のところ、「&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;」のかわりに「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 とか「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 でも動くのは謎。シングルクォーテーションのエスケープ規則がわからない。参考→[https://twitter.com/e9g/status/1678283164689760256 https&amp;amp;#58;//twitter.com/e9g/status/1678283164689760256]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF&amp;amp;#45;8 printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39; , &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39; &amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== adminrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; /bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; adminrun wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; &amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#123;&amp;amp;#125;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cygwin系なしで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;set&amp;amp;#45;location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;literalpath&amp;amp;#39;,  (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;) &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
再び、startatdir.vbsを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;gt; nul &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59; $bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。259文字のフォルダを無視するなら以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2直接コマンド記入の右クリックメニュー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2.直接コマンド記入の右クリックメニュー ==&lt;br /&gt;
&lt;br /&gt;
レジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定の値に直接コマンドを記入する方式である。&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、右クリックメニューを&amp;lt;strong&amp;gt;押した時点&amp;lt;/strong&amp;gt;でのフォルダ（フォルダを右クリックするメニューからだと&amp;lt;strong&amp;gt;対象フォルダの親&amp;lt;/strong&amp;gt;、フォルダ背景を右クリックするメニューなら対象フォルダ）をカレントディレクトリとしてコマンドが起動される。そのため&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けなければならないような長大なパスのフォルダでは動作しない。しかし、&amp;lt;code&amp;gt;shell\xxxx&amp;lt;/code&amp;gt;キーに&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;値&amp;lt;/strong&amp;gt;を設定することで、カレントディレクトリが必ず&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32&amp;lt;/code&amp;gt;に設定されるようになるので動くようになる。&lt;br /&gt;
&lt;br /&gt;
対象のディレクトリはどう取得するかというと、レジストリに書き込んだ値のうち&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という部分が対象ディレクトリに書き換えられて&amp;lt;/strong&amp;gt;コマンドが実行される。この&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;もC&amp;amp;#58;などの場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;になる。コマンドの中で&amp;lt;strong&amp;gt;そのまま%という文字を使いたい場合はバッチファイルと同様に%%とエスケープする必要がある&amp;lt;/strong&amp;gt;ようである（これはどこにも書いてない？）。&lt;br /&gt;
&lt;br /&gt;
しかし、こうして渡される（特殊文字を含むかもしれない）ディレクトリ名を完璧に取得するのは意外と難しい。cmdに解釈させると&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換されてしまうし、シングルクォートとバッククォートが両方含まれているのでpowershellやshに渡すのも簡単ではない。&lt;br /&gt;
&lt;br /&gt;
コツは、powershell &amp;amp;#45;commandやsh &amp;amp;#45;cの中に直接書くのではなく、&amp;lt;strong&amp;gt;スクリプトへのコマンドライン引数として渡した上で、スクリプト内で引数として取得する&amp;lt;/strong&amp;gt;ことである。それぞれ、基本形（そのまま出力するだけ）は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;powershell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;というトークンを入れることでその後のパラメータの解析を行わないようにできる。args&amp;amp;#91;0&amp;amp;#93;は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;になるのでargs&amp;amp;#91;1&amp;amp;#93;を使う。レジストリに書く際は&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をエスケープして&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%%&amp;lt;/code&amp;gt;。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;でも同様のことができる？&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;0&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;（args&amp;amp;#91;&amp;lt;strong&amp;gt;0&amp;lt;/strong&amp;gt;&amp;amp;#93;になっていることに注意）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;というか、&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;で書き進めてしまったが、本当は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;のほうが安定するかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;あるいは&amp;lt;code&amp;gt;$MyInvocation.Line&amp;lt;/code&amp;gt;を使う方法もある。この場合、powershellへの引数が全て（この例なら&amp;lt;code&amp;gt;&amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; ...&amp;lt;/code&amp;gt;のところから）取得されるので、目当ての部分を取り出すためにここでは最後から2番目の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;と最後の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;の間を取得するという風にしている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39; &amp;amp;#59; Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;昔のPowerShell（2くらい）で試してみたらこちらでないと&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;あたりの処理がうまくいかない場合があった。argsを使うものからの書き換えは容易である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;sh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;sh &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;最後が&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;lt;/code&amp;gt;と閉じられていないのはミスではなく、&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;としてしまうと&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のときに&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;が渡されてしまうのでそれを避けるためである（これはかなりトリッキーなのでもう少し真面目にやってもいいとは思う）。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UNCパスの最初の&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;が&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;に変わってしまう（手元では、Cygwinの場合は&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみで発生している？）という問題があり、適宜置換する必要がある。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの書き方はいわゆる「ワンライナー」的なものであるが、もちろん外部にスクリプトファイルを用意してもよい。&lt;br /&gt;
&lt;br /&gt;
また、外部にスクリプトを用意してよいという条件であれば、&amp;lt;strong&amp;gt;vbsも使用可能&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この場合、まずレジストリには&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wscript &amp;amp;quot;C&amp;amp;#58;\path\to\script.vbs&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などと書く。スクリプトの内容は上記のレジストリの内容をほぼそのままWscript.ShellでRunすればよいが、&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;のかわりにWscript.Arguments(0)を挿入するのと、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;にエスケープしなくてよいのと、VBSなので文字列内の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;は&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えなければならない。これに加え、Runの引数に含まれる&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換の対象となるため、対象フォルダの文字列については&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;への置換でエスケープして、呼び出し先のpowershellなどで元に戻す。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;必要に応じてRunのオプションでvbHideを指定する。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;というか別に258文字を超えていたら云々みたいな処理も全部vbs側でやってしまってもよい（面倒なのでそういう例は載せていない）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
バッチファイルに渡すのは、バッチファイルをcmdが呼び出す時点で&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のようなファイル名の環境変数は既に展開されてしまうので、どうやっても不可能。&lt;br /&gt;
&lt;br /&gt;
他には、（hiderunと）piperunとpechoを併用するという方法もあり、それらの実行ファイルを用意する必要があるという以外は綺麗にできる方法である。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、一旦取得できてしまえばあとは前述の&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込むだけでよい。ただ、実際にはわざわざ&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込まなくても（パイプを使わなくても）もっと簡単に起動できることもあるのでそちらを中心に紹介する。&lt;br /&gt;
&lt;br /&gt;
* commandの最初で指定する（メインの）実行ファイル（先ほどなら&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;）をファイル名単体で書く場合は、それが（メニューをHKCUで設定するならHKCUの（最近のWindowsならHKLMのでも可？）、HKLMで設定するならHKLMの）&amp;lt;strong&amp;gt;App Pathsキー&amp;lt;/strong&amp;gt;に登録されていなければならない（&amp;lt;strong&amp;gt;PATHは通っていなくてもいい&amp;lt;/strong&amp;gt;）。登録されていない場合はフルパスで指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
=== 設定例 ===&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限なし ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考までに、Windowsにもともと入っているメニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell.exe &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これだとシングルクォートと連続スペースに対応できない。連続スペースだけなら&amp;lt;code&amp;gt;&amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;%V&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えると解決できる。&amp;lt;code&amp;gt;%$&amp;amp;#91;&amp;amp;#93;`&amp;lt;/code&amp;gt;あたりは見た感じ問題なし。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;以下の解決策でもまだ不完全 [https://superuser.com/questions/1310258/open-powershell-window-here-file-explorer-context-menu-command-breaks-with-fol &amp;amp;quot;Open PowerShell window here&amp;amp;quot; File Explorer context&amp;amp;#45;menu command breaks with folder names with apostrophes (single quotes) &amp;amp;#45; Super User]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この問題は[https://github.com/PowerShell/PowerShell/issues/6598 https://github.com/PowerShell/PowerShell/issues/6598]や[https://github.com/PowerShell/PowerShell/pull/6660 https://github.com/PowerShell/PowerShell/pull/6660] で扱われており、結局pwshでは&amp;amp;#45;WorkingDirectoryというパラメータが追加された。[https://github.com/PowerShell/PowerShell/issues/14091 https://github.com/PowerShell/PowerShell/issues/14091]にある以下の文字列をレジストリに書いたところ、正しく動作したので、pwshではこれでよい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh.exe &amp;amp;#45;NoExit &amp;amp;#45;RemoveWorkingDirectoryTrailingCharacter &amp;amp;#45;WorkingDirectory &amp;amp;quot;%V!&amp;amp;quot; &amp;amp;#45;Command &amp;amp;quot;$host.UI.RawUI.WindowTitle &amp;amp;#61; &amp;amp;#39;PowerShell 7 (x64)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;wt powershell &amp;amp;#45;noexit &amp;amp;#45;Command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;wtで。標準入力のときとほぼ同じ。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windowsにもともと入っているメニューでは以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cmd.exe /s /k pushd &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くパスを除いて）ほとんどの場合に正しく機能するが、&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のような文字列が含まれているフォルダではうまくいかない。ちなみにpushdによりUNCパスには自動的にネットワークドライブが割り当てられる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;mintty（git&amp;amp;#45;bash.exe使用）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bashのインストーラにより設定される「Git Bash Here」メニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;quot;&amp;amp;#45;&amp;amp;#45;cd&amp;amp;#61;%v.&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、特殊文字にはすべて対応しているが、（NoWorkingDirectoryをつけたとしても）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;で始まるパスではうまくいかない。最後の「.」はよくわからないがこれを付けておくと&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;cd&amp;lt;/code&amp;gt;がうまくやってくれるっぽい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;export MSYSTEM&amp;amp;#61;MINGW64&amp;amp;#59;exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe\&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;置換の対象を&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみとするためsedの引数に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が増えている&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;環境変数の置換を抑止する必要がある。デフォルトシェルで起動するならこれは不要（で、wtでないので&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;のエスケープも不要）で、以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MyInvocationを使う例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;vbsの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;次の節で解説する「（自分が起動された）カレントディレクトリでの起動」にも対応している（引数がない場合）。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Dim curDir&lt;br /&gt;
&lt;br /&gt;
Set ws = CreateObject(&amp;quot;Wscript.Shell&amp;quot;)&lt;br /&gt;
Dim dir&lt;br /&gt;
If WScript.Arguments.Count = 0 Then&lt;br /&gt;
   dir = ws.CurrentDirectory&lt;br /&gt;
Else&lt;br /&gt;
   dir = Wscript.Arguments(0)&lt;br /&gt;
End If&lt;br /&gt;
dir = Replace(dir,&amp;quot;%&amp;quot;,&amp;quot;==%&amp;quot;)&lt;br /&gt;
ws.run &amp;quot;powershell -Command &amp;quot;&amp;quot;&amp;amp; {Start-Process -Verb Runas -Filepath wt -Argumentlist powershell, -noexit, -command, Set-Location, -LiteralPath, (&#039;\&amp;quot;&amp;quot;&#039;&#039;&#039;+($args[1].Trim(&#039;\&amp;quot;&amp;quot;&#039;) -replace &#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;&#039; -replace &#039;;&#039;, &#039;\;&#039; )+&#039;&#039;&#039;.Replace(&#039;&#039;==%&#039;&#039;,&#039;&#039;%&#039;&#039;)\&amp;quot;&amp;quot;&#039;)}&amp;quot;&amp;quot; --% &amp;quot;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;amp;dir&amp;amp;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;, vbHide&lt;br /&gt;
&lt;br /&gt;
Set objShell = Nothing&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この場合も&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。デフォルトシェルなら、startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;理論上はワンライナーでも書けるが、エスケープが面倒すぎるのでファイルに書いたほうがよいだろう。まずレジストリの中身は以下のようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\path\to\gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;で、&amp;lt;code&amp;gt;gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;lt;/code&amp;gt;の中身は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
IFS=&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
echo $*|/bin/sed &#039;s/\\/\\\\/&#039;|/bin/cygpath -f -|printf %q $(/bin/cat) |/bin/sed &amp;quot;s/&#039;/&#039;&#039;/g;s/%/==%/g;s/;/\\\\;/g&amp;quot;|/bin/xargs -d &#039;\n&#039; -I {} powershell -Command Start-Process -Filepath wt -ArgumentList &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\env.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &#039;&amp;quot;MSYSTEM=MINGW64&amp;quot;&#039; , &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\sh.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &amp;quot;&#039;--login&#039;&amp;quot;, &amp;quot;&#039;-c&#039;&amp;quot;, &amp;quot;&#039;&amp;quot;&#039;&amp;quot;IFS=\;cd $(echo {}| /bin/sed s/==%/%/g) \; exec bash&amp;quot;&#039;&amp;quot;&#039;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cygwinも同様である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-codeのメニューおまけ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== VS Codeのメニュー（おまけ） ====&lt;br /&gt;
&lt;br /&gt;
「Code で開く」メニューのcommand値は以下のように設定されている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Microsoft VS Code\Code.exe&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは特殊文字などに関しても問題なく動作するうえ、実はそのまま&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付いたパスにも適用可能である。従って、&amp;lt;code&amp;gt;VSCode&amp;lt;/code&amp;gt;キーに&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;値を設定する（設定の書き換えまたはHKCUによるオーバーライド）だけで、長大フォルダでもVS Codeが使えるようになる。ターミナルの起動には失敗してしまうがファイル・フォルダの作成・編集などの基本操作がGUIでできるので意外と便利（もちろん、他のBetter Explorer的なツールを使う手もあるだろう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-エクスプローラーのアドレスバーから&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. エクスプローラーのアドレスバーから ==&lt;br /&gt;
&lt;br /&gt;
このときは、末尾が空白のパスや&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が必要な長大パスやちょうど259文字のフォルダはそもそも対応していないので考えなくてよい。しかし通常のネットワークファイル向けのUNCパス（&amp;lt;code&amp;gt;\\192.168.1.1\disk&amp;lt;/code&amp;gt;など）に対応する必要はあるので、cmdをベースにすることはできない（cmdの中に入った時点でカレントディレクトリが変わってしまう）。また&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;が含まれるパスをカレントディレクトリにできないことから、powershell.exeもベースとしては使えない。&lt;br /&gt;
&lt;br /&gt;
なので、パイプを使って先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;にむけて流し込もうと思ったら選択肢はpwsh.exeかpiperunかCygwin系だけである。それぞれの書き方は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pwsh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;上とほぼ変わっていないが、pwshはディレクトリの取得だけで使っているので&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;のところで環境変数が汚染されるのを防げる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin/Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cmd //c \&amp;amp;quot;chcp 65001 &amp;amp;gt; nul\&amp;amp;quot;| pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | openterm&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;一つ問題があり、hiderunを使う（コンソールを非表示にする）とchcpが効かないようで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;でPowerShellの&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使っているとUnicode文字が化けてしまう。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分で先頭にcygpathが入っているものを使うときは、そちらのcygpathとこちらでのcygpath &amp;amp;#45;wは打ち消し合って無駄なので消してよい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このほかにvbs(wscript)もカレントディレクトリの取得のところは問題なくやってくれるので、それをさっきのWscript.Arguments(0)のかわりに使えばよい。&lt;br /&gt;
&lt;br /&gt;
最初に表示されるコンソールを非表示にしたければ、&amp;lt;code&amp;gt;hiderun&amp;lt;/code&amp;gt;を付けてrunother経由で実行するのが手軽だが、前述の通りvbsも拡張子無しで呼び出せるように設定できるので、そうした上でvbHideで隠してもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;管理者権限なし-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 管理者権限なし ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
これは普通にcmdと打てばよい。&lt;br /&gt;
&lt;br /&gt;
（デフォルトシェルがconhostだとして）wtで開きたいときは、&amp;amp;#59;をエスケープして&amp;amp;#45;dで渡す。以下の通りbatファイルを作ってpathを通す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wtではなくconhostの場合はconhost cmdだけでよい。batにするなら&amp;lt;code&amp;gt;start &amp;amp;quot;&amp;amp;quot; conhost cmd&amp;lt;/code&amp;gt;でよい。&lt;br /&gt;
&lt;br /&gt;
コンソール非表示ならcmd /cをつけてhiderunする。runotherで、txtの中身は以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
pwshはそのままpwshと打てばよい。powershell及びwtやconhostを明示的に指定する場合について以下で述べる。&lt;br /&gt;
&lt;br /&gt;
たとえばwtでpwshなら、runotherを使って、txtの内容は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command wt &amp;amp;#45;d $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellの場合は&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;に対応するため起動後に移動する。runotherでpiperunを使って、txtは以下。最終的に起動する方のpowershellで&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に戻している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pwshが使えるならprintcdのかわりに&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;でもよい。&lt;br /&gt;
&lt;br /&gt;
以下はpiperunを使わずshでやる例。前述の通りパイプからPowerShell側で&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使って受け取ると文字化けするので引数として渡す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$(pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath \(\&amp;amp;quot;&amp;amp;#39;$WD&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;,&amp;amp;#39;%&amp;amp;#39;)\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
Git Bashは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけてもカレントディレクトリを維持するので単純である。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinは起動後にcdする。そのかわり&amp;lt;code&amp;gt;export MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;が不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/bash &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#39;$(/bin/printf %q `pwd`)&amp;amp;#39;&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printfで一旦エスケープしたものをcdの後につなげてそのまま渡している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;wtで&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;あれ、wtなのにカレントディレクトリ維持されてる…？wt cmdではダメなのだが…&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;WD&amp;amp;#61;$(printf %q `pwd` | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59;  s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#39;$WD&amp;amp;#39;|sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 管理者権限あり ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
runotherを使って以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;gt; nul &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TrimEnd(&amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;のところは&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;の末尾のバックスラッシュへの対応である（&amp;lt;code&amp;gt;wt &amp;amp;#45;d &amp;amp;quot;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;は通らないので一見ダメそうだが、なぜかこれで動く。原因不明。）。&lt;br /&gt;
&lt;br /&gt;
batならそのまま以下の通り（黒い画面が一瞬出てしまう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
別解としてパイプを使わないものも載せておこう。cmdでは特殊文字ではないので&amp;lt;code&amp;gt;&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;に変えるのは簡単である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$args&amp;amp;#91;0&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;&amp;amp;#39;%CD&amp;amp;#58;&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下もうまくいく。cmdの&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に関する仕様により、例えばStart&amp;amp;#45;Processの直前に&amp;lt;code&amp;gt;echo &amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59;&amp;lt;/code&amp;gt;のような&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を奇数個含む文字列を入れると動かなくなる。argsを使うとバッククォートがうまくいかなかったのでMyInvocationを使ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl&amp;amp;#61;$MyInvocation.Line.Split(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%CD%\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
UNC非対応でよく、かつ（&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;をカレントディレクトリとして起動できる）pwshでよければ、上記のcmdをpwshに変えればよい。powershellならSet&amp;amp;#45;Locationで移動が必要。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UNC対応なら、管理者でないときと同じで、PSReadLineのエラーを回避するためpwshを一貫して使うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellならpiperunを使う。カレントディレクトリの取得にpwshを使っているがprintcdでもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;FilePath wt &amp;amp;#45;ArgumentList powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
shなら以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$( pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, \(\&amp;amp;quot;&amp;amp;#39;\\\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;$WD&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\\\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash ====&lt;br /&gt;
&lt;br /&gt;
runotherとpiperunで以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd || printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;をもっと手前で設定して、&amp;lt;code&amp;gt;&amp;amp;#45;ArgumentList&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を指定して、最後を&amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;にしてもよい。&lt;br /&gt;
&lt;br /&gt;
piperunを使わずにshで頑張ることもできるが、エスケープが多く読みづらくなる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd | printf %q $(/bin/cat) | /bin/sed \&amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g\&amp;amp;quot; | /bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;\&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe\&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, \&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinも同様。&lt;br /&gt;
&lt;br /&gt;
== 関連 ==&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9 コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/tmiki/items/0dab4fd17e9bed04ed91 【Windows】GitBashをcontext menuからAdministrator権限付きで実行する &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://note.com/redpeak/n/n5ddc3673117b エクスプローラーから管理者権限でコマンドプロンプトを開く方法｜ひるあんどん]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Twitter&amp;diff=332</id>
		<title>Twitter</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Twitter&amp;diff=332"/>
		<updated>2025-05-05T01:30:27Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;疑似tweetdeck&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 疑似TweetDeck ==&lt;br /&gt;
&lt;br /&gt;
TweetDeckのバージョンが新しくなり、有料化された。どうやら新バージョンのTweetDeckでも複数アカウント表示はできるらしく、しかも1アカウントだけ課金すれば十分という情報もあるが、ここでは課金せずに複数アカウントを並べる方法を紹介する。といっても技術的には何も興味深いことはなく、単に別プロファイルでブラウザを複数起動してアカウントを使い分けるのを多少やりやすくしたという程度である。&lt;br /&gt;
&lt;br /&gt;
具体的には、まずウインドウスタイルと表示領域の変更によってタイトルバーなど無駄な領域を削減し、自動でサイズと位置を調整して画面上に同じサイズで綺麗に並ぶようにした。さらに、ショートカットキーを用いて全ウインドウ一度に表示（Ctrl+Alt+Shift+&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;）/非表示（Ctrl+Alt+Shift+&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;）の切り替えができるようにした。&lt;br /&gt;
&lt;br /&gt;
実装にはAutoHotkeyを用いた（Windowsのみで動作確認）。スクリプト例ではChromeを使用しているが、単にウインドウを等間隔に並べて表示/非表示を切り替えるだけなので、何のソフトでも構わない（ただしタイトルバーでのウインドウの検出などは普通にできる必要がある）。自動リロード機能なども特に実装していない。（単にブラウザを動かしているだけなので拡張機能など使えばよい）&lt;br /&gt;
&lt;br /&gt;
* chromeを起動するところの&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;app&amp;amp;#45;id&amp;amp;#61;jgeocpdicgmkeemopbanhokmhcgcflmi&amp;lt;/code&amp;gt;の部分については[[Webブラウザ（Chrome）|Webブラウザ（Chrome）]]のPWAのところを参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;plain text&amp;quot;&amp;gt;; ウインドウのアクティベート時に強引な方法を用いる（FlashWindowだけで終わってしまうのを避ける）？&lt;br /&gt;
#WinActivateForce&lt;br /&gt;
&lt;br /&gt;
; Windowsのディスプレイのworkarea（ディスプレイからタスクバーの部分を除いたもの）を縦にn分割し、n個のウインドウを並べる。&lt;br /&gt;
; Windowsでは、Region指定によりウインドウの一部の長方形領域だけを表示することができるので、これを利用して画面の無駄な余白を削る。&lt;br /&gt;
; ただし通常のウインドウスタイルだと不自然な表示になることがあるので、ボーダーレスウインドウ（0x00000080、WS_EX_TOOLWINDOW）を指定している。&lt;br /&gt;
; 概念的には、3種類の領域を想定している。狭いほうから順に、&lt;br /&gt;
; 1. メイン領域…そのウインドウの「持ち分」であると考えられるメインの表示領域。これが互いに被らないように画面をn分割する。&lt;br /&gt;
; 2. 可視領域…ウインドウが実際に画面上で表示されているサイズ。つまり、各ウインドウは、ディスプレイの端や他のウインドウの上に少しずつはみ出して表示されている。（隙間から背景をクリックしてしまうことがなくなり、動作が安定する）&lt;br /&gt;
; 3. ウインドウ領域…Windowsでの内部的なウインドウの領域。Region指定により、一部は不可視になっている。&lt;br /&gt;
; 以下では、ウインドウ領域に入っているが可視領域に入っていない部分を「不可視領域」、可視領域に入っているがメイン領域に入っていない領域を「オーバーラップ領域」と呼ぶ。&lt;br /&gt;
&lt;br /&gt;
; 左右の不可視領域の幅&lt;br /&gt;
Global off_wid_sum := 10 + 5&lt;br /&gt;
; 上部の不可視領域の幅（タイトルバーがあるので大きめ）（下部には不可視領域を設定していない）&lt;br /&gt;
Global off_top_add = 30&lt;br /&gt;
&lt;br /&gt;
; 上下と左右のオーバーラップ領域&lt;br /&gt;
Global off_wid_overlap = 4&lt;br /&gt;
Global off_hei_overlap = 8&lt;br /&gt;
&lt;br /&gt;
; タスクバーの位置とサイズを取得&lt;br /&gt;
SysGet, TaskBar, MonitorWorkArea, 0&lt;br /&gt;
Global num_of_decks := 3&lt;br /&gt;
&lt;br /&gt;
; メイン領域&lt;br /&gt;
Global Width_org := (TaskBarRight-TaskBarLeft) // num_of_decks&lt;br /&gt;
Global Height_org := TaskBarBottom-TaskBarTop&lt;br /&gt;
&lt;br /&gt;
; 可視領域&lt;br /&gt;
Global Width_3 := Width_org+off_wid_overlap*2&lt;br /&gt;
Global MyHeight := Height_org+off_hei_overlap*2&lt;br /&gt;
&lt;br /&gt;
; ウインドウを移動する際に、上にスナップした扱いにならないための安全な距離&lt;br /&gt;
Global safe_dist_border = 10&lt;br /&gt;
; 角にスナップした扱いにならないように、（横方向の）中央付近をつかむ&lt;br /&gt;
Global safe_dist_wid := Width_3 / 2&lt;br /&gt;
&lt;br /&gt;
; この文字列で対象アプリケーションの起動を検出&lt;br /&gt;
Global TitleStr := &amp;quot;Twitter&amp;quot;&lt;br /&gt;
&lt;br /&gt;
SetBorderlessWindow(ByRef this_id)&lt;br /&gt;
{&lt;br /&gt;
    ; 非クライアント領域のレンダリングを無効に&lt;br /&gt;
    DllCall(&amp;quot;dwmapi\DwmSetWindowAttribute&amp;quot;, &amp;quot;ptr&amp;quot;, this_id, &amp;quot;uint&amp;quot;, DWMWA_NCRENDERING_POLICY := 2, &amp;quot;int*&amp;quot;, DWMNCRP_DISABLED := 1, &amp;quot;uint&amp;quot;, 4)&lt;br /&gt;
    ;これらは役に立たない&lt;br /&gt;
    ;WinSet, Style, -0x80000000, ahk_id %this_id%&lt;br /&gt;
    ;WinSet, Style, -0x00020000, ahk_id %this_id%&lt;br /&gt;
    ;WinSet, Style, -0x00040000, ahk_id %this_id%&lt;br /&gt;
    WinSet, ExStyle, 0x00000080, ahk_id %this_id%&lt;br /&gt;
    ; 可視領域の設定&lt;br /&gt;
    WinSet, Region, W%Width_3% H%MyHeight% %off_wid_sum%-%off_top_add%, ahk_id %this_id%&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
; 与えられた座標にメイン領域を設定する関数&lt;br /&gt;
PlaceWindowAtPos(ByRef this_id, x, y)&lt;br /&gt;
{&lt;br /&gt;
    ; ウインドウサイズの設定。負の座標には直接は動かせない（動かすと、強制的に違うサイズにされてしまった）ので、一旦正の座標に動かしてからマウスで移動&lt;br /&gt;
    WinMove, ahk_id %this_id%,, x, y,  Width_3 + off_wid_sum*2,  MyHeight+off_top_add ;&lt;br /&gt;
    SetBorderlessWindow(this_id)&lt;br /&gt;
    WinSet, Redraw, , ahk_id %this_id%&lt;br /&gt;
    Sleep, 300&lt;br /&gt;
    MouseClickDrag, LEFT, safe_dist_wid + safe_dist_border + off_wid_sum + off_wid_overlap, safe_dist_border + off_top_add + off_hei_overlap, safe_dist_wid + safe_dist_border, safe_dist_border, 5&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
; メイン部分&lt;br /&gt;
; TitleStrがタイトルになっている既存のウインドウがあれば無視したいので、配列に格納&lt;br /&gt;
MyTitleHandles := []&lt;br /&gt;
WinGet, windows, List, %TitleStr%&lt;br /&gt;
Loop, %windows%&lt;br /&gt;
{&lt;br /&gt;
    this_id := windows%A_Index%&lt;br /&gt;
    MyTitleHandles[this_id] := true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ProfileNames:=[&amp;quot;&amp;quot;&amp;quot;Default&amp;quot;&amp;quot;&amp;quot;, &amp;quot;&amp;quot;&amp;quot;Profile 6&amp;quot;&amp;quot;&amp;quot; ,&amp;quot;&amp;quot;&amp;quot;Profile 5&amp;quot;&amp;quot;&amp;quot;]&lt;br /&gt;
Wins:=[]&lt;br /&gt;
Loop, %num_of_decks%&lt;br /&gt;
{&lt;br /&gt;
    ; Twitterの起動&lt;br /&gt;
    win_index := A_Index&lt;br /&gt;
    Prof := ProfileNames[A_Index]&lt;br /&gt;
    ; idはtwitter.comが提供するマニフェストからchromeが計算した結果必ずこれになる&lt;br /&gt;
    Run, &amp;quot;C:\Program Files\Google\Chrome\Application\chrome_proxy.exe&amp;quot;  --profile-directory=%Prof% --app-id=jgeocpdicgmkeemopbanhokmhcgcflmi&lt;br /&gt;
&lt;br /&gt;
    Loop, {&lt;br /&gt;
        Sleep, 222&lt;br /&gt;
        WinGet, newWindows, List, %TitleStr%&lt;br /&gt;
        Loop, %newWindows%&lt;br /&gt;
        {&lt;br /&gt;
            this_id := newWindows%A_Index%&lt;br /&gt;
            if (!MyTitleHandles.HasKey(this_id)) &lt;br /&gt;
            {&lt;br /&gt;
                Sleep, 300&lt;br /&gt;
                ; Indexに応じたメイン領域を設定&lt;br /&gt;
                PlaceWindowAtPos(this_id, (win_index-1)*Width_org, TaskBarTop)&lt;br /&gt;
                MyTitleHandles[this_id] := true&lt;br /&gt;
                Wins[win_index] := this_id&lt;br /&gt;
                Goto, NEX&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    NEX:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
OnExit, ExitSub&lt;br /&gt;
; 開始処理はここで終了&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
; 常駐してショートカット処理&lt;br /&gt;
^!+,::  ; Ctrl+Alt+Shift+,&lt;br /&gt;
{&lt;br /&gt;
    Loop, %num_of_decks%&lt;br /&gt;
    {&lt;br /&gt;
        wintemp := Wins[A_Index]&lt;br /&gt;
        WinHide, ahk_id %wintemp%&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
^!+.::  ; Ctrl+Alt+Shift+.&lt;br /&gt;
{&lt;br /&gt;
    Loop, %num_of_decks%&lt;br /&gt;
    {&lt;br /&gt;
        wintemp := Wins[A_Index]&lt;br /&gt;
        WinShow, ahk_id %wintemp%&lt;br /&gt;
    }&lt;br /&gt;
    Sleep, 100&lt;br /&gt;
    Loop, %num_of_decks%&lt;br /&gt;
    {&lt;br /&gt;
        wintemp := Wins[A_Index]&lt;br /&gt;
        WinActivate ahk_id %wintemp%&lt;br /&gt;
        SetBorderlessWindow(wintemp)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
; 新しいインスタンスによって置換される際には（←これに限定しなくてもいいかもしれないが…）ウインドウを閉じる&lt;br /&gt;
ExitSub:&lt;br /&gt;
If A_ExitReason = Single&lt;br /&gt;
    Loop, %num_of_decks%&lt;br /&gt;
    {&lt;br /&gt;
        wintemp := Wins[A_Index]&lt;br /&gt;
        WinClose ahk_id %wintemp%&lt;br /&gt;
    }&lt;br /&gt;
ExitApp&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 必要に応じて、後述の狭い画面向けのCSSと併用するとよい。&lt;br /&gt;
* 需要があれば、画面を縦だけでなく横に分割するなどの機能拡張を実装するかもしれない。&lt;br /&gt;
* Vivaldiのタイリング機能を使って、複数タブを横並びで表示することもできるようだが、タブ間でセッションが共有されているので複数のアカウントに同時にログインしてTLを並べて表示することはできない（単一アカウントのTLと通知を並べるなどは可）。&lt;br /&gt;
* Stack browser（無料版だと機能制限あり？）など、複数セッションを並べて表示できるサービスもあるようなので、それでもよいかも&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;狭い画面向けのtwitterのcss&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 狭い画面向けのTwitterのCSS ==&lt;br /&gt;
&lt;br /&gt;
StylusなどのCSSを適用してくれる拡張機能をインストールし、以下を入力する。コメントで簡単に説明を書いたので必要に応じて数値の変更やコメントアウトなどするとよい。&lt;br /&gt;
&lt;br /&gt;
* Stylusに類似のものでStylishというのがあったが、個人情報の収集かなんかで問題になったので使わない方が良さそう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;/*一応参考（ただし結局ほぼ使わず） https://polygonote.com/2022_0308_18019/ */&lt;br /&gt;
/* メインエリアの幅の制約を解除 */&lt;br /&gt;
main&lt;br /&gt;
{&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*最大幅の制約を解除*/&lt;br /&gt;
.r-1ye8kvj {&lt;br /&gt;
    max-width: 6000px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*最も広いときの幅の制約の解除*/&lt;br /&gt;
.r-113js5t {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
/*比較的広いときの幅の制約の解除*/&lt;br /&gt;
.r-rthrr5 {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
/*やや狭いときの幅の制約の解除*/&lt;br /&gt;
.r-1obr2lp {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
/*狭いときの幅の制約の解除*/&lt;br /&gt;
.r-33ulu8 {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
/*DM欄の幅を確保*/&lt;br /&gt;
section[aria-labelledby=&amp;quot;root-header&amp;quot;]{&lt;br /&gt;
    width: 30%;&lt;br /&gt;
}&lt;br /&gt;
section[aria-labelledby=&amp;quot;detail-header&amp;quot;]{&lt;br /&gt;
    width: 70%;&lt;br /&gt;
}&lt;br /&gt;
/*トレンドエリア非表示*/&lt;br /&gt;
div[data-testid=&amp;quot;sidebarColumn&amp;quot;]{&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*参考記事にあったが、不要そう&lt;br /&gt;
.r-o96wvk {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*左側バナーのサイズを常に狭くする（オリジナルのサイトで最も狭くしたときの値は68で、ここからpadding-leftとpadding-rightで8ずつ引くと52になる）*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div,&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div&lt;br /&gt;
{&lt;br /&gt;
    width:52px&lt;br /&gt;
}&lt;br /&gt;
/*幅が広いときの左側バナーの余白を無効に*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div {&lt;br /&gt;
    margin-left: 0px;&lt;br /&gt;
}&lt;br /&gt;
/*header[role=&amp;quot;banner&amp;quot;],  こっちは不要？*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; a/*「ツイートする」ボタンのサイズ*/&lt;br /&gt;
{&lt;br /&gt;
    max-width: 100%;&lt;br /&gt;
   padding-left: 0px;&lt;br /&gt;
   padding-right: 0px;&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*「ツイートする」ボタンのサイズ*/&lt;br /&gt;
.r-1dye5f7 {&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-right: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*幅が広いときでも各種バナーアイコンを常に中央揃え*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div,&lt;br /&gt;
header .r-1habvwh&lt;br /&gt;
{&lt;br /&gt;
 /*不要？   width: 100%; */&lt;br /&gt;
    -webkit-align-items: center;&lt;br /&gt;
    -webkit-box-align: center;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    -ms-flex-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*幅が広いときでもバナーの各種アイコンの横に「通知」などの文字は出さない*/&lt;br /&gt;
/*これらは古いのでおそらく不要&lt;br /&gt;
header &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-usiww2 &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-1wbh5a2.r-dnmrzs.r-1ny4l3l,&lt;br /&gt;
header &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-usiww2 &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-obd0qt.r-16y2uox,&lt;br /&gt;
nav &amp;gt; div &amp;gt; div &amp;gt; div.css-901oao.css-1hf3ou5.r-18jsvk2.r-1tl8opc.r-adyw6z.r-135wba7.r-1joea0r.r-88pszg.r-bcqeeo.r-qvutc0,&lt;br /&gt;
nav &amp;gt; a &amp;gt; div &amp;gt; div.css-901oao.css-1hf3ou5.r-18jsvk2.r-1tl8opc.r-adyw6z.r-135wba7.r-1joea0r.r-88pszg.r-bcqeeo.r-qvutc0,&lt;br /&gt;
*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; nav &amp;gt; a &amp;gt; div &amp;gt; div:nth-child(2),&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; nav &amp;gt; button &amp;gt; div &amp;gt; div:nth-child(2),/*もっと見る*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; nav &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(2),&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; button &amp;gt; div:nth-child(n+2),/*下のアイコン*/&lt;br /&gt;
header[role=&amp;quot;banner&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.r-usiww2 &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(n+2){&lt;br /&gt;
    display:none&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*画像サイズ調整*/&lt;br /&gt;
/*div.css-1dbjc4n.r-1ets6dv.r-1867qdf.r-rs99b7.r-1loqt21.r-adacv.r-1ny4l3l.r-1udh08x.r-o7ynqc.r-6416eg &amp;gt; div &amp;gt; div.css-1dbjc4n.r-14gqq1x &amp;gt; div, /*引用ツイート内画像専用。不要*/&lt;br /&gt;
&lt;br /&gt;
/*ツイート画像・動画。しかし一行下のもののほうが動画を再生時のみ枠に収めて最大化ボタンを押せるようにできるので、こちらは不要そう。&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-18u37iz &amp;gt; div.css-1dbjc4n.r-1iusvr4.r-16y2uox.r-1777fci.r-kzbkwu &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div.r-9aw3ui &amp;gt; div &amp;gt; div &amp;gt; div,*/&lt;br /&gt;
/*article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-18u37iz &amp;gt; div.css-1dbjc4n.r-1iusvr4.r-16y2uox.r-1777fci.r-kzbkwu &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div.r-9aw3ui &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div,再生時の動画コンテンツ。サムネイル状態だとうまく適用外になってくれる*/&lt;br /&gt;
/*上2つはおそらくもう機能していないので下を追加*/&lt;br /&gt;
div:has(&amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),&lt;br /&gt;
&lt;br /&gt;
/*article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div&amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*引用ツイート内複数画像*/&lt;br /&gt;
&lt;br /&gt;
/*article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*引用ツイート内複数画像（少なめ）*/&lt;br /&gt;
&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*引用画像*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*画像*/&lt;br /&gt;
&lt;br /&gt;
div:has(a &amp;gt; div &amp;gt; div &amp;gt; img):has(&amp;gt; a &amp;gt; div &amp;gt; svg),/*Grokによる画像*/&lt;br /&gt;
&lt;br /&gt;
aaadiv:has(&amp;gt; div&amp;gt; div&amp;gt; div[data-testid=&amp;quot;previewInterstitial&amp;quot;]),/*四角い動画（・画像？）*/&lt;br /&gt;
&lt;br /&gt;
div[data-testid=&amp;quot;testCondensedMedia&amp;quot;] &amp;gt; div &amp;gt; div,/*複数枚入ってるものは直後のスタイルで上書きされる*/&lt;br /&gt;
&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),/*動画*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),/*動画（内側も）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),/*引用動画*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*引用ツイート画像・動画。しかし一行下のもののほうが動画を再生時のみ枠に収めて最大化ボタンを押せるようにできるので、こちらは不要そう。&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-18u37iz &amp;gt; div.css-1dbjc4n.r-1iusvr4.r-16y2uox.r-1777fci.r-kzbkwu &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.r-14gqq1x &amp;gt; div,/*引用ツイートの画像・動画*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-18u37iz &amp;gt; div.css-1dbjc4n.r-1iusvr4.r-16y2uox.r-1777fci.r-kzbkwu &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.r-14gqq1x &amp;gt; div&amp;gt; div&amp;gt; div,/*同上。*/&lt;br /&gt;
&lt;br /&gt;
/*以下2つは、それぞれの子要素のdivに適用するよりこのほうがうまくいった*/&lt;br /&gt;
div[data-testid=&amp;quot;card.wrapper&amp;quot;] &amp;gt; div[data-testid=&amp;quot;card.layoutLarge.media&amp;quot;] &amp;gt; a,/*埋め込み記事の画像*/&lt;br /&gt;
div[data-testid=&amp;quot;card.wrapper&amp;quot;]:has( &amp;gt; div[data-testid=&amp;quot;card.layoutLarge.media&amp;quot;] &amp;gt; a),/*埋め込み記事の画像*/&lt;br /&gt;
div[data-testid=&amp;quot;card.wrapper&amp;quot;] &amp;gt; div[data-testid=&amp;quot;card.layoutLarge.media&amp;quot;] &amp;gt; div/*埋め込み記事の動画。サイトによっては画像も引っかかる？*/&lt;br /&gt;
{&lt;br /&gt;
max-height: 200px;&lt;br /&gt;
max-width: 500px;&lt;br /&gt;
justify-content: center;&lt;br /&gt;
overflow:hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*複数画像（2枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),/*複数動画（2枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*引用ツイート内複数画像（2枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;])/*引用ツイート内複数動画（2枚）*/&lt;br /&gt;
{&lt;br /&gt;
    max-height: 200px;&lt;br /&gt;
    max-width: 1000px;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    overflow:hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*複数画像（3, 4枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;]),/*複数動画（3, 4枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div&amp;gt; div&amp;gt; div:has( &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div&amp;gt; a &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;]),/*引用ツイート内複数画像（3, 4枚）*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:has(&amp;gt; div &amp;gt; div&amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweetPhoto&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;placementTracking&amp;quot;] &amp;gt; div[data-testid=&amp;quot;videoPlayer&amp;quot;])/*引用ツイート内複数動画（3, 4枚）*/&lt;br /&gt;
{&lt;br /&gt;
    max-height: 400px;&lt;br /&gt;
    max-width: 1000px;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    overflow:hidden;&lt;br /&gt;
}&lt;br /&gt;
/*画像の余白の色を枠線と合わせる*/&lt;br /&gt;
div[data-testid=&amp;quot;card.wrapper&amp;quot;] &amp;gt; div[data-testid=&amp;quot;card.layoutLarge.media&amp;quot;],&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div.css-1dbjc4n.r-18u37iz &amp;gt; div.css-1dbjc4n.r-1iusvr4.r-16y2uox.r-1777fci.r-kzbkwu &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div.r-14gqq1x&lt;br /&gt;
{&lt;br /&gt;
    background-color:rgb(232, 232, 232)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div[data-testid=&amp;quot;card.wrapper&amp;quot;] &amp;gt; div[data-testid=&amp;quot;card.layoutLarge.media&amp;quot;] &amp;gt; div &amp;gt;div[style=&amp;quot;padding-bottom: 100%;&amp;quot;]/*埋め込み記事の動画*/&lt;br /&gt;
{&lt;br /&gt;
    /*不要？ display:none*/&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*「さらに表示」があるツイート*/&lt;br /&gt;
/*article[data-testid=&amp;quot;tweet&amp;quot;]:has(&amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div[data-testid=&amp;quot;tweet-text-show-more-link&amp;quot;]),*/&lt;br /&gt;
/*AdBlock*/&lt;br /&gt;
/* article[data-testid=&amp;quot;tweet&amp;quot;]:has(&amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(5) &amp;gt; div &amp;gt; svg){&lt;br /&gt;
    display:none&lt;br /&gt;
} */&lt;br /&gt;
/*Grok（広告だっけ？）*/&lt;br /&gt;
div[data-testid=&amp;quot;cellInnerDiv&amp;quot;]:has(&amp;gt; div &amp;gt; div &amp;gt;  div &amp;gt; div[data-testid=&amp;quot;inlinePrompt&amp;quot;]){&lt;br /&gt;
    display:none&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*「ホーム」ではなくツイート単独ページ（https://twitter.com/###/status/#########?s=20）用。nth-child(3)がないとTL上の画像にも適用されてしまう*/&lt;br /&gt;
article[data-testid=&amp;quot;tweet&amp;quot;] &amp;gt; div &amp;gt; div &amp;gt; div:nth-child(3) &amp;gt; div &amp;gt; div.css-1dbjc4n.r-1ssbvtb.r-1s2bzr4 &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div&lt;br /&gt;
{&lt;br /&gt;
   max-width: 800px;&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*ツイートの枠線の色を濃くする*/&lt;br /&gt;
.r-j5o65s {&lt;br /&gt;
    border-bottom-color: rgb(150, 150, 150);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.r-jxzhtn {&lt;br /&gt;
    border-color: rgb(150, 150, 150);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* フォントサイズと行間 */&lt;br /&gt;
.r-a023e6 {&lt;br /&gt;
font-size: 15px;&lt;br /&gt;
}&lt;br /&gt;
.r-rjixqe {&lt;br /&gt;
line-height: 17px;&lt;br /&gt;
}&lt;br /&gt;
/*参考記事にあったが、不要？&lt;br /&gt;
.r-1i10wst {&lt;br /&gt;
font-size: 15px;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
/* ツイート入力エリアの文字高さ。そのままで良さそう。&lt;br /&gt;
.r-135wba7 {&lt;br /&gt;
line-height: 20px;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
/*「ホーム」の文字を中央揃え*/&lt;br /&gt;
main &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt;  div &amp;gt; div:first-child &amp;gt; div:first-child &amp;gt; div:first-child &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div &amp;gt; div .r-1habvwh&lt;br /&gt;
{&lt;br /&gt;
    -webkit-align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*「ホーム」部分の長さ上限解除（広いとき）*/&lt;br /&gt;
.r-sb58tz {&lt;br /&gt;
    max-width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*入力欄の幅が変わってしまうので、固定*/&lt;br /&gt;
.r-1pjcn9w {&lt;br /&gt;
    max-width: 600px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*サイドバーのアイコンエリアの余白削る*/&lt;br /&gt;
.r-1pn2ns4 {&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-right:0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*サイドバーの各アイコンの余白も削る*/&lt;br /&gt;
.r-xyw6el {&lt;br /&gt;
    padding-left: 0px;&lt;br /&gt;
    padding-right: 0px;&lt;br /&gt;
}&lt;br /&gt;
/*「ホーム」「おすすめ」「通知」など狭く*/&lt;br /&gt;
.r-1h3ijdo {&lt;br /&gt;
    height: 30px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*「おすすめ」「フォロー中」の青い線が見えるように*/&lt;br /&gt;
.r-95jzfe {&lt;br /&gt;
    padding-top: 8px;&lt;br /&gt;
}&lt;br /&gt;
.r-1l7z4oj {&lt;br /&gt;
    padding-bottom: 8px;&lt;br /&gt;
}&lt;br /&gt;
/*ツイートの上部分を削る*/&lt;br /&gt;
.r-ttdzmv {&lt;br /&gt;
    padding-top: 4px;&lt;br /&gt;
}&lt;br /&gt;
/*ツイートの下部分、つまり「いいね」「リツイート」アイコンの下を削る*/&lt;br /&gt;
.r-kzbkwu {&lt;br /&gt;
    padding-bottom: 4px;&lt;br /&gt;
}&lt;br /&gt;
/*上記アイコンの上も削る*/&lt;br /&gt;
.r-1s2bzr4 {&lt;br /&gt;
    margin-top: 4px;&lt;br /&gt;
}&lt;br /&gt;
/* 何のために入れたんだっけ…？&lt;br /&gt;
.r-ttdzmv.r-ero68b.r-nf76sl,&lt;br /&gt;
.r-kzbkwu.r-ero68b.r-nf76sl&lt;br /&gt;
{&lt;br /&gt;
    padding-bottom: 12px;&lt;br /&gt;
    padding-top: 12px;&lt;br /&gt;
    &lt;br /&gt;
}*/&lt;br /&gt;
/*検索ボックスの幅を小さく*/&lt;br /&gt;
/*input[data-testid=&amp;quot;SearchBox_Search_Input_label&amp;quot;]&lt;br /&gt;
{&lt;br /&gt;
    padding-top: 0px;&lt;br /&gt;
    padding-bottom: 0px;&lt;br /&gt;
}*/&lt;br /&gt;
.r-ero68b {&lt;br /&gt;
    min-height: 20px;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=331</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=331"/>
		<updated>2025-05-05T01:30:21Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDP（ただし筆者が念頭に置いているのはAssociateのみで、Bindに関してはほぼ調べていない）に対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、現在もメンテされているgo製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
=== tun系 ===&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限（Linuxの場合、最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
以下のいずれも、ドメイン解決にはプロキシが適用されない（Linux向けの2つはできなくはないかもしれないが、しづらい）ことに注意。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;localhostlanなどへのアクセス制限&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== localhost・LANなどへのアクセス制限 ==&lt;br /&gt;
&lt;br /&gt;
典型的な設定例として、localhostやプライベートIPへのアクセスを制限する設定をSquid・Dante・3proxyそれぞれに関して紹介しておく。&lt;br /&gt;
&lt;br /&gt;
==== squid ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;to_localhost&amp;lt;/code&amp;gt;はbuilt&amp;amp;#45;inとして定義されていて、&amp;lt;code&amp;gt;localnet&amp;lt;/code&amp;gt;（&amp;amp;#61;srcがlocalnet）についてもUbuntuパッケージで提供されるsquid.confには入っているのだが、localnetがdstであるものとなるとACLが定義されていない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;deny to_localhost&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;deny to_linklocal&amp;lt;/code&amp;gt;は定義済みという前提で、以下のように書くとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;acl to_localnet dst 0.0.0.1-0.255.255.255&lt;br /&gt;
acl to_localnet dst 10.0.0.0/8&lt;br /&gt;
acl to_localnet dst 100.64.0.0/10&lt;br /&gt;
acl to_localnet dst 172.16.0.0/12&lt;br /&gt;
acl to_localnet dst 192.168.0.0/16&lt;br /&gt;
acl to_localnet dst fc00::/7&lt;br /&gt;
&lt;br /&gt;
http_access deny to_localnet&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;3proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;deny * * 127.0.0.0/8,0.0.0.1-0.255.255.255,10.0.0.0/8,100.64.0.0/10,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16 * * * *&lt;br /&gt;
allow *&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dante ====&lt;br /&gt;
&lt;br /&gt;
IPv4のみ対応。squid・3proxyの場合と違って0.0.0.0もblockしてしまっているが、そもそも使わないので問題ないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;client pass {&lt;br /&gt;
  from: 0/0  to: 0/0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 127.0.0.0/8 # localhost&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/8 # RFC 1122 &amp;quot;this&amp;quot; network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 10.0.0.0/8        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 100.64.0.0/10     # RFC 6598 shared address space (CGN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 169.254.0.0/16    # RFC 3927 link-local (directly plugged) machines&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 172.16.0.0/12     # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
socks block {&lt;br /&gt;
    from: 0/0 to: 192.168.0.0/16        # RFC 1918 local private network (LAN)&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
socks pass {&lt;br /&gt;
    from: 0/0 to: 0.0.0.0/0&lt;br /&gt;
    protocol: tcp udp&lt;br /&gt;
    command: bind connect udpassociate bindreply udpreply&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;natが介在する場合などのudp-associateの動作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== NATが介在する場合などのUDP Associateの動作 ====&lt;br /&gt;
&lt;br /&gt;
OpenSSHの項目でも関連することを述べたが、UDP&amp;amp;#45;over&amp;amp;#45;TCPの性能劣化を避けるため、UDP Associateは「サーバー側がクライアント側に対してUDP通信で使うための中継ポートを通知する」という動作を伴う。この際、ネットワーク上でクライアント側からサーバーが直接見えていればよいが、NATを介している場合、クライアントから見たときのサーバーのIPとサーバー自身から見たときのサーバーのIP（中継ポート通知に含まれるのはこれ）が異なることがあり、通信が成立しなくなってしまう（SSHのポート転送を普通に使うだけではUDP Associateが使えないのも直接にはこれが原因）。&lt;br /&gt;
&lt;br /&gt;
ただし、[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]にも書いた通り、Proxifyreやhev&amp;amp;#45;socks5&amp;amp;#45;tproxyなどは中継ポート通知のIP部分を無視するため、ポート番号が変わらないNATであれば問題なく動作する（redsocksはダメ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
透過SOCKSプロキシの場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]）（さらに、繰り返しになるが付け加えておくと、普通にセットアップした場合はDNSにプロキシは使われない）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 https://github.com/FelisCatus/SwitchyOmega/issues/1379]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる（これは[https://github.com/FelisCatus/SwitchyOmega/wiki/FAQ FAQ]にも書いてある）一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことが多くなるだろう。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tun2proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
&lt;br /&gt;
== その他の話題 ==&lt;br /&gt;
&lt;br /&gt;
==== ドメインごとにプロキシを変更できるブラウザ拡張のiframeにおける動作 ====&lt;br /&gt;
&lt;br /&gt;
FoxyProxyやSwitchyOmega(ZeroOmega)など、ドメインごとに自動でプロキシを切り替えてくれるブラウザ拡張はChromium系にもFirefoxにもいくつかあるが、これらはあくまでコンテンツのオリジンを元にプロキシを適用しており、ブラウザのタブを見ているわけではない。つまり、foo.comのページを開いていて、そこにbar.comのコンテンツがiframeで埋め込まれている場合、iframeの内部は、bar.comに対して使用するものと指定されたプロキシを使用して処理される。&lt;br /&gt;
&lt;br /&gt;
一応、[https://superuser.com/questions/250172/disable-enable-the-proxy-on-a-tab-by-tab-basis-in-firefox Disable/enable the proxy on a tab by tab basis in Firefox]によると、Firefoxのcontainer&amp;amp;#45;proxyというのがこれに近い機能を実質的に実現してくれるらしい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Notion2mdtest&amp;diff=330</id>
		<title>Notion2mdtest</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Notion2mdtest&amp;diff=330"/>
		<updated>2025-04-15T13:57:12Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;head&lt;br /&gt;
&lt;br /&gt;
test&amp;lt;br /&amp;gt;&lt;br /&gt;
ここは常に表示&lt;br /&gt;
&lt;br /&gt;
== 表示1 ==&lt;br /&gt;
&lt;br /&gt;
content2e&lt;br /&gt;
&lt;br /&gt;
=== 表示2 ===&lt;br /&gt;
&lt;br /&gt;
==== 表示3作業中 ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
==== 表示4 ====&lt;br /&gt;
&lt;br /&gt;
content4&lt;br /&gt;
&lt;br /&gt;
== 表示5 ==&lt;br /&gt;
&lt;br /&gt;
==== レベル3作業中 ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
== 見出し書式 ==&lt;br /&gt;
&lt;br /&gt;
===  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bold&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;BOLD&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;double-quote&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;amp;quot;double quote ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tag&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;amp;lt;tag&amp;amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;&amp;amp;#35;&amp;amp;#35;-そのまま&amp;amp;#35;表示&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;amp;#35;&amp;amp;#35; そのまま&amp;amp;#35;表示 ===&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
== テンプレート ==&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
== インデント ==&lt;br /&gt;
&lt;br /&gt;
test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;indented&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    indented2&amp;lt;/pre&amp;gt;&lt;br /&gt;
text&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# インデント見出し&amp;lt;/pre&amp;gt;&lt;br /&gt;
test2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;### インデント見出し2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## インデント見出し黄色&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;箇条書き要約など&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 箇条書き・要約など ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/souvikinator/notion-to-md/issues/91 https://github.com/souvikinator/notion-to-md/issues/91]への対応確認&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;summary1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
detail1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* bullet1&lt;br /&gt;
** bullet2&lt;br /&gt;
&lt;br /&gt;
(some text)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;summary2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
detail2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セル内改行 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;リンクと箇条書き&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;リンクと箇条書き&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;br /&amp;gt;&lt;br /&gt;
text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/ Google]&lt;br /&gt;
&lt;br /&gt;
==== 箇条書き ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;11111111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;2222222222222&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaaaaa&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;bbbbbbbbbbb&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;iiiiiiii&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;IIIIIII&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cccccc&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dddddddddd&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;separator&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;22222&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;3333&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;33333&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaa&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルト表示の設定 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;デフォルトで折り畳み  &lt;br /&gt;
改行&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
中身&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;デフォルトで表示  &lt;br /&gt;
改行&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インデント&lt;br /&gt;
&lt;br /&gt;
* a&lt;br /&gt;
** ed&lt;br /&gt;
** %&amp;amp;amp;\$\\`+&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ネスト ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;toggle  &lt;br /&gt;
kaigyo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tog&amp;lt;br /&amp;gt;&lt;br /&gt;
kaigyo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;toggled2  &lt;br /&gt;
kaigyo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lev2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;lev3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cont3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ciot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;lev22  &lt;br /&gt;
s&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;clev3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aaa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 表 ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/souvikinator/notion-to-md/issues/86 https://github.com/souvikinator/notion-to-md/issues/86]への対応&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| d&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 書式 ==&lt;br /&gt;
&lt;br /&gt;
=== 文字の消滅確認 ===&lt;br /&gt;
&lt;br /&gt;
tex&amp;lt;u&amp;gt;t&amp;lt;/u&amp;gt;&amp;lt;u&amp;gt;&amp;lt;em&amp;gt;i&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;em&amp;gt;talic&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;BO&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;L&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;o&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;strong&amp;gt;ld&amp;lt;/strong&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;a&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;b&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== セル内改行入り ===&lt;br /&gt;
&lt;br /&gt;
* 基本的に非推奨、連続改行（空行）は禁止&amp;lt;br /&amp;gt;&lt;br /&gt;
先頭に空白とか特殊文字入れるとかも危なそう&lt;br /&gt;
&lt;br /&gt;
test&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&amp;lt;br /&amp;gt;&lt;br /&gt;
改行3&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&amp;lt;code&amp;gt;e&amp;lt;br /&amp;gt;&lt;br /&gt;
a&amp;lt;br /&amp;gt;&lt;br /&gt;
f&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
z&amp;lt;br /&amp;gt;&lt;br /&gt;
aa&amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;ug&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;g&amp;lt;br /&amp;gt;&lt;br /&gt;
f&amp;lt;br /&amp;gt;&lt;br /&gt;
|aa|bb|vc|&amp;amp;#123;&amp;amp;#125;&amp;amp;#123;|&amp;amp;#125;a&amp;amp;#123;a&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
|aa|bb|vc|&amp;amp;#123;&amp;amp;#125;&amp;amp;#123;|&amp;amp;#125;a&amp;amp;#123;a&amp;amp;#123;&amp;amp;#123;s|aa&amp;amp;#125;&amp;amp;#125;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;dd&amp;amp;#61;&amp;amp;#61;aaaa&amp;amp;#61;&amp;amp;#61;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;#42; bbbb&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#58; 一個のインデント&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#58;&amp;amp;#58; 二個のインデント&amp;amp;lt;br /&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45; sdg&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#42; sfs&amp;lt;br /&amp;gt;&lt;br /&gt;
space&amp;lt;br /&amp;gt;&lt;br /&gt;
  space2&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45; spacehyphen&amp;lt;br /&amp;gt;&lt;br /&gt;
  &amp;amp;#45; hyphen2&lt;br /&gt;
&lt;br /&gt;
=== その他エスケープシーケンスの確認 ===&lt;br /&gt;
&lt;br /&gt;
code&amp;lt;code&amp;gt;d`d`d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
（Wikipediaの書式の例から流用）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#58;&amp;amp;#58;&amp;amp;#58;&amp;amp;#58;&amp;amp;#58; 多数のインデント&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 二&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・二&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 三&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#59; 三 項目一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 三 定義一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 四&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一から続いているように見えるので&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; &amp;amp;amp;lt&amp;amp;#59;nowiki&amp;amp;amp;gt&amp;amp;#59;&amp;amp;amp;lt&amp;amp;#59;br /&amp;amp;amp;gt&amp;amp;#59;&amp;amp;amp;lt&amp;amp;#59;/nowiki&amp;amp;amp;gt&amp;amp;#59; の代わりとして &amp;amp;amp;lt&amp;amp;#59;br /&amp;amp;amp;gt&amp;amp;#59;&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; よく使われます&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 五&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35;&amp;amp;#35; 五の一の一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の二&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;lt&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;amp&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;&amp;amp;#35;98&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;可能&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 三&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#59; 三 項目一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 三 定義一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 四&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一から続いているように見えるので&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; &amp;amp;lt;nowiki&amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;amp;lt;/nowiki&amp;amp;gt; の代わりとして &amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; よく使われます&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 五&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35;&amp;amp;#35; 五の一の一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;lt&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;&amp;amp;#35;98&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
あ&amp;amp;#126;&amp;amp;#126;a&amp;amp;#126;&amp;amp;#126;b&amp;amp;#126;c&amp;amp;#126;&amp;amp;#126;d&amp;amp;#126;&amp;amp;#126;e&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;f&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;g&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#123;&amp;amp;#123;stub&amp;amp;#125;&amp;amp;#125;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#123;&amp;amp;#123;UnderConstruction&amp;amp;#125;&amp;amp;#125;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#61;&amp;amp;#61;aaaa&amp;amp;#61;&amp;amp;#61;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp ^caret^ +&amp;amp;#42;@&amp;amp;#42;&amp;amp;#42;&amp;amp;#42;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;amp;#42;&amp;lt;u&amp;gt;&amp;amp;#42;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\\$\$%&amp;amp;amp;@@`””’’a’a’’’a’’’’’a\”&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#91;text&amp;amp;#93;(link) &amp;amp;#123;bra&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’ck&amp;amp;#39;&amp;amp;#39;a&amp;amp;#39;’et&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’’_’&amp;amp;#125; |bar|+&amp;amp;#45;.!()&amp;amp;#35;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#45; (a)..aa&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’+&lt;br /&gt;
&lt;br /&gt;
斜_体で_はない&lt;br /&gt;
&lt;br /&gt;
==== リンクなど ====&lt;br /&gt;
&lt;br /&gt;
+ item!! [https://google.com/ li&amp;amp;#91;&amp;amp;#93;nk]  [https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AB%E3%83%A9%E3%83%BC_(%E6%95%B0%E5%AD%A6) li!&amp;amp;#35;$&amp;amp;#45;&amp;amp;#123;&amp;amp;#123;&amp;amp;#125;&amp;amp;#125;a|a|&amp;amp;#123;&amp;amp;#123;&amp;amp;#125;s&amp;amp;#42;_^””’s&amp;amp;#125;a&amp;amp;#61;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#91;&amp;amp;#91;&amp;amp;#91;&amp;amp;#93;&amp;amp;#93;n&amp;amp;#91;&amp;amp;#93;k2]&lt;br /&gt;
&lt;br /&gt;
! a | ‘’a’’ &amp;amp;#91;text&amp;amp;#93;(http&amp;amp;#58;//127.0.0.1)&lt;br /&gt;
&lt;br /&gt;
privateページリンク[[error_private_page|error_private_page]]&lt;br /&gt;
&lt;br /&gt;
自己リンク [[Notion2mdtest|Notion2mdtest]]&lt;br /&gt;
&lt;br /&gt;
ページ内へ [[Notion2mdtest#コード|コード]]&lt;br /&gt;
&lt;br /&gt;
google.com&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;google.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/ https&amp;amp;#58;//www.google.com/]&lt;br /&gt;
&lt;br /&gt;
[https://www.rodsbooks.com/refind/installing.html#winprob https&amp;amp;#58;//www.rodsbooks.com/refind/installing.html&amp;amp;#35;winprob]&lt;br /&gt;
&lt;br /&gt;
=== 数式 ===&lt;br /&gt;
&lt;br /&gt;
数式&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;d^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;数式&amp;lt;/em&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\sum_{n=1}^{10}{n}=55\$\$&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;&lt;br /&gt;
|x| = \begin{cases}a&#039;g\\aa&#039;\end{cases}\{aa\}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$not math$&lt;br /&gt;
&lt;br /&gt;
$$&amp;lt;br /&amp;gt;&lt;br /&gt;
not math&amp;lt;br /&amp;gt;&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
数式ではない$\sum_&amp;amp;#123;n&amp;amp;#61;1&amp;amp;#125;^&amp;amp;#123;10&amp;amp;#125;&amp;amp;#123;n&amp;amp;#125;&amp;amp;#61;55$です&lt;br /&gt;
&lt;br /&gt;
=== コード ===&lt;br /&gt;
&lt;br /&gt;
両端はtrimされる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;code ```aaaa`````aaa`a```&lt;br /&gt;
```&lt;br /&gt;
```wsss&lt;br /&gt;
```&lt;br /&gt;
{{stub}}&lt;br /&gt;
{{UnderConstruction}}&lt;br /&gt;
----&lt;br /&gt;
~~~~&lt;br /&gt;
[[link|link]]&lt;br /&gt;
aaa&lt;br /&gt;
```aaa&lt;br /&gt;
```bold&lt;br /&gt;
italic&lt;br /&gt;
strike&lt;br /&gt;
unders&lt;br /&gt;
```&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
`not code`&lt;br /&gt;
&lt;br /&gt;
```&amp;lt;br /&amp;gt;&lt;br /&gt;
koremo not code&amp;lt;br /&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;details&amp;amp;gt;&amp;amp;lt;summary&amp;amp;gt;s1s&amp;amp;lt;/summary&amp;amp;gt;&amp;amp;lt;/details&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;details&amp;amp;gt;&amp;amp;lt;summary&amp;amp;gt;2ss&amp;amp;lt;/summary&amp;amp;gt;&amp;amp;lt;/details&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;tilde&amp;amp;#126;&amp;amp;#126;tilde&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt; &amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt; &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; &amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt; &amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt; &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; &amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;df&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;df&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;ef&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;d&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;d&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;u&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;vf&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
空白入りの言語名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;lt;tag&amp;gt;&amp;lt;/svg&amp;gt;&lt;br /&gt;
\\$\$%&amp;amp;@@`&amp;quot;&amp;quot;&amp;quot;&#039;&amp;quot;&amp;quot;&#039;&amp;quot;&lt;br /&gt;
# $ $\ ss&lt;br /&gt;
&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;2ss&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[text](link) {bra&#039;&#039;&#039;cks&#039;&#039;a&#039;et&#039;&#039;&#039;&#039;_a_} |bar|+-.!()#&lt;br /&gt;
+ # &lt;br /&gt;
- (a)..aa&#039;&#039;&#039;+&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
特殊記号のあるプログラム言語名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;public static Type Max&amp;lt;Type&amp;gt;(Type a, Type b)&lt;br /&gt;
  where Type : IComparable&lt;br /&gt;
{&lt;br /&gt;
  return a.CompareTo(b) &amp;gt; 0 ? a : b;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== その他 ===&lt;br /&gt;
&lt;br /&gt;
水平線&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;引用&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== 画像 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://ja.wikipedia.org/static/images/icons/wikipedia.png&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:sandbox]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=329</id>
		<title>Windowsでエクスプローラーからフォルダを各種ターミナルで開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=329"/>
		<updated>2025-04-15T13:57:09Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Explorerの右クリックメニューやアドレスバーからフォルダを各種ターミナルで開くための設定方法の紹介。cmd.exe, powershell（pwsh含む）, Cygwin, Git Bashの4つに対応。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
&lt;br /&gt;
* [[Windowsの右クリックメニューから複数ファイルをまとめて開く|Windowsの右クリックメニューから複数ファイルをまとめて開く]] のように、レジストリでフォルダ・フォルダ背景の右クリックメニューを編集できる。&lt;br /&gt;
** Windows10までの右クリックメニューに戻そう。&lt;br /&gt;
** &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定値に直接コマンドを書く方法と、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値（など）を使ってCOMを通じて実行する方法（このために[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]（使い方はレポジトリの説明を参照）を作った）がある。&lt;br /&gt;
** HKLMにあるマシン全体の設定は、それ自体は管理者権限（あるいはTrustedInstallerなどさらに上の権限）がないと書き換えられないが、&amp;lt;strong&amp;gt;HKCUに値があればそちらが優先される&amp;lt;/strong&amp;gt;ので、自分だけに関する設定変更ならユーザー権限だけで可能である。&lt;br /&gt;
** &amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;の直下に&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という名前でキーを作った場合は、自動的に&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の内容が管理者権限で実行される。ただ、&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という固定のただ一つの名前しか使えないため、例えば管理者としてコマンドプロンプトを開くメニューとPowerShellを開くメニューを共存させることができない。そのためこの記事では&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;キーを使用するのではなくコマンドの中で明示的に管理者としての実行を行っている。&lt;br /&gt;
* Explorerのアドレスバー（address bar, location barなど）にcommandと入力してEnterを押すと、そのフォルダをカレントディレクトリとして&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;というコマンドが実行される。&lt;br /&gt;
** このアドレスバーの仕様はおそらく「ファイル名を指定して実行」とほぼ同じ。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;で（メインとして）指定するファイルはフルパスなら必ず動作し、Pathが通っているまたはApp Pathsに登録されているならファイル名だけでよく、さらにbatやexeの場合は拡張子も省略できる。さらに、ほとんど知られていないが実は&amp;lt;strong&amp;gt;App Pathsの値には実行ファイル以外も書ける&amp;lt;/strong&amp;gt;ようである。&lt;br /&gt;
** つまり、パスの通っているフォルダにあるimage.pngはフルパスを打たなくても「image.png」で開けるし、さらにはApp Pathsの&amp;lt;code&amp;gt;openimage.exe&amp;lt;/code&amp;gt;というキーにimage.pngのフルパスを書けば&amp;lt;code&amp;gt;openimage&amp;lt;/code&amp;gt;と打つだけで（実際にはそのような実行ファイルは全く存在しないにもかかわらず）image.pngが開くようになる。当然、vbsなども拡張子無しで呼び出せることになる。&lt;br /&gt;
&lt;br /&gt;
== ポイント ==&lt;br /&gt;
&lt;br /&gt;
==== パス名のルール ====&lt;br /&gt;
&lt;br /&gt;
* Windowsではパスの長さが260文字以下という制限がある。詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] 参照。&lt;br /&gt;
** 制限を超えるような長いパスは&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;というプレフィックスを付けて（UNCパスの一種として）扱われる。&lt;br /&gt;
*** このようなフォルダをカレントディレクトリとしてコマンドを実行することはできないので、アドレスバーに打ち込む方式は使えない（System32をカレントディレクトリとして実行される）。wt &amp;amp;#45;dなどにも指定できない。&lt;br /&gt;
*** 右クリックメニューでは、commandの既定の値に直接書く方式の場合は、&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を設定しないと呼び出されなくなる。&lt;br /&gt;
*** シンボリックリンク/ジャンクションでパスを短くしてやれば普通に扱えるようになる&lt;br /&gt;
* 普通に入力できる文字でWindowsのファイル名に使えないのは、&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#58;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;の9個（エクスプローラーの画面で入れようとすると表示される）。&lt;br /&gt;
** その他、ヌル文字やタブスペースのような0x20未満の制御文字も使えない（はず）。&lt;br /&gt;
*** これらを含むファイルはGit Bash/Cygwinを使っても作れない。&lt;br /&gt;
*** NTFS自体の制限はおそらく&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;だけで、それ以外に関してはLinux上で作ってからWindowsで見ると見られることもある。中身の閲覧などは不可。&lt;br /&gt;
* また、末尾が空白またはピリオドのファイルも禁止で、Explorerやcmdでは作れない（自動で除去される）。&lt;br /&gt;
** これらはGit Bash/Cygwinなら作れる。前者はエクスプローラーで閲覧など多少の操作ができるが後者はほとんど何もできず、DelegateExecuteの右クリックメニューでもピリオドが外れた名前しか取得できない。&lt;br /&gt;
* 先頭が空白のファイルはExplorerだと作れないがcmdなら作れる。禁止ではないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
* Git BashではWindowsの実行ファイルにスラッシュ付きオプションを渡すときはスラッシュを2つにする必要がある。&amp;lt;code&amp;gt;cmd //c&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;bcdedit //v&amp;lt;/code&amp;gt;など。&lt;br /&gt;
* printf関数の%qオプションを使うと、文字列を&amp;lt;strong&amp;gt;エスケープされた状態にして&amp;lt;/strong&amp;gt;返してくれる。これはshからの呼び出し先の別のshで再びフォルダ名をcdなどの引数として利用したいときに使える。&lt;br /&gt;
** bash（POSIX互換ではない）の組み込みコマンドのprintfと、独立実行ファイル（GNU Coreutilsの一部）である/bin/printfがある。基本的な趣旨としては同一のコマンドだが、組み込みコマンドのほうは入力に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が含まれていない限り結果にも&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が使われることはないようで、このおかげで意図しない動作を回避できることがある。今回扱う例に関しては前者が後者の上位互換であるということになる。後者を使っているものはそれでも動いたものである。&lt;br /&gt;
** そもそも%qは組み込みコマンドのほうにしかないという話もある。環境によって違いそう。&lt;br /&gt;
* &amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くような長いパスをカレントディレクトリにしていても、Git Bash/Cygwinに付属の（というかMSYS/Cygwin向けにコンパイルされた？）exeなら実行できる。&lt;br /&gt;
* Git Bashの(ba)shは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけて起動してもカレントディレクトリが維持されるが、&amp;lt;s&amp;gt;Cygwinの(ba)shは&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;をつけると強制的にホームディレクトリに移動する。&amp;lt;/s&amp;gt;&lt;br /&gt;
** 2024/4頃、Cygwinの挙動が変化し、カレントディレクトリが維持されるようになっていることに気付く。変わっていた方のバージョンは3.5.3、変わっていない方は3.3.6であった。&lt;br /&gt;
** ところで、[https://superuser.com/questions/345964/start-bash-shell-cygwin-with-correct-path-without-changing-directory Start bash shell (cygwin) with correct path without changing directory &amp;amp;#45; Super User]の通り、&amp;lt;code&amp;gt;CHERE_INVOKING&amp;lt;/code&amp;gt;という変数を1に設定しておけばカレントディレクトリは維持される。&lt;br /&gt;
* Git Bashにおいては環境変数を正しく設定するため&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;の時点で環境変数&amp;lt;code&amp;gt;MSYSTEM&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;にしておく必要がある。[[Windowsでのターミナル環境|Windowsでのターミナル環境]] 参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershellpwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell/pwsh ====&lt;br /&gt;
&lt;br /&gt;
* バージョン5まで（Windows PowerShell）はpowershell.exe、6以降（PowerShell Core, PowerShell）はpwsh.exeと実行ファイル名が違う&lt;br /&gt;
** 以後、「powershell(.exe)」と「pwsh(.exe)」で呼び分ける。ただし手元ではpowershellの5.1とpwshの7.2～7.3くらいでしか試していないので、一部バージョンではまた違う可能性もある。&lt;br /&gt;
** pwshは必ずしもWindowsに標準では入っていないので、以下の例でもあまり依存しないように気を付ける。&lt;br /&gt;
** 基本、シングルクォートで囲えばほとんどの特殊文字が無効になり、シングルクォート自体を書くときは2つ並べる。ただし注意点として、驚くべきことにpowershell/pwshでは「&amp;lt;strong&amp;gt;全角のシングルクォート&amp;lt;/strong&amp;gt;（U+2018&amp;amp;#45;U+201B、&amp;lt;code&amp;gt;‘&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‚&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‛&amp;lt;/code&amp;gt;の4つ）」も通常のシングルクォートと同じ効力があるので、同じようにエスケープする必要がある（参照&amp;amp;#58; [https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-02?view=powershell-7.2 https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/powershell/scripting/lang&amp;amp;#45;spec/chapter&amp;amp;#45;02?view&amp;amp;#61;powershell&amp;amp;#45;7.2]）。掲載したスクリプトでは省略しているがやることは同じ。&lt;br /&gt;
* powershell.exe&lt;br /&gt;
** &amp;amp;#45;Commandがなくても付けたのと同じ扱いになる？&lt;br /&gt;
*** 逆に、&amp;amp;#45;Commandを付けなければいけないという点を除いてはpwshがpowershellの上位互換という感覚である（新しいのでそれはそう）。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダの扱いにバグがあり、cmdなどでこれらのフォルダをカレントディレクトリとした状態で5系のPowerShellを起動すると&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;amp;gt;&amp;lt;/code&amp;gt;をカレントディレクトリとして起動される（たとえば&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#93;&amp;amp;#91;&amp;lt;/code&amp;gt;なら前者、&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;なら後者）。&lt;br /&gt;
** &amp;amp;#45;Fileを使用してスクリプトを実行するとき、ダブルクォーテーションで囲われていない &amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt; が引数に含まれているとエラーになるバグがある。&lt;br /&gt;
* powershell.exe・pwsh.exe共通&lt;br /&gt;
** 連続した&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;があるフォルダに関する挙動にバグがある。コンソールプログラムを実行しても新規ウインドウで開かれる、そこをカレントディレクトリとしたときにファイルをmvできないなど。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダに関しても、絶対パス指定したりきちんとエスケープしたりすれば操作自体はできる（場合もある）。&lt;br /&gt;
*** エスケープはいずれも直前に&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;を付ける。&lt;br /&gt;
*** これらを特殊文字として扱いたくないときは&amp;lt;code&amp;gt;&amp;amp;#45;LiteralPath&amp;lt;/code&amp;gt;を付けると良い場合もある。&lt;br /&gt;
** UNCパスをカレントディレクトリにすることができるが、&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;lt;/code&amp;gt;とかいう謎のプレフィックスが付く。&lt;br /&gt;
** 末尾が空白のフォルダについてはcdできず、Cygwinなどでそのようなフォルダをカレントディレクトリとして起動したとしても&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\PowerShell\7&amp;lt;/code&amp;gt;に移動してしまう。&lt;br /&gt;
** 8.3形式のパスを強制的に長い名前に戻してcdしてしまう。その結果、長いフォルダをカレントディレクトリとして外部プログラムを実行できなくなる。&lt;br /&gt;
* PSModulePath環境変数の関係な気がするが、pwshの中でcmdを起動してその中でpowershellを起動したりするとPSReadLineモジュールが読み込めない（&amp;lt;code&amp;gt;PSReadline モジュールを読み込めません。コンソールは PSReadline なしで実行されています。&amp;lt;/code&amp;gt;）とか言われたりする&lt;br /&gt;
&lt;br /&gt;
==== 環境変数への置換 ====&lt;br /&gt;
&lt;br /&gt;
cmdなどを使うと&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で囲われた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が置換される。&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はファイル名にも普通に使える文字なので、注意が必要となる&lt;br /&gt;
&lt;br /&gt;
* 該当の名前の環境変数が定義されていたときのみ置換が行われ、定義されていなければそのままになる。&lt;br /&gt;
* &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;の置換は必ずしも&amp;lt;strong&amp;gt;cmdだけで行われるわけではない&amp;lt;/strong&amp;gt;。「ファイル名を指定して実行」、VBSのWscript.Shellのrun、conhost、wtの引数などでも行われる。しかしCreateProcessやShellExecute(Ex)やレジストリ値では行われない（無理やりREG_EXPAND_SZにしたら展開されるが、後述の&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;との適用順などは不明）。&lt;br /&gt;
* 一般には、環境変数には英数字とアンダースコアしか使えないとの説明もよくあるが、実際にはほとんどの記号が有効である。従って、&amp;lt;code&amp;gt;^%PATH^%&amp;lt;/code&amp;gt;のようなキャレットによるエスケープはcmd向けにはある程度有効だが、&amp;lt;code&amp;gt;PATH^&amp;lt;/code&amp;gt;という環境変数が定義されているとうまく動かない。&lt;br /&gt;
* （そういう変数が定義されていることは現実にほとんどないだろうし、それが保証できるなら以下の部分を読む必要はない）&lt;br /&gt;
&lt;br /&gt;
これを防ぐ方法はいくつかある。ちなみに、&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;でのエスケープというのはバッチファイルの中だけの話で、今回の場面では以下より簡単なエスケープ方法は多分ないと思う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;既に定義されているかもしれない環境変数をバックアップし、一時的にその中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変えて使用することでリテラル文字としての&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を表現し、後で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;すなわち、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;のような変数の中身をバックアップし、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変え、未知の文字列中の&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をすべて&amp;lt;code&amp;gt;%MY_PERCENT%&amp;lt;/code&amp;gt;にすることで&amp;lt;strong&amp;gt;この部分が置換によって&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に変わるのを利用して&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をそのまま渡すということである（環境変数の置換は左から順に行われるため、たとえば&amp;lt;code&amp;gt;%MY_PERCENT%PATH%MY_PERCENT%&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;が置換されることはない）。受け渡しが終わったら&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を復元する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、変数のバックアップとリストアを同じプロセス・スクリプト内で行える（&amp;lt;strong&amp;gt;呼び出した後に元に戻ってくる&amp;lt;/strong&amp;gt;）場面で有用である。呼び出し先プロセスでリストアすることも不可能ではないと思うが、環境変数には任意の文字が入る可能性があることを考えるとエスケープが大変困難になることが予想される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;VAR1, VAR2, VAR3, …のような無限個の変数を最初からチェックし、最初の未定義の変数を上記と同様に使用し、後で未設定にする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ほぼ上記と同じだが、内容のリストアでなく未設定にするだけなので、呼び出し先プロセスでも容易に行える。ただし実装が面倒である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;へと置換して、置換のプロセスを抜けた段階で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これは、&amp;lt;strong&amp;gt;最初の文字以外に&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;が含まれる&amp;lt;/strong&amp;gt;環境変数名は（実際に環境変数が設定されていたとしても絶対に）置換されないことがわかったためである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%&amp;amp;#61;%&amp;lt;/code&amp;gt;（あるいは、&amp;lt;code&amp;gt;%&amp;amp;#61;VAR%&amp;lt;/code&amp;gt;など）は少なくともcmdの対話シェル上だと置換されてしまうので&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;へのエスケープだと不十分に見えるが、実際には&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;一つでも問題なく動く場合もあった。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;しかし、動かないときもあるので、多くの例では&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にエスケープしている。&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;になっているものは、試した限りはそれでも問題なく動いているものである。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables Environment Variables &amp;amp;#45; Win32 apps | Microsoft Learn]では「&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;は環境変数に使えない」と書かれていて、ダイアログからでも設定はできないが、レジストリだと無理やり設定できる。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ユーザー環境変数に設定する分にはとりあえず問題なさそうだが、システム環境変数にレジストリから&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;（と、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を名前に含むいくつかの変数。どれが原因かは正確にはわからない）を無理やり追加したら&amp;lt;strong&amp;gt;0xc000021のブルースクリーンでWindowsが起動しなくなった&amp;lt;/strong&amp;gt;（該当の変数を全て削除したら治った）のでこれはやってはいけない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみに、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はUnix側では特殊文字ではないので、printfとの適用順はあまり気にする必要はない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;この方法のメリットは、一度置換してしまえばその文字列を何度使いまわしても変化がないことが保証されることと、未定義の変数の探索や変数のリストアが必要ないことである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;要は&amp;lt;code&amp;gt;%(&amp;amp;#61;を含まない文字列)%&amp;lt;/code&amp;gt;を含まない文字列だけを値にとる単射を構成すればいいだけなので、base64エンコーディングのようにしても構わない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただ、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に置換するという操作はPowerShellやshにとっては容易でもcmdにとっては不可能に近いので、最終的な呼び出し先がcmdであるときには採用しづらい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、今回の記事ではcmdやvbsのRunを経由してコマンドを実行しているものが多くあるが、&amp;lt;strong&amp;gt;このスクリプトの内容自体もエスケープが必要&amp;lt;/strong&amp;gt;である。つまり、例えば&amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt;の内側に&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;,&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;というPowershellコードが含まれるなら、&amp;lt;code&amp;gt;&amp;amp;#39;,&amp;amp;#39;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;という環境変数が定義されていた時にその部分が置換されてしまう。これを回避するのはそこまで難しくなく、この例であれば&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;),&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;のように&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を含む無意味なコードを挿入すればよい。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をいったん&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にしている部分に関しては、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#61;&amp;amp;#61;&amp;lt;/code&amp;gt;にすることで問題を避けられるだろう。無駄に複雑になるのでスクリプト例ではそのような措置はしていない。&lt;br /&gt;
&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
* UNCパス（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;だけでなく普通のUNCパスも含む）をカレントディレクトリにすることはできない（rdなど一部コマンドでの取り扱いは可能）。&lt;br /&gt;
* 末尾が空白のフォルダにcdすることはできないが、Cygwinなどでそのようなフォルダをカレントディレクトリとした状態でcmdを起動した場合は、そのフォルダをカレントディレクトリとして起動する（外部プログラムの起動はできないがcdなどの内部コマンドは有効で、一度でも出たら戻れない）。&lt;br /&gt;
* 各種のパース規則が本当に謎。特に引用符周りは地獄である。[https://thinca.hatenablog.com/entry/20100210/1265813598 cmd.exe のコマンドラインの仕様を解析してみた &amp;amp;#45; 永遠に未完成]を読むとわかるが、例えば「ファイル名を指定して実行」で以下の挙動を確かめよう。&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;と出る&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c &amp;amp;amp; d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;echo &amp;amp;quot;a b&amp;amp;quot;c&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;d&amp;amp;quot;&amp;lt;/code&amp;gt;がそれぞれ別々に実行される&lt;br /&gt;
** すなわち、&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が一見特殊文字でないかのような振る舞いをする（そのまま出力される）割に、その前後で特殊文字の扱いが切り替わっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
* 以下、wtと略す（実行ファイル名がwt.exeなため）。パスが通っているものと仮定する。&lt;br /&gt;
* wtでは&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;が特殊文字になるようで、&amp;lt;code&amp;gt;\&amp;amp;#59;&amp;lt;/code&amp;gt;とエスケープが必要。[https://github.com/microsoft/terminal/issues/13264 https://github.com/microsoft/terminal/issues/13264] かな？&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;も&amp;lt;code&amp;gt;\&amp;amp;quot;&amp;lt;/code&amp;gt;にする必要がある。一方で、単一の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;は（うしろに&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;などがなければ）そのまま&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;になるようである。大丈夫なのか…？&lt;br /&gt;
* 起動時にカレントディレクトリがユーザーフォルダ（%USERPROFILE%）になる&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#45;d&amp;lt;/code&amp;gt;オプションで明示的に指定することができる&lt;br /&gt;
&lt;br /&gt;
==== 連続空白 ====&lt;br /&gt;
&lt;br /&gt;
空白が連続するファイル名の対応は割と厄介である。Windows側では引数を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;で囲うことで、またsh側では適宜&amp;lt;code&amp;gt;IFS&amp;amp;#61;&amp;lt;/code&amp;gt;と設定することで対処できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Unicode対応 ====&lt;br /&gt;
&lt;br /&gt;
* UTF8を使おう&lt;br /&gt;
* &amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が一応使えるが、一旦シェル内部に入らないと使えないのでやや不便&lt;br /&gt;
** 使わなくても大丈夫なときもある。あまりちゃんと理解できていないが、経験上、powershellで&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;変数を用いて標準入力を受け取る際には&amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が必要そう。&lt;br /&gt;
* /bin/printfやprintfの実行時には&amp;lt;code&amp;gt;LANG&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;en_US.UTF8&amp;lt;/code&amp;gt;とかに設定する。&lt;br /&gt;
** Cygwinなら不要？&lt;br /&gt;
&lt;br /&gt;
==== デバッグ時 ====&lt;br /&gt;
&lt;br /&gt;
* 管理者権限のものを試すときでもまず&amp;lt;code&amp;gt;&amp;amp;#45;Verb Runas&amp;lt;/code&amp;gt;を外して動作確認するとよい。&lt;br /&gt;
* 後述のwaitrunも役に立つだろう。&lt;br /&gt;
* 特殊文字に関しては、最初は空白のないフォルダ、次に空白のあるフォルダや連続空白のあるフォルダ、次にシングルクォートや&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;を含むフォルダなどとだんだん難しくしていくとよい。&lt;br /&gt;
* それとは別に、Unicode対応、&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;（ドライブ直下）対応、259文字のフォルダ対応（後述）などをチェックする&lt;br /&gt;
* 難しい例は、例えば&amp;lt;code&amp;gt;z  𠮷𠮷%PATH%  &amp;amp;#39;  &amp;amp;#39;&amp;amp;#39;  `  `` $PATH &amp;amp;amp; &amp;amp;amp;&amp;amp;amp;   %%PATH%%&amp;amp;#91;&amp;amp;#93; &amp;amp;#93; &amp;amp;#91;  ^  ^^   &amp;amp;#39;  &amp;amp;#59;  &amp;amp;#59;&amp;amp;#59;  𩸽𩸽!PATH!&amp;amp;#35;$%&amp;amp;amp;&amp;amp;#39;()&amp;amp;#61;&amp;amp;#126;&amp;amp;#123;`+&amp;amp;#125;_,.&amp;amp;#93;&amp;amp;#91;&amp;amp;#59;@^&amp;amp;#45; &amp;amp;#45; ‘ ’ ‚ ‛&amp;lt;/code&amp;gt;のような感じ（適当）。こんなファイル名を現実に見ることはないが、エクスプローラー上で普通に入力できる内容である。&lt;br /&gt;
** 「𠮷」はBMP外かつJIS外の漢字としては最も変換で出しやすいのでテストに重宝する。（𩸽はBMP外だがJIS外ではない（第4水準））&lt;br /&gt;
&lt;br /&gt;
==== その他 ====&lt;br /&gt;
&lt;br /&gt;
* デフォルトシェルは、通常ユーザーはwtでも管理者の場合はconhostに設定されているっぽい？&lt;br /&gt;
* &amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のようなドライブ直下のパスは末尾に&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を付けなければいけないことが多い。たとえばwt &amp;amp;#45;dの引数にする場合など。またcmdでcdコマンドや&amp;lt;code&amp;gt;CD&amp;lt;/code&amp;gt;環境変数を見るときもドライブ直下のときだけは&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;が付いて返ってくる。&lt;br /&gt;
** ただ、wt &amp;amp;#45;d に&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;lt;/code&amp;gt;が渡されるように見えるのになぜか動いているものもある。未調査。&lt;br /&gt;
* shやcmdなどの中に一旦入ってしまうと一部の環境変数などが書き換わってしまうかもしれないが、多少は許容することとする。&lt;br /&gt;
* コマンド例は網羅的でない可能性があり、色々な書き方を提示しようとあえて統一していないところもある。現実にはもっと簡単なやり方があるかもしれない。あくまで一例ということで。&lt;br /&gt;
* CygwinとGit Bashはほぼ同じなのでGit Bashを主に載せてCygwinは適宜差分のみ記述する。&lt;br /&gt;
* shは、特にベースのシェルとして使うにはエスケープの方式などでWindowsと相性が悪く使いづらい感じがする。逆にcmdは内部コマンドは地獄だがベースのシェルとしては意外と副作用が少なく、そう悪くはない。&lt;br /&gt;
* 以下の例ではCygwinやGit Bashの実行ファイルにはPATHを通していないことを想定している。&amp;lt;code&amp;gt;C&amp;amp;#58;\cygwin64&amp;lt;/code&amp;gt;あたりは適当に読み替えていただきたい。&lt;br /&gt;
* 2021年途中ごろまで、wtなどのストアアプリ系？の実行ファイル（Explorer上で0バイトになってるエイリアス）をGit Bashから実行できない（Permission deniedとなる）バグがあった。 [https://github.com/git-for-windows/git/issues/2675 https://github.com/git-for-windows/git/issues/2675]&lt;br /&gt;
* ネットワークドライブは各ユーザー対象に割り当てられているせいなのか、&amp;lt;strong&amp;gt;管理者として実行すると利用できない&amp;lt;/strong&amp;gt;らしい。割り当てられる前のネットワークパス自体は有効。&lt;br /&gt;
* wtを管理者権限で呼び出すときに（確率的に）ウインドウが最前面にならないことがある。chcpの有無で変わったりするなど詳細不明。conhostだとならない気がする。startrunなどを介して実行すると必ず最前面に出るようになるっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;準備&amp;amp;#58;-win&amp;amp;#45;console&amp;amp;#45;delegator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 準備&amp;amp;#58; win&amp;amp;#45;console&amp;amp;#45;delegator ==&lt;br /&gt;
&lt;br /&gt;
cmdやPowerShellやCygwinのbashなどのシェルを使えば、スクリプトを起動して複雑なコマンドを呼び出せたり、パイプ実行が可能になったりと色々便利だが、それだけのためには大仰すぎて、特殊文字の扱いなどがかえって仇になることもある。&lt;br /&gt;
&lt;br /&gt;
そこで、シェル関連の操作に汎用的に使えるコマンドをいくつか作成して公開した。[https://github.com/ge9/win-console-tools https://github.com/ge9/win-console-tools]&lt;br /&gt;
&lt;br /&gt;
* 以前はC++で書いていた（[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]）が、C&amp;amp;#35;のほうが文字列の扱いなどが簡明。&lt;br /&gt;
&lt;br /&gt;
ただし、これはあくまで筆者が独自に作ったものであり、Windows標準のもので何とかしようとするのが面白いところでもあるので、それほど積極的には使わない。今後出てくる例はすべて、これらを一切使わなくても（余計な環境変数が設定されてしまうかもしれないという点をのぞけば）同等の機能が実現できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられた引数を特定の文字列とつなげて実行してくれるプログラム。この実行ファイル自体の名前を適宜変更して使用し、「特定の文字列」は別のファイルから読ませる。使用例は[[Windowsでのターミナル環境|Windowsでのターミナル環境]] を参照。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;amp;#45;gui&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;runotherとほぼ同じだが、コンソールアプリケーションではなくWindowsアプリケーション（黒いウインドウが出ない、cmd上で実行したときに終了待ちが行われないなど）。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;evalrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行し、その出力をそのままコマンドラインとして実行するコンソールアプリケーション。（テキストファイルからのコマンドラインの読み込みなどに使える）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;startrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインをWindowsのデフォルトシェルで起動するだけのWindowsアプリケーション。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;waitrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行したあとキー入力を待ってから終了するコンソールアプリケーション。一瞬でウインドウが消えてしまうときのデバッグに使いやすい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;hiderun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;コンソールウインドウ非表示の状態で与えられたコマンドを実行するWindowsアプリケーション。（GUIアプリケーションなどを与えた場合は非表示にならないかも）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;vbsのvbHideでも非表示にできるが、コンソールウインドウの表示位置をみると非表示のウインドウが一つ挟まっていることが分かるのに対して、こちらの場合はそうならない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを最初の&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;とそれ以降の2つに区切ってそれぞれコマンドとしてパイプでつなげて実行するコンソールアプリケーション。ただし最初のコマンドのほうに&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;自体を入力したいときは&amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;でエスケープする。また2つ目のコマンドの先頭の空白は除去される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperunex&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;piperunと似ているが、2つだけでなく3つ以上の任意個のパイプ実行を一度に行う。一見便利だが、コマンドの後ろ側に未知の文字列が渡される場合、&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;をエスケープする必要が生じる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun piperunex command1 || command2 || ... || commandN | unknown_commandline&amp;lt;/code&amp;gt;のように外側を&amp;lt;code&amp;gt;piperun&amp;lt;/code&amp;gt;で囲うと安全。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;adminrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを管理者として実行するWindowsアプリケーション。&amp;lt;code&amp;gt;ShellExecuteEx&amp;lt;/code&amp;gt;では実行ファイルパスと引数は別々に指定しなければいけないので最低限の引数の解析を行っている。PowerShell経由で管理者権限で実行するときのような面倒なエスケープが全て不要になるため非常に使いやすいが、この記事ではこれに依存しないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみにこういうのもある。[https://github.com/mattn/sudo mattn/sudo&amp;amp;#58; sudo for windows] これは、通常のUACのように別ウインドウで実行するのではなく、localhostのランダムなポートを使い、自分自身にポート番号を渡しつつ管理者権限で呼び出すことで標準入出力を転送し、元の端末でそれを読み書きできるという点で、linuxのsudoに近い。しかし標準入出力を介しているので、&amp;lt;code&amp;gt;cmd /c for /?&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cmd /c pause&amp;lt;/code&amp;gt;の挙動が変わってしまうという問題がある。また、呼び出し元でchcp 65001をしていると文字化けする。また、コマンドライン引数を一旦配列に分割してから組み直しているので情報が一部落ちている。あと、セキュリティ的にも懸念があるかもしれないが、これはそもそもLinuxのsudo自体がまずどうなの？という気持ちになった。（未解決）（参照&amp;amp;#58; [https://twitter.com/e9g/status/1687385469921931264?s=20 https&amp;amp;#58;//twitter.com/e9g/status/1687385469921931264?s&amp;amp;#61;20]）&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;uacrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startrunと同じだが、コンパイル時のマニフェスト設定でこのプログラム自体の実行に管理者権限を要求するようにしたので、adminrunと同じように使える（管理者権限で実行する対象が渡されたコマンドではなくuacrun自体になるという違いはある）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pecho&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドライン引数をそのままコンソールに出力する。→WindowsでUnicode文字（特にU+10000以上）を正しく表示（&amp;amp;amp;ファイルに書き込み）するには、「出力先がコンソールならWriteConsoleW、そうでなければWriteFileを使用する」といった非常に面倒な実装が必要であり（参照&amp;amp;#58; [https://twitter.com/mattn_jp/status/542581083242364928 https&amp;amp;#58;//twitter.com/mattn_jp/status/542581083242364928] など）、C++やC&amp;amp;#35;では扱いづらい。そこでrustを用いて実装した。→[https://github.com/ge9/pure-echo-win pure&amp;amp;#45;echo&amp;amp;#45;win]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;printcd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;カレントディレクトリをコンソールに出力する。（ちなみにpwdの由来はprint working directoryなのでそれに倣った）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;注意&amp;amp;#58;-当初は後述のnoworkingdirectoryを知らなかったので1の方法に頼っていたが実際には2の方法のほうが簡明なのでそちらを使うことを勧める1は残しておくが読む必要はあまりない&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 注意&amp;amp;#58; 当初は後述のNoWorkingDirectoryを知らなかったので1.の方法に頼っていたが、実際には2.の方法のほうが簡明なので、そちらを使うことを勧める。1.は残しておくが、読む必要はあまりない。 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Windowsでエクスプローラーからフォルダを各種ターミナルで開く}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1標準入力から受け取る場合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.標準入力から受け取る場合 ==&lt;br /&gt;
&lt;br /&gt;
まず「標準入力からディレクトリのフルパスを受け取り、そのディレクトリで各種ターミナルを起動するコマンド」を紹介する。&lt;br /&gt;
&lt;br /&gt;
そのようなコマンドを仮に&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;とすると、ExecuteCommand&amp;amp;#45;Pipeを使用して、レジストリ（該当CLSIDのLocalServer32の既定の値）に以下のように書くことで、CLSIDが右クリックメニューのDelegateExecute値に使えるようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\ExecuteCommand4000.exe h openterm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;はコンソールウインドウを非表示にするExecuteCommand&amp;amp;#45;Pipeのオプションである。&lt;br /&gt;
&lt;br /&gt;
また、この&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分は非常に長くなることがあり、その場合レジストリに書いて直接編集するのは手間がかかる（操作もしづらいし、更新を即座に反映させるために「&amp;lt;code&amp;gt;LocalServer32&amp;lt;/code&amp;gt;」キーの名前などを変えて戻す必要もあって面倒）。そこで、runotherを使ってtxtに&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の内容をそのまま書くことで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分にそのexeの名前だけを書けばよくなる。&lt;br /&gt;
&lt;br /&gt;
また、いくつかはCygwin/Git Bash向けに冒頭でcygpathによる変換を入れているが、これを取り除けば、Cygwin/Git Bash用のパスを受け取って動作するコマンドということになる。&lt;br /&gt;
&lt;br /&gt;
では以下で、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分についてそれぞれ紹介する。&lt;br /&gt;
&lt;br /&gt;
* 直接コマンド記入でも&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を指定すれば&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;に対応できるというのをこのセクションの大部分を書き終えてから知ったので、&amp;lt;strong&amp;gt;このセクションは内容の多さの割には実際の必要性はそこまで大きくないかもしれない&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git&amp;amp;#45;bashexeで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;で開く ====&lt;br /&gt;
&lt;br /&gt;
この場合shの感覚で&amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;に引数を渡せば勝手にminttyのウインドウで開いてくれるので最も楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.utf8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Git BashのcygpathでGit Bash用のパスに変換&lt;br /&gt;
* printfでエスケープ、utf8を設定&lt;br /&gt;
* git&amp;amp;#45;bash.exeに渡す&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-①startrunを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ①startrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\Git\bin&amp;lt;/code&amp;gt;のbashではなく/usr/binのbash.exeを使う。以後同じ。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-②cmdのstartを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ②cmdのstartを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/\\^/^^/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;amp;/^&amp;amp;amp;/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125; ^| sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* この場合、cmdによる環境変数への置換を避ける必要があるほか、キャレットによるエスケープにも対応する必要がある。&lt;br /&gt;
* Git Bashからcmdを実行しているので&amp;lt;code&amp;gt;//c&amp;lt;/code&amp;gt;のところのスラッシュは2つ。&lt;br /&gt;
&lt;br /&gt;
==== conhostで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; conhost &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conhostによる環境変数の置換を抑制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminalで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminalで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8 printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g) \\&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記に加えてセミコロンへの対応が必要なのと、こっちは/bin/printfじゃなくて組み込みのprintfでこうしないとだめだった。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Cygwin ====&lt;br /&gt;
&lt;br /&gt;
付属のminttyを使うものだけはGit Bashと割と差があるので載せる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\mintty.exe&amp;amp;quot; &amp;amp;#45;e &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-startrun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, startrun ====&lt;br /&gt;
&lt;br /&gt;
* パスのエスケープがおかしい気がするが、なぜか動いている&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun powershell  &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;quot;&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;&amp;amp;#39;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-cmdのstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, cmdのstart ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;\&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;\&amp;amp;#39;.Replace(\&amp;amp;#39;&amp;amp;#61;^%\&amp;amp;#39;,\&amp;amp;#39;%\&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] でも書いた通り、Windows側は&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのフォルダだけは（その必要があるにもかかわらず）8.3形式を使った短いパスにして渡してくれない。そこで、パス長さが258を超えていればcmdに渡して8.3形式の名前に変換する処理をPowerShell側で行う。この際はエスケープされていない正確なパス名をcmdに渡さなければならないので&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の値を一時的に&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に設定する方法をとっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;念のため再確認しておくが、この&amp;lt;code&amp;gt;&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;&amp;lt;/code&amp;gt;の部分は&amp;lt;code&amp;gt;&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;などと変えておかないと、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;が定義されていた場合に正しく動作しない。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cmdでは&amp;lt;strong&amp;gt;ちょうど258文字&amp;lt;/strong&amp;gt;のフォルダでもdirが失敗するなど挙動が不自然であるため、もう少し保守的に&amp;lt;strong&amp;gt;257&amp;lt;/strong&amp;gt;を超えていれば短くするという仕様でもいいかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（追記）8.3形式のパスを取得するのは普通にPowerShell内でもできるらしい…。以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; (New&amp;amp;#45;Object &amp;amp;#45;ComObject Scripting.FileSystemObject).GetFolder($mypath).ShortPath&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
259文字のフォルダを無視するなら以下のように簡潔に済む。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command wt &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39; $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
これは案外難しい。なぜなら、cmd内でcdさせるのは%のエスケープの関係で難しく（cmd内で&amp;amp;#61;を含む文字列を置換することがどうやってもできなさそう（外部プログラムを呼び出すのも難しそうだった）なので、未定義の変数を探索するやり方しかない）、Start&amp;amp;#45;Processの&amp;amp;#45;WorkingDirectoryやCygwinのshは8.3形式に対応していないからである。要は「与えられたディレクトリ（8.3形式のパスが含まれるかもしれない）をカレントディレクトリとして与えられたコマンドを実行する」だけやってくれるプログラムがあればよく、これ自体はそう難しくないことのはずだが、現状、Windows標準環境でこれができるのは自前でプログラムをコンパイルする以外だと（pwshを入れていいならpwshと）&amp;lt;strong&amp;gt;vbsしかない&amp;lt;/strong&amp;gt;ようである。結局、この部分をついでにやってくれるWindows Terminalのほうが楽ということになる。&lt;br /&gt;
&lt;br /&gt;
たとえば以下のようなvbsを用意する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Set objShell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)&lt;br /&gt;
objShell.CurrentDirectory = WScript.Arguments(1)&lt;br /&gt;
objShell.Run(WScript.Arguments(0)),,False&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;startatdir.vbs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のように書ける。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なお&amp;lt;code&amp;gt;startatdir.vbs&amp;lt;/code&amp;gt;のパス指定はフルパスが必要そう（ただしここはcmd /cの中なので&amp;lt;code&amp;gt;%USERPROFILE%&amp;lt;/code&amp;gt;とかを使って書いてもよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11標準入力から受け取る場合-&amp;amp;#45;-管理者権限あり&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.1.標準入力から受け取る場合 &amp;amp;#45; 管理者権限あり ==&lt;br /&gt;
&lt;br /&gt;
上記の続きで、こちらは管理者権限ありのもの。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39; &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39;, &amp;amp;#39;&amp;amp;quot;`&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe`&amp;amp;quot;&amp;amp;quot;&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;i&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start&amp;amp;#45;Process自体がstartみたいなものなので、引数にコンソールアプリケーションを指定したらデフォルトシェルで開かれる。&lt;br /&gt;
* 最後のところ、「&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;」のかわりに「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 とか「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 でも動くのは謎。シングルクォーテーションのエスケープ規則がわからない。参考→[https://twitter.com/e9g/status/1678283164689760256 https&amp;amp;#58;//twitter.com/e9g/status/1678283164689760256]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF&amp;amp;#45;8 printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39; , &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39; &amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== adminrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; /bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; adminrun wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; &amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#123;&amp;amp;#125;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cygwin系なしで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;set&amp;amp;#45;location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;literalpath&amp;amp;#39;,  (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;) &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
再び、startatdir.vbsを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;gt; nul &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59; $bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。259文字のフォルダを無視するなら以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2直接コマンド記入の右クリックメニュー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2.直接コマンド記入の右クリックメニュー ==&lt;br /&gt;
&lt;br /&gt;
レジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定の値に直接コマンドを記入する方式である。&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、右クリックメニューを&amp;lt;strong&amp;gt;押した時点&amp;lt;/strong&amp;gt;でのフォルダ（フォルダを右クリックするメニューからだと&amp;lt;strong&amp;gt;対象フォルダの親&amp;lt;/strong&amp;gt;、フォルダ背景を右クリックするメニューなら対象フォルダ）をカレントディレクトリとしてコマンドが起動される。そのため&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けなければならないような長大なパスのフォルダでは動作しない。しかし、&amp;lt;code&amp;gt;shell\xxxx&amp;lt;/code&amp;gt;キーに&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;値&amp;lt;/strong&amp;gt;を設定することで、カレントディレクトリが必ず&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32&amp;lt;/code&amp;gt;に設定されるようになるので動くようになる。&lt;br /&gt;
&lt;br /&gt;
対象のディレクトリはどう取得するかというと、レジストリに書き込んだ値のうち&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という部分が対象ディレクトリに書き換えられて&amp;lt;/strong&amp;gt;コマンドが実行される。この&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;もC&amp;amp;#58;などの場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;になる。コマンドの中で&amp;lt;strong&amp;gt;そのまま%という文字を使いたい場合はバッチファイルと同様に%%とエスケープする必要がある&amp;lt;/strong&amp;gt;ようである（これはどこにも書いてない？）。&lt;br /&gt;
&lt;br /&gt;
しかし、こうして渡される（特殊文字を含むかもしれない）ディレクトリ名を完璧に取得するのは意外と難しい。cmdに解釈させると&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換されてしまうし、シングルクォートとバッククォートが両方含まれているのでpowershellやshに渡すのも簡単ではない。&lt;br /&gt;
&lt;br /&gt;
コツは、powershell &amp;amp;#45;commandやsh &amp;amp;#45;cの中に直接書くのではなく、&amp;lt;strong&amp;gt;スクリプトへのコマンドライン引数として渡した上で、スクリプト内で引数として取得する&amp;lt;/strong&amp;gt;ことである。それぞれ、基本形（そのまま出力するだけ）は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;powershell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;というトークンを入れることでその後のパラメータの解析を行わないようにできる。args&amp;amp;#91;0&amp;amp;#93;は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;になるのでargs&amp;amp;#91;1&amp;amp;#93;を使う。レジストリに書く際は&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をエスケープして&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%%&amp;lt;/code&amp;gt;。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;でも同様のことができる？&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;0&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;（args&amp;amp;#91;&amp;lt;strong&amp;gt;0&amp;lt;/strong&amp;gt;&amp;amp;#93;になっていることに注意）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;というか、&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;で書き進めてしまったが、本当は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;のほうが安定するかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;あるいは&amp;lt;code&amp;gt;$MyInvocation.Line&amp;lt;/code&amp;gt;を使う方法もある。この場合、powershellへの引数が全て（この例なら&amp;lt;code&amp;gt;&amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; ...&amp;lt;/code&amp;gt;のところから）取得されるので、目当ての部分を取り出すためにここでは最後から2番目の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;と最後の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;の間を取得するという風にしている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39; &amp;amp;#59; Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;昔のPowerShell（2くらい）で試してみたらこちらでないと&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;あたりの処理がうまくいかない場合があった。argsを使うものからの書き換えは容易である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;sh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;sh &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;最後が&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;lt;/code&amp;gt;と閉じられていないのはミスではなく、&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;としてしまうと&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のときに&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;が渡されてしまうのでそれを避けるためである（これはかなりトリッキーなのでもう少し真面目にやってもいいとは思う）。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UNCパスの最初の&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;が&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;に変わってしまう（手元では、Cygwinの場合は&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみで発生している？）という問題があり、適宜置換する必要がある。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの書き方はいわゆる「ワンライナー」的なものであるが、もちろん外部にスクリプトファイルを用意してもよい。&lt;br /&gt;
&lt;br /&gt;
また、外部にスクリプトを用意してよいという条件であれば、&amp;lt;strong&amp;gt;vbsも使用可能&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この場合、まずレジストリには&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wscript &amp;amp;quot;C&amp;amp;#58;\path\to\script.vbs&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などと書く。スクリプトの内容は上記のレジストリの内容をほぼそのままWscript.ShellでRunすればよいが、&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;のかわりにWscript.Arguments(0)を挿入するのと、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;にエスケープしなくてよいのと、VBSなので文字列内の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;は&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えなければならない。これに加え、Runの引数に含まれる&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換の対象となるため、対象フォルダの文字列については&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;への置換でエスケープして、呼び出し先のpowershellなどで元に戻す。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;必要に応じてRunのオプションでvbHideを指定する。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;というか別に258文字を超えていたら云々みたいな処理も全部vbs側でやってしまってもよい（面倒なのでそういう例は載せていない）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
バッチファイルに渡すのは、バッチファイルをcmdが呼び出す時点で&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のようなファイル名の環境変数は既に展開されてしまうので、どうやっても不可能。&lt;br /&gt;
&lt;br /&gt;
他には、（hiderunと）piperunとpechoを併用するという方法もあり、それらの実行ファイルを用意する必要があるという以外は綺麗にできる方法である。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、一旦取得できてしまえばあとは前述の&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込むだけでよい。ただ、実際にはわざわざ&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込まなくても（パイプを使わなくても）もっと簡単に起動できることもあるのでそちらを中心に紹介する。&lt;br /&gt;
&lt;br /&gt;
* commandの最初で指定する（メインの）実行ファイル（先ほどなら&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;）をファイル名単体で書く場合は、それが（メニューをHKCUで設定するならHKCUの（最近のWindowsならHKLMのでも可？）、HKLMで設定するならHKLMの）&amp;lt;strong&amp;gt;App Pathsキー&amp;lt;/strong&amp;gt;に登録されていなければならない（&amp;lt;strong&amp;gt;PATHは通っていなくてもいい&amp;lt;/strong&amp;gt;）。登録されていない場合はフルパスで指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
=== 設定例 ===&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限なし ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考までに、Windowsにもともと入っているメニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell.exe &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これだとシングルクォートと連続スペースに対応できない。連続スペースだけなら&amp;lt;code&amp;gt;&amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;%V&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えると解決できる。&amp;lt;code&amp;gt;%$&amp;amp;#91;&amp;amp;#93;`&amp;lt;/code&amp;gt;あたりは見た感じ問題なし。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;以下の解決策でもまだ不完全 [https://superuser.com/questions/1310258/open-powershell-window-here-file-explorer-context-menu-command-breaks-with-fol &amp;amp;quot;Open PowerShell window here&amp;amp;quot; File Explorer context&amp;amp;#45;menu command breaks with folder names with apostrophes (single quotes) &amp;amp;#45; Super User]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この問題は[https://github.com/PowerShell/PowerShell/issues/6598 https://github.com/PowerShell/PowerShell/issues/6598]や[https://github.com/PowerShell/PowerShell/pull/6660 https://github.com/PowerShell/PowerShell/pull/6660] で扱われており、結局pwshでは&amp;amp;#45;WorkingDirectoryというパラメータが追加された。[https://github.com/PowerShell/PowerShell/issues/14091 https://github.com/PowerShell/PowerShell/issues/14091]にある以下の文字列をレジストリに書いたところ、正しく動作したので、pwshではこれでよい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh.exe &amp;amp;#45;NoExit &amp;amp;#45;RemoveWorkingDirectoryTrailingCharacter &amp;amp;#45;WorkingDirectory &amp;amp;quot;%V!&amp;amp;quot; &amp;amp;#45;Command &amp;amp;quot;$host.UI.RawUI.WindowTitle &amp;amp;#61; &amp;amp;#39;PowerShell 7 (x64)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;wt powershell &amp;amp;#45;noexit &amp;amp;#45;Command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;wtで。標準入力のときとほぼ同じ。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windowsにもともと入っているメニューでは以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cmd.exe /s /k pushd &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くパスを除いて）ほとんどの場合に正しく機能するが、&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のような文字列が含まれているフォルダではうまくいかない。ちなみにpushdによりUNCパスには自動的にネットワークドライブが割り当てられる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;mintty（git&amp;amp;#45;bash.exe使用）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bashのインストーラにより設定される「Git Bash Here」メニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;quot;&amp;amp;#45;&amp;amp;#45;cd&amp;amp;#61;%v.&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、特殊文字にはすべて対応しているが、（NoWorkingDirectoryをつけたとしても）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;で始まるパスではうまくいかない。最後の「.」はよくわからないがこれを付けておくと&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;cd&amp;lt;/code&amp;gt;がうまくやってくれるっぽい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;export MSYSTEM&amp;amp;#61;MINGW64&amp;amp;#59;exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe\&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;置換の対象を&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみとするためsedの引数に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が増えている&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;環境変数の置換を抑止する必要がある。デフォルトシェルで起動するならこれは不要（で、wtでないので&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;のエスケープも不要）で、以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MyInvocationを使う例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;vbsの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;次の節で解説する「（自分が起動された）カレントディレクトリでの起動」にも対応している（引数がない場合）。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Dim curDir&lt;br /&gt;
&lt;br /&gt;
Set ws = CreateObject(&amp;quot;Wscript.Shell&amp;quot;)&lt;br /&gt;
Dim dir&lt;br /&gt;
If WScript.Arguments.Count = 0 Then&lt;br /&gt;
   dir = ws.CurrentDirectory&lt;br /&gt;
Else&lt;br /&gt;
   dir = Wscript.Arguments(0)&lt;br /&gt;
End If&lt;br /&gt;
dir = Replace(dir,&amp;quot;%&amp;quot;,&amp;quot;==%&amp;quot;)&lt;br /&gt;
ws.run &amp;quot;powershell -Command &amp;quot;&amp;quot;&amp;amp; {Start-Process -Verb Runas -Filepath wt -Argumentlist powershell, -noexit, -command, Set-Location, -LiteralPath, (&#039;\&amp;quot;&amp;quot;&#039;&#039;&#039;+($args[1].Trim(&#039;\&amp;quot;&amp;quot;&#039;) -replace &#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;&#039; -replace &#039;;&#039;, &#039;\;&#039; )+&#039;&#039;&#039;.Replace(&#039;&#039;==%&#039;&#039;,&#039;&#039;%&#039;&#039;)\&amp;quot;&amp;quot;&#039;)}&amp;quot;&amp;quot; --% &amp;quot;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;amp;dir&amp;amp;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;, vbHide&lt;br /&gt;
&lt;br /&gt;
Set objShell = Nothing&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この場合も&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。デフォルトシェルなら、startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;理論上はワンライナーでも書けるが、エスケープが面倒すぎるのでファイルに書いたほうがよいだろう。まずレジストリの中身は以下のようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\path\to\gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;で、&amp;lt;code&amp;gt;gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;lt;/code&amp;gt;の中身は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
IFS=&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
echo $*|/bin/sed &#039;s/\\/\\\\/&#039;|/bin/cygpath -f -|printf %q $(/bin/cat) |/bin/sed &amp;quot;s/&#039;/&#039;&#039;/g;s/%/==%/g;s/;/\\\\;/g&amp;quot;|/bin/xargs -d &#039;\n&#039; -I {} powershell -Command Start-Process -Filepath wt -ArgumentList &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\env.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &#039;&amp;quot;MSYSTEM=MINGW64&amp;quot;&#039; , &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\sh.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &amp;quot;&#039;--login&#039;&amp;quot;, &amp;quot;&#039;-c&#039;&amp;quot;, &amp;quot;&#039;&amp;quot;&#039;&amp;quot;IFS=\;cd $(echo {}| /bin/sed s/==%/%/g) \; exec bash&amp;quot;&#039;&amp;quot;&#039;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cygwinも同様である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-codeのメニューおまけ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== VS Codeのメニュー（おまけ） ====&lt;br /&gt;
&lt;br /&gt;
「Code で開く」メニューのcommand値は以下のように設定されている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Microsoft VS Code\Code.exe&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは特殊文字などに関しても問題なく動作するうえ、実はそのまま&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付いたパスにも適用可能である。従って、&amp;lt;code&amp;gt;VSCode&amp;lt;/code&amp;gt;キーに&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;値を設定する（設定の書き換えまたはHKCUによるオーバーライド）だけで、長大フォルダでもVS Codeが使えるようになる。ターミナルの起動には失敗してしまうがファイル・フォルダの作成・編集などの基本操作がGUIでできるので意外と便利（もちろん、他のBetter Explorer的なツールを使う手もあるだろう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-エクスプローラーのアドレスバーから&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. エクスプローラーのアドレスバーから ==&lt;br /&gt;
&lt;br /&gt;
このときは、末尾が空白のパスや&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が必要な長大パスやちょうど259文字のフォルダはそもそも対応していないので考えなくてよい。しかし通常のネットワークファイル向けのUNCパス（&amp;lt;code&amp;gt;\\192.168.1.1\disk&amp;lt;/code&amp;gt;など）に対応する必要はあるので、cmdをベースにすることはできない（cmdの中に入った時点でカレントディレクトリが変わってしまう）。また&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;が含まれるパスをカレントディレクトリにできないことから、powershell.exeもベースとしては使えない。&lt;br /&gt;
&lt;br /&gt;
なので、パイプを使って先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;にむけて流し込もうと思ったら選択肢はpwsh.exeかpiperunかCygwin系だけである。それぞれの書き方は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pwsh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;上とほぼ変わっていないが、pwshはディレクトリの取得だけで使っているので&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;のところで環境変数が汚染されるのを防げる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin/Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cmd //c \&amp;amp;quot;chcp 65001 &amp;amp;gt; nul\&amp;amp;quot;| pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | openterm&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;一つ問題があり、hiderunを使う（コンソールを非表示にする）とchcpが効かないようで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;でPowerShellの&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使っているとUnicode文字が化けてしまう。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分で先頭にcygpathが入っているものを使うときは、そちらのcygpathとこちらでのcygpath &amp;amp;#45;wは打ち消し合って無駄なので消してよい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このほかにvbs(wscript)もカレントディレクトリの取得のところは問題なくやってくれるので、それをさっきのWscript.Arguments(0)のかわりに使えばよい。&lt;br /&gt;
&lt;br /&gt;
最初に表示されるコンソールを非表示にしたければ、&amp;lt;code&amp;gt;hiderun&amp;lt;/code&amp;gt;を付けてrunother経由で実行するのが手軽だが、前述の通りvbsも拡張子無しで呼び出せるように設定できるので、そうした上でvbHideで隠してもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;管理者権限なし-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 管理者権限なし ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
これは普通にcmdと打てばよい。&lt;br /&gt;
&lt;br /&gt;
（デフォルトシェルがconhostだとして）wtで開きたいときは、&amp;amp;#59;をエスケープして&amp;amp;#45;dで渡す。以下の通りbatファイルを作ってpathを通す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wtではなくconhostの場合はconhost cmdだけでよい。batにするなら&amp;lt;code&amp;gt;start &amp;amp;quot;&amp;amp;quot; conhost cmd&amp;lt;/code&amp;gt;でよい。&lt;br /&gt;
&lt;br /&gt;
コンソール非表示ならcmd /cをつけてhiderunする。runotherで、txtの中身は以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
pwshはそのままpwshと打てばよい。powershell及びwtやconhostを明示的に指定する場合について以下で述べる。&lt;br /&gt;
&lt;br /&gt;
たとえばwtでpwshなら、runotherを使って、txtの内容は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command wt &amp;amp;#45;d $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellの場合は&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;に対応するため起動後に移動する。runotherでpiperunを使って、txtは以下。最終的に起動する方のpowershellで&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に戻している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pwshが使えるならprintcdのかわりに&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;でもよい。&lt;br /&gt;
&lt;br /&gt;
以下はpiperunを使わずshでやる例。前述の通りパイプからPowerShell側で&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使って受け取ると文字化けするので引数として渡す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$(pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath \(\&amp;amp;quot;&amp;amp;#39;$WD&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;,&amp;amp;#39;%&amp;amp;#39;)\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
Git Bashは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけてもカレントディレクトリを維持するので単純である。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinは起動後にcdする。そのかわり&amp;lt;code&amp;gt;export MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;が不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/bash &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#39;$(/bin/printf %q `pwd`)&amp;amp;#39;&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printfで一旦エスケープしたものをcdの後につなげてそのまま渡している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;wtで&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;あれ、wtなのにカレントディレクトリ維持されてる…？wt cmdではダメなのだが…&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;WD&amp;amp;#61;$(printf %q `pwd` | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59;  s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#39;$WD&amp;amp;#39;|sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 管理者権限あり ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
runotherを使って以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;gt; nul &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TrimEnd(&amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;のところは&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;の末尾のバックスラッシュへの対応である（&amp;lt;code&amp;gt;wt &amp;amp;#45;d &amp;amp;quot;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;は通らないので一見ダメそうだが、なぜかこれで動く。原因不明。）。&lt;br /&gt;
&lt;br /&gt;
batならそのまま以下の通り（黒い画面が一瞬出てしまう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
別解としてパイプを使わないものも載せておこう。cmdでは特殊文字ではないので&amp;lt;code&amp;gt;&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;に変えるのは簡単である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$args&amp;amp;#91;0&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;&amp;amp;#39;%CD&amp;amp;#58;&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下もうまくいく。cmdの&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に関する仕様により、例えばStart&amp;amp;#45;Processの直前に&amp;lt;code&amp;gt;echo &amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59;&amp;lt;/code&amp;gt;のような&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を奇数個含む文字列を入れると動かなくなる。argsを使うとバッククォートがうまくいかなかったのでMyInvocationを使ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl&amp;amp;#61;$MyInvocation.Line.Split(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%CD%\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
UNC非対応でよく、かつ（&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;をカレントディレクトリとして起動できる）pwshでよければ、上記のcmdをpwshに変えればよい。powershellならSet&amp;amp;#45;Locationで移動が必要。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UNC対応なら、管理者でないときと同じで、PSReadLineのエラーを回避するためpwshを一貫して使うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellならpiperunを使う。カレントディレクトリの取得にpwshを使っているがprintcdでもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;FilePath wt &amp;amp;#45;ArgumentList powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
shなら以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$( pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, \(\&amp;amp;quot;&amp;amp;#39;\\\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;$WD&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\\\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash ====&lt;br /&gt;
&lt;br /&gt;
runotherとpiperunで以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd || printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;をもっと手前で設定して、&amp;lt;code&amp;gt;&amp;amp;#45;ArgumentList&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を指定して、最後を&amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;にしてもよい。&lt;br /&gt;
&lt;br /&gt;
piperunを使わずにshで頑張ることもできるが、エスケープが多く読みづらくなる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd | printf %q $(/bin/cat) | /bin/sed \&amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g\&amp;amp;quot; | /bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;\&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe\&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, \&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinも同様。&lt;br /&gt;
&lt;br /&gt;
== 関連 ==&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9 コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/tmiki/items/0dab4fd17e9bed04ed91 【Windows】GitBashをcontext menuからAdministrator権限付きで実行する &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://note.com/redpeak/n/n5ddc3673117b エクスプローラーから管理者権限でコマンドプロンプトを開く方法｜ひるあんどん]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=328</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=328"/>
		<updated>2025-04-02T15:42:26Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDP（ただし筆者が念頭に置いているのはAssociateのみで、Bindに関してはほぼ調べていない）に対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、go製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
=== tun系 ===&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限（最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;natが介在する場合などのudp-associateの動作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== NATが介在する場合などのUDP Associateの動作 ====&lt;br /&gt;
&lt;br /&gt;
OpenSSHの項目でも関連することを述べたが、UDP&amp;amp;#45;over&amp;amp;#45;TCPの性能劣化を避けるため、UDP Associateは「サーバー側がクライアント側に対してUDP通信で使うための中継ポートを通知する」という動作を伴う。この際、ネットワーク上でクライアント側からサーバーが直接見えていればよいが、NATを介している場合、クライアントから見たときのサーバーのIPとサーバー自身から見たときのサーバーのIP（中継ポート通知に含まれるのはこれ）が異なることがあり、通信が成立しなくなってしまう（SSHのポート転送を普通に使うだけではUDP Associateが使えないのも直接にはこれが原因）。&lt;br /&gt;
&lt;br /&gt;
ただし、[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]にも書いた通り、Proxifyreやhev&amp;amp;#45;socks5&amp;amp;#45;tproxyなどは中継ポート通知のIP部分を無視するため、ポート番号が変わらないNATであれば問題なく動作する（redsocksはダメ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
Proxifyreやredsocksを普通に使う場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 https://github.com/FelisCatus/SwitchyOmega/issues/1379]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことになる。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tun2proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=327</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=327"/>
		<updated>2025-04-02T15:29:11Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
ここにあげたものは特に注記がなければUDPに対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
これ自体はSOCKS5サーバーではなく、TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。SOCKS・HTTP・POP3・SMTPなどいくつかのプロキシを含む。エラーメッセージなどがかなり不親切だが、結構多機能で、ちゃんと動くソフト。&amp;lt;code&amp;gt;3proxy&amp;lt;/code&amp;gt;というメインの実行ファイルとあわせて、各プロキシに対応した&amp;lt;code&amp;gt;socks&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;proxy&amp;lt;/code&amp;gt;といった検索性の低い名前の実行ファイルがいくつか含まれているちょっと謎の構成。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、go製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
=== tun系 ===&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限（最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
Proxifyreやredsocksを普通に使う場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]）。一方、HTTPのレイヤで動作するWebブラウザでは、この機能が使われる場合がある。2018年時点での[https://github.com/FelisCatus/SwitchyOmega/issues/1379 https://github.com/FelisCatus/SwitchyOmega/issues/1379]によれば、Chromeでは必ずSOCKS5サーバー側でドメイン解決が行われる一方、Firefoxではそうでなかったようである。現在のFirefoxでは「SOCKS v5 を使用するときは DNS もプロキシーを使用する（Proxy DNS when using SOCKS v5）」（v4についても同様のオプションがあるが、SOCKS4aではないSOCKS4でどうなるかは未検証）というオプションがあってデフォルトで有効になっているため、やはり基本的にはSOCKSサーバー側でドメイン解決が行われる。AndroidのFirefox（この設定項目がない）にProxy SwitchyOmegaを入れた場合もそのように動作した。&lt;br /&gt;
&lt;br /&gt;
なお、HTTPプロキシについても、ブラウザで普通に使う分には、（HTTP/HTTPS共に）ドメイン解決は基本的にプロキシサーバー側で行われる。&lt;br /&gt;
&lt;br /&gt;
* 拡張機能などではうまく動作しない場合がある模様。 [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことになる。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tun2proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=326</id>
		<title>Zotero</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=326"/>
		<updated>2025-04-02T09:57:15Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。&lt;br /&gt;
&lt;br /&gt;
== 初期設定 ==&lt;br /&gt;
&lt;br /&gt;
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては [https://note.com/sdeso/n/n013952313c1b 【令和最新版】文献管理ソフト Zoteroのすゝめ｜SD｜note] が大変詳しく、これでほぼ十分であるが、いくつか追加しておく。&lt;br /&gt;
&lt;br /&gt;
* Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると（アドオンと混同されて）「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。&lt;br /&gt;
* ファイルの自動命名は日本人だと苗字がLast Nameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。&lt;br /&gt;
* コレクションごとにフォルダ分けしたい場合は、”Use subfolder defined by”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする（この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける）。参考&amp;amp;#58;[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427 Zoteroの使い方（我流、逐次更新） &amp;amp;#45; Bag of ML Words]など&lt;br /&gt;
&lt;br /&gt;
=== ブラウザ拡張の使い方など ===&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbedded Metadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由せずに（ローカルにあるpdfを）入れるときは、ZoteroのウインドウにD&amp;amp;amp;D（このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される（移動になる））して取り込む。日本語論文などで文献情報がうまく読まれない場合は、Manual Entryを作成するしかない場合もあるが、J&amp;amp;#45;STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある（pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい）。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRename Attachmentsをする必要がある。なお（最初のサイトで推奨されている通り）”&amp;lt;strong&amp;gt;サブコレクションからアイテムを表示&amp;lt;/strong&amp;gt;”がonだと特定コレクションの中身（サブコレクション内部を含め）すべてに対してRename Attachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う（あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる）。なお、前述のようにクラウドストレージのフォルダをLocation of Filesに指定して同期している場合、Rename Attachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。&lt;br /&gt;
&lt;br /&gt;
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRename and moveを実行し、適宜ゴミ箱に移動して（アイテムを）削除し、DELETEフォルダの中身も定期的に削除する、とやっている。&lt;br /&gt;
&lt;br /&gt;
== dateデータのフォーマットについて ==&lt;br /&gt;
&lt;br /&gt;
Zotero Connectorはサイトやpdfから論文の投稿（掲載？）日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月 22 , 2011」、英語であれば「April 22, 2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&amp;amp;#45;04&amp;amp;#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。&lt;br /&gt;
&lt;br /&gt;
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、Better BibTeXの使用時に問題が発生していた（後述）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;better-bibtex-for-zotero&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== [https://retorque.re/zotero-better-bibtex/ &amp;lt;strong&amp;gt;Better BibTeX for Zotero&amp;lt;/strong&amp;gt;] ==&lt;br /&gt;
&lt;br /&gt;
まずは普通に[https://retorque.re/zotero-better-bibtex/ Better BibTeX for Zotero]からxpiをインストール、再起動すると再びdrag&amp;amp;#45;and&amp;amp;#45;dropを有効にするため再起動しろと言われるので再起動する。Citation keyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0d Zotero+BibTeXで参考文献の出力を自動化&amp;amp;amp;論文の引用で出てきた順にソートする]の通り、export→fieldsのfields to omit from exportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/ Zotero で citation keys を設定する ( zotero&amp;amp;#45;better&amp;amp;#45;bibtex ) &amp;amp;#45; shoei05]の通りCitation keysを&amp;amp;#91;auth&amp;amp;#58;lower&amp;amp;#93;&amp;amp;#91;year&amp;amp;#93;&amp;amp;#91;shorttitle1_1&amp;amp;#93;に変更する。&lt;br /&gt;
&lt;br /&gt;
Citation keyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える（これは設定で無効にできる）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;日本語文献のcitation-keyについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 日本語文献のCitation Keyについて ====&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977 https&amp;amp;#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;yearデータの不具合6760で修正済&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== yearデータの不具合(&amp;lt;u&amp;gt;6.7.60で修正済&amp;lt;/u&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011&amp;amp;#45;04&amp;amp;#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX（.bib）に出力されてしまう（報告済み&amp;amp;#58; [https://github.com/retorquere/zotero-better-bibtex/issues/2449 &amp;amp;#91;Bug&amp;amp;#93;&amp;amp;#58; Japanese date format is not parsed correctly · Issue &amp;amp;#35;2449 · retorquere/zotero&amp;amp;#45;better&amp;amp;#45;bibtex]、6.7.61あたりで修正済み）。←の通り、Better BibTeXのエクスポート時に適用されるscript（Export → postscript）のところにデータを置換するための以下のようなコードを書いておくとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;if (tex.has.year) {&lt;br /&gt;
tex.add({name: &#039;year&#039;, replace: true, value: tex.has.year.value.replace(/.* /, &#039;&#039;)})&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
設定箇所はこんな感じ↓&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった（[https://github.com/retorquere/zotero-better-bibtex/issues/2447 https://github.com/retorquere/zotero-better-bibtex/issues/2447]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zotero-protocolを使用した操作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zotero Protocolを使用した操作 ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//&amp;lt;/code&amp;gt;という形式のURL（URIスキーム）を以下のように指定してZoteroを起動することができる（既に起動していた場合は、画面に変化が起こる）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;zotero.exe -url &amp;quot;zotero://url/here&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。&lt;br /&gt;
&lt;br /&gt;
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが [https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.js zotero/zotero&amp;amp;#45;protocol&amp;amp;#45;handler.js at master · zotero/zotero] の&amp;lt;code&amp;gt;scopeObject&amp;lt;/code&amp;gt;などと書いてあるあたりをよく読むと、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//select/library/collections/&amp;amp;#123;collection_key&amp;amp;#125;/items/&amp;amp;#123;item_key&amp;amp;#125;&amp;lt;/code&amp;gt;という形式で指定すればよいことがわかる（groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである）。&amp;lt;code&amp;gt;collection_key&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;item_key&amp;lt;/code&amp;gt;はどちらも&amp;lt;code&amp;gt;1A2B3C4D&amp;lt;/code&amp;gt;のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ&amp;lt;strong&amp;gt;ID&amp;lt;/strong&amp;gt;も割り当てられているがこちらは1～3桁くらいの数字でありkeyとは別なので注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;指定されたcitation-keyのアイテムをzoteroで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 指定されたCitation keyのアイテムをZoteroで開く ==&lt;br /&gt;
&lt;br /&gt;
前述の方法を応用して実装してみる。ここではCitation keyとしてBetter BibTeXのものを使うことを仮定する。&lt;br /&gt;
&lt;br /&gt;
まず、Citation keyからアイテムのキーを取得する部分を作る。Citation keyはBetter BibTeXが管理しているので（ここではデフォルトの&amp;amp;#126;/Zoteroに各種データがあると仮定して）&amp;amp;#126;/Zotero/better&amp;amp;#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション（複数ある場合は最初のもの）のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。&lt;br /&gt;
&lt;br /&gt;
Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797 SQLite Forum&amp;amp;#58; Option to open a database as read&amp;amp;#45;only despite locked.]にある通り、（Windowsなら）&amp;lt;code&amp;gt;sqlite3 &amp;amp;quot;file&amp;amp;#58;Zotero\\zotero.sqlite?mode&amp;amp;#61;ro&amp;amp;amp;nolock&amp;amp;#61;1&amp;amp;quot;&amp;lt;/code&amp;gt;のようにしてやると読み取り専用で開くことはできる（書き込まないのでこれで充分）。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。&lt;br /&gt;
&lt;br /&gt;
コード例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;python&amp;quot;&amp;gt;import sqlite3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
db = sqlite3.connect(&#039;file:&#039;+sys.argv[1]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur = db.cursor()&lt;br /&gt;
cur.execute(&#039;SELECT data FROM &amp;quot;better-bibtex&amp;quot; where name=&amp;quot;better-bibtex.citekey&amp;quot;&#039;)&lt;br /&gt;
d = json.loads(cur.fetchone()[0])&lt;br /&gt;
mydict = {}&lt;br /&gt;
for item in d[&amp;quot;data&amp;quot;]:&lt;br /&gt;
    mydict[item[&amp;quot;citekey&amp;quot;]] = item[&amp;quot;itemKey&amp;quot;]&lt;br /&gt;
myKey = mydict[sys.argv[3]]&lt;br /&gt;
&lt;br /&gt;
db2 = sqlite3.connect(&#039;file:&#039;+sys.argv[2]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur2 = db2.cursor()&lt;br /&gt;
cur2.execute(&amp;quot;SELECT itemID FROM items WHERE key=?&amp;quot;, (myKey, ))&lt;br /&gt;
item_id = cur2.fetchone()[0]&lt;br /&gt;
cur2.execute(&amp;quot;SELECT collectionID FROM collectionItems WHERE itemID=?&amp;quot;, (item_id, ))&lt;br /&gt;
# 所属する最初のコレクションIDを取得&lt;br /&gt;
collection_id = cur2.fetchone()[0]&lt;br /&gt;
# collectionIDからcollectionKeyを取得&lt;br /&gt;
cur2.execute(&amp;quot;SELECT key FROM collections WHERE collectionID=?&amp;quot;, (collection_id,))&lt;br /&gt;
collection_key =cur2.fetchone()[0]&lt;br /&gt;
print(collection_key)&lt;br /&gt;
subprocess.run(f&#039;&amp;quot;C:\Program Files (x86)\Zotero\zotero.exe&amp;quot; -url &amp;quot;zotero://select/library/collections/{collection_key}/items/{myKey}&#039;)&lt;br /&gt;
db.close()&lt;br /&gt;
db2.close()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;zoto.py&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記コードは以下のように起動できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;python &amp;quot;path\to\zoto.py&amp;quot; &amp;quot;%USERPROFILE%\Zotero\better-bibtex.sqlite&amp;quot; &amp;quot;%USERPROFILE%\Zotero\zotero.sqlite&amp;quot; %1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&lt;br /&gt;
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=325</id>
		<title>Zotero</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=325"/>
		<updated>2025-04-02T09:33:21Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。&lt;br /&gt;
&lt;br /&gt;
==初期設定==&lt;br /&gt;
&lt;br /&gt;
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては[https://note.com/sdeso/n/n013952313c1b【令和最新版】文献管理ソフトZoteroのすゝめ｜SD｜note]nmd_mw_mark_linkが大変詳しく、これでほぼ十分であるが、いくつか追加しておく。&lt;br /&gt;
&lt;br /&gt;
*Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると（アドオンと混同されて）「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。&lt;br /&gt;
*ファイルの自動命名は日本人だと苗字がLastNameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。&lt;br /&gt;
*コレクションごとにフォルダ分けしたい場合は、”Usesubfolderdefinedby”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする（この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける）。参考&amp;amp;#58;[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427Zoteroの使い方（我流、逐次更新）&amp;amp;#45;BagofMLWords]nmd_mw_mark_linkなど&lt;br /&gt;
&lt;br /&gt;
===ブラウザ拡張の使い方など===&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbeddedMetadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由せずに（ローカルにあるpdfを）入れるときは、ZoteroのウインドウにD&amp;amp;amp;D（このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される（移動になる））して取り込む。日本語論文などで文献情報がうまく読まれない場合は、ManualEntryを作成するしかない場合もあるが、J&amp;amp;#45;STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある（pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい）。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRenameAttachmentsをする必要がある。なお（最初のサイトで推奨されている通り）”&amp;lt;strong&amp;gt;サブコレクションからアイテムを表示&amp;lt;/strong&amp;gt;”がonだと特定コレクションの中身（サブコレクション内部を含め）すべてに対してRenameAttachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う（あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる）。なお、前述のようにクラウドストレージのフォルダをLocationofFilesに指定して同期している場合、RenameAttachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。&lt;br /&gt;
&lt;br /&gt;
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRenameandmoveを実行し、適宜ゴミ箱に移動して（アイテムを）削除し、DELETEフォルダの中身も定期的に削除する、とやっている。&lt;br /&gt;
&lt;br /&gt;
==dateデータのフォーマットについて==&lt;br /&gt;
&lt;br /&gt;
ZoteroConnectorはサイトやpdfから論文の投稿（掲載？）日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月22,2011」、英語であれば「April22,2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&amp;amp;#45;04&amp;amp;#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。&lt;br /&gt;
&lt;br /&gt;
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、BetterBibTeXの使用時に問題が発生していた（後述）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spanid=&amp;quot;better-bibtex-for-zotero&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==[https://retorque.re/zotero-better-bibtex/&amp;lt;strong&amp;gt;BetterBibTeXforZotero&amp;lt;/strong&amp;gt;]nmd_mw_mark_link==&lt;br /&gt;
&lt;br /&gt;
まずは普通に[https://retorque.re/zotero-better-bibtex/BetterBibTeXforZotero]nmd_mw_mark_linkからxpiをインストール、再起動すると再びdrag&amp;amp;#45;and&amp;amp;#45;dropを有効にするため再起動しろと言われるので再起動する。Citationkeyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0dZotero+BibTeXで参考文献の出力を自動化&amp;amp;amp;論文の引用で出てきた順にソートする]nmd_mw_mark_linkの通り、export→fieldsのfieldstoomitfromexportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/Zoteroでcitationkeysを設定する(zotero&amp;amp;#45;better&amp;amp;#45;bibtex)&amp;amp;#45;shoei05]nmd_mw_mark_linkの通りCitationkeysを&amp;amp;#91;auth&amp;amp;#58;lower&amp;amp;#93;&amp;amp;#91;year&amp;amp;#93;&amp;amp;#91;shorttitle1_1&amp;amp;#93;に変更する。&lt;br /&gt;
&lt;br /&gt;
Citationkeyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える（これは設定で無効にできる）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spanid=&amp;quot;日本語文献のcitation-keyについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
====日本語文献のCitationKeyについて====&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977https&amp;amp;#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]nmd_mw_mark_link&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spanid=&amp;quot;yearデータの不具合6760で修正済&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
====yearデータの不具合(&amp;lt;u&amp;gt;6.7.60で修正済&amp;lt;/u&amp;gt;)====&lt;br /&gt;
&lt;br /&gt;
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April22,2011」「2011&amp;amp;#45;04&amp;amp;#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月22,2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX（.bib）に出力されてしまう（報告済み&amp;amp;#58;[https://github.com/retorquere/zotero-better-bibtex/issues/2449&amp;amp;#91;Bug&amp;amp;#93;&amp;amp;#58;Japanesedateformatisnotparsedcorrectly·Issue&amp;amp;#35;2449·retorquere/zotero&amp;amp;#45;better&amp;amp;#45;bibtex]nmd_mw_mark_link、6.7.61あたりで修正済み）。←の通り、BetterBibTeXのエクスポート時に適用されるscript（Export→postscript）のところにデータを置換するための以下のようなコードを書いておくとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlightlang=&amp;quot;python&amp;quot;&amp;gt;vb.net&lt;br /&gt;
if(tex.has.year){&lt;br /&gt;
tex.add({name:&#039;year&#039;,replace:true,value:tex.has.year.value.replace(/.*/,&#039;&#039;)})&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
設定箇所はこんな感じ↓&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった（[https://github.com/retorquere/zotero-better-bibtex/issues/2447https://github.com/retorquere/zotero-better-bibtex/issues/2447]nmd_mw_mark_link）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spanid=&amp;quot;zotero-protocolを使用した操作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==ZoteroProtocolを使用した操作==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//&amp;lt;/code&amp;gt;という形式のURL（URIスキーム）を以下のように指定してZoteroを起動することができる（既に起動していた場合は、画面に変化が起こる）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlightlang=&amp;quot;python&amp;quot;&amp;gt;python&lt;br /&gt;
zotero.exe-url&amp;quot;zotero://url/here&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。&lt;br /&gt;
&lt;br /&gt;
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが[https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.jszotero/zotero&amp;amp;#45;protocol&amp;amp;#45;handler.jsatmaster·zotero/zotero]nmd_mw_mark_linkの&amp;lt;code&amp;gt;scopeObject&amp;lt;/code&amp;gt;などと書いてあるあたりをよく読むと、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//select/library/collections/&amp;amp;#123;collection_key&amp;amp;#125;/items/&amp;amp;#123;item_key&amp;amp;#125;&amp;lt;/code&amp;gt;という形式で指定すればよいことがわかる（groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである）。&amp;lt;code&amp;gt;collection_key&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;item_key&amp;lt;/code&amp;gt;はどちらも&amp;lt;code&amp;gt;1A2B3C4D&amp;lt;/code&amp;gt;のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ&amp;lt;strong&amp;gt;ID&amp;lt;/strong&amp;gt;も割り当てられているがこちらは1～3桁くらいの数字でありkeyとは別なので注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;spanid=&amp;quot;指定されたcitation-keyのアイテムをzoteroで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==指定されたCitationkeyのアイテムをZoteroで開く==&lt;br /&gt;
&lt;br /&gt;
前述の方法を応用して実装してみる。ここではCitationkeyとしてBetterBibTeXのものを使うことを仮定する。&lt;br /&gt;
&lt;br /&gt;
まず、Citationkeyからアイテムのキーを取得する部分を作る。CitationkeyはBetterBibTeXが管理しているので（ここではデフォルトの&amp;amp;#126;/Zoteroに各種データがあると仮定して）&amp;amp;#126;/Zotero/better&amp;amp;#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション（複数ある場合は最初のもの）のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。&lt;br /&gt;
&lt;br /&gt;
Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797SQLiteForum&amp;amp;#58;Optiontoopenadatabaseasread&amp;amp;#45;onlydespitelocked.]nmd_mw_mark_linkにある通り、（Windowsなら）&amp;lt;code&amp;gt;sqlite3&amp;amp;quot;file&amp;amp;#58;Zotero\\zotero.sqlite?mode&amp;amp;#61;ro&amp;amp;amp;nolock&amp;amp;#61;1&amp;amp;quot;&amp;lt;/code&amp;gt;のようにしてやると読み取り専用で開くことはできる（書き込まないのでこれで充分）。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。&lt;br /&gt;
&lt;br /&gt;
コード例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot;lang=&amp;quot;python&amp;quot;&amp;gt;python&lt;br /&gt;
importsqlite3&lt;br /&gt;
importsys&lt;br /&gt;
importjson&lt;br /&gt;
importsubprocess&lt;br /&gt;
db=sqlite3.connect(&#039;file:&#039;+sys.argv[1]+&#039;?mode=ro&amp;amp;nolock=1&#039;,uri=True)&lt;br /&gt;
cur=db.cursor()&lt;br /&gt;
cur.execute(&#039;SELECTdataFROM&amp;quot;better-bibtex&amp;quot;wherename=&amp;quot;better-bibtex.citekey&amp;quot;&#039;)&lt;br /&gt;
d=json.loads(cur.fetchone()[0])&lt;br /&gt;
mydict={}&lt;br /&gt;
foritemind[&amp;quot;data&amp;quot;]:&lt;br /&gt;
mydict[item[&amp;quot;citekey&amp;quot;]]=item[&amp;quot;itemKey&amp;quot;]&lt;br /&gt;
myKey=mydict[sys.argv[3]]&lt;br /&gt;
&lt;br /&gt;
db2=sqlite3.connect(&#039;file:&#039;+sys.argv[2]+&#039;?mode=ro&amp;amp;nolock=1&#039;,uri=True)&lt;br /&gt;
cur2=db2.cursor()&lt;br /&gt;
cur2.execute(&amp;quot;SELECTitemIDFROMitemsWHEREkey=?&amp;quot;,(myKey,))&lt;br /&gt;
item_id=cur2.fetchone()[0]&lt;br /&gt;
cur2.execute(&amp;quot;SELECTcollectionIDFROMcollectionItemsWHEREitemID=?&amp;quot;,(item_id,))&lt;br /&gt;
#所属する最初のコレクションIDを取得&lt;br /&gt;
collection_id=cur2.fetchone()[0]&lt;br /&gt;
#collectionIDからcollectionKeyを取得&lt;br /&gt;
cur2.execute(&amp;quot;SELECTkeyFROMcollectionsWHEREcollectionID=?&amp;quot;,(collection_id,))&lt;br /&gt;
collection_key=cur2.fetchone()[0]&lt;br /&gt;
print(collection_key)&lt;br /&gt;
subprocess.run(f&#039;&amp;quot;C:\ProgramFiles(x86)\Zotero\zotero.exe&amp;quot;-url&amp;quot;zotero://select/library/collections/{collection_key}/items/{myKey}&#039;)&lt;br /&gt;
db.close()&lt;br /&gt;
db2.close()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;divstyle=&#039;text-align:center;&#039;&amp;gt;zoto.py&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記コードは以下のように起動できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlightlang=&amp;quot;python&amp;quot;&amp;gt;c#&lt;br /&gt;
python&amp;quot;path\to\zoto.py&amp;quot;&amp;quot;%USERPROFILE%\Zotero\better-bibtex.sqlite&amp;quot;&amp;quot;%USERPROFILE%\Zotero\zotero.sqlite&amp;quot;%1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*[[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]nmd_mw_mark_linkと組み合わせれば、選択文字列をCitationkeyとするアイテムを一発で開くことも可能。&lt;br /&gt;
&lt;br /&gt;
==その他==&lt;br /&gt;
&lt;br /&gt;
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}}-Turgenev&#039;sWiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=AFDKO%E3%81%AB%E3%82%88%E3%82%8BOpenType%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90&amp;diff=324</id>
		<title>AFDKOによるOpenTypeフォントの作成</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=AFDKO%E3%81%AB%E3%82%88%E3%82%8BOpenType%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90&amp;diff=324"/>
		<updated>2025-04-02T08:37:58Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;筆者は[https://github.com/adobe-type-tools/afdko &amp;lt;strong&amp;gt;Adobe Font Development Kit for OpenType (AFDKO)&amp;lt;/strong&amp;gt;]を用いて、[https://github.com/ge9/NazonoMincho 謎乃明朝]というフォントを作成し公開している。謎乃明朝は[http://fonts.jp/hanazono/ 花園フォント]と同じく[https://glyphwiki.org/wiki/GlyphWiki:%e3%83%a1%e3%82%a4%e3%83%b3%e3%83%9a%e3%83%bc%e3%82%b8 GlyphWiki]のデータをもとにしている完全フリーのフォントであるが、GlyphWikiデータからの漢字のパスデータの生成においてオリジナルの[https://github.com/kamichikoichi/kage-engine KAGEエンジン]を[https://github.com/ge9/kage-engine-2 改変したもの]を使用している。&lt;br /&gt;
&lt;br /&gt;
改変エンジンのget_sub_path_svg_fontという関数を使用すると、&amp;amp;#91;0 &amp;amp;#45;120 1000 880&amp;amp;#93;をバウンディングボックスとしたときに適切に表示されるようなパスがSVG形式で出力される。この記事ではそこから先のプロセスについて解説する。&lt;br /&gt;
&lt;br /&gt;
他に全体を通して参考になるサイトとしては以下がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://shiromoji.hatenablog.jp/entry/20111206/1323270030 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 前篇：AFDKOのインストールとmergeFonts &amp;amp;#45; しろもじメモランダム]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;一通りのことが書いてある読みやすい日本語の記事はこれくらいである。筆者もこれを参考にした。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://ccjktype.fonts.adobe.com/wp-content/uploads/2012/06/afdko-lunde-20120625.pdf https&amp;amp;#58;//ccjktype.fonts.adobe.com/wp&amp;amp;#45;content/uploads/2012/06/afdko&amp;amp;#45;lunde&amp;amp;#45;20120625.pdf]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ワークショップで使用した講義資料なので単体だとやや読みづらいが、ヒント情報の付加に関して唯一まともに書いてあった。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://aznote.jakou.com/prog/opentype/index.html OpenType フォント・フォーマット]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;OpenTypeの仕様が日本語で記述されている。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;パスの統合単純化&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== パスの統合・単純化 ==&lt;br /&gt;
&lt;br /&gt;
これはAFDKOには関係ないが割と役に立つ話なのでついでに記載する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;inkscapeによる統合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Inkscapeによる統合 ===&lt;br /&gt;
&lt;br /&gt;
改造エンジンで生成した漢字パスデータはそれぞれの画が別々のサブパスで表現されており、互いに重複する部分がある。これをそのままフォントに使うこともできるが、画が交差する場所（「田」の中央とか）で白い抜けが表示されてしまうなど不具合が生じる場合がある。そこで、重複がなくなるようにパス同士のUnionを取る（統合する）必要がある。&lt;br /&gt;
&lt;br /&gt;
この目的で本家の花園明朝では[https://github.com/AngusJohnson/Clipper2 Clipper]が使われているが、こちらはどうやら直線のみ対応で、ベジェ曲線は扱えないようである。ベジェ曲線にも使えるフリーのものはFontforgeとInkscapeがあるがFontforgeは色々と不安定なのでInkscapeを使う。&lt;br /&gt;
&lt;br /&gt;
* Fontforgeは一応試したが、閉じていないパスが発生する不具合が頻発するのと、GUIだと途中で落ちる。ところで、謎乃明朝にissue([https://github.com/ge9/NazonoMincho/issues/2 https://github.com/ge9/NazonoMincho/issues/2])が立ったが、KAGEデータの「曲げ」ストロークにおいてInkscapeの統合によって図形が消えるバグが発生していた（[https://gitlab.com/inkscape/inbox/-/issues/6886 https://gitlab.com/inkscape/inbox/-/issues/6886] に報告済）（謎乃明朝側ではストロークの図形をあらかじめ統合された状態で生成することで回避して対応済）。Inkscapeも完璧ではないようである。&lt;br /&gt;
&lt;br /&gt;
コマンドとしては&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;inkscape --actions=&amp;quot;select-all;path-union&amp;quot; --export-type=svg input.svg&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
などとすると、input_out.svgが出力される。&lt;br /&gt;
&lt;br /&gt;
ワイルドカード&amp;lt;code&amp;gt;&amp;amp;#42;.svg&amp;lt;/code&amp;gt;も使えるが、謎乃明朝のビルド時はかなり大量のファイルを処理するために「コマンドライン引数が長すぎる」的なことを言われてしまうのでxargsを使った（自動で分割してくれる）。&lt;br /&gt;
&lt;br /&gt;
個々のsvgファイルとして処理する（出力ファイルを逐一新規作成する）ためIOが頻発して効率はあまりよくない（謎乃明朝の数万グリフに対して実行すると数十分かかる）のだが、入力ファイル単位で分ける以外で複数のパスデータをバッチ処理で統合する（例えばsvgの”path”タグごと処理するなど）方法があるのかどうかはわからなかった。分かったら誰か教えてください。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontforgeによる単純化&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Fontforgeによる単純化 ===&lt;br /&gt;
&lt;br /&gt;
統合を行うと、（KAGEエンジン側のデザインの都合もあり）完全な直線になるべき部分が微妙な誤差のせいでほぼ直線と変わらない微妙な折れ線になってしまうことがある。また、極めて短く直線に近似できるのにベジェ曲線で表現されてしまう場合もある。こうした箇所はデータ削減やヒント（後述）の品質向上のために制御点を除いて単純化（simplify）したい。&lt;br /&gt;
&lt;br /&gt;
Inkscapeにも単純化はあるのだが、やってみたところ、単純化を行うと逆に曲線部分では無駄な制御点が挿入されてしまうというバグ（[https://gitlab.com/inkscape/inbox/-/issues/8096 報告済み]→[https://gitlab.com/inkscape/inkscape/-/issues/4419 こちら]に移動）があったので今回はスキップ。単純化に関してはFontforgeのほうが良さそうである。&lt;br /&gt;
&lt;br /&gt;
FontforgeはSVGフォント（＝単一ファイルに複数のパスを入れられる）に対応しているので、先ほどInkscapeが出力したファイルを一つにまとめてからFontforgeに入力して全グリフをSimplifyするという流れになる。あとFontforgeのGUIは割と不安定（特にWindows版）なので、対象が1000個を超えるような場合はスクリプトを組んでCUIで実行することを強く推奨する。&lt;br /&gt;
&lt;br /&gt;
例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;Open($argv[1])&lt;br /&gt;
SelectAll()&lt;br /&gt;
Simplify(128+32+8, 1.1)&lt;br /&gt;
Generate($argv[2])&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 手元では「NaN value in spline creation」というエラーが漢字10000字につき1.5文字くらいの割合で出るのだが、該当文字を見ても特に問題はなさそうだったので放置している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;afdkoでのフォント作成-&amp;amp;#45;-基本&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== AFDKOでのフォント作成 &amp;amp;#45; 基本 ==&lt;br /&gt;
&lt;br /&gt;
基本的には&lt;br /&gt;
&lt;br /&gt;
素材フォント→（適宜txなどで変換した上でmergefonts）→ヒント情報無しのCIDフォント→（[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl perl&amp;amp;#45;scripts/hintcidfont.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts] と psautohintによるヒント情報の付加）→ヒント情報付きのCIDフォント→（makeotf）→完成品の（CIDキー方式の）OpenTypeフォント&lt;br /&gt;
&lt;br /&gt;
という流れになる。&lt;br /&gt;
&lt;br /&gt;
「CIDフォント」「PostScriptフォント」「CFFフォント」「Type1フォント」「OpenTypeフォント」など様々な用語があるが、いずれも正確な定義が難しいものばかりであり筆者も正確に理解しているわけではないのでそこは注意して読み進めていただきたい。今回作るものは「CIDキー方式のOpenTypeフォント（CID&amp;amp;#45;keyed OpenType Font）」だが、おそらくCFFフォントでもあり、PostScriptフォントでもあるのではないかと思われる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txで使えるsvgデータ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== txで使えるSVGデータ ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;まず、単体のSVGではフォントとして正しくtxに認識されないので、SVGフォントの形にする必要がある。具体的には、&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;lt;font&amp;amp;gt;タグが最も外側にある状態&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;にする。「SVGフォント」といったときには（例えばFontforgeでフォントとして開く場合）さらに外側に&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;…&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;のようなタグが必要になる場合もあるが、これだとtxには弾かれるので注意が必要である。&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（2023/12/21追記）&amp;lt;strong&amp;gt;改めて試したところ、&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;で囲っても問題なく動いた&amp;lt;/strong&amp;gt;。ただ、FontForgeが出力するSVGフォントのヘッダーの&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE svg PUBLIC &amp;quot;-//W3C//DTD SVG 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&amp;quot; &amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;があると動かなかったので、上記の内容はおそらくそれを勘違いしたものと思われる。なお、このヘッダがなくてもFontForgeは正しくSVGフォントを開けるが、&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;がないと開けないので、&amp;lt;code&amp;gt;&amp;amp;lt;svg&amp;amp;gt;&amp;amp;lt;defs&amp;amp;gt;...&amp;amp;lt;/defs&amp;amp;gt;&amp;amp;lt;/svg&amp;amp;gt;&amp;lt;/code&amp;gt;は付けてヘッダーは無しで保存しておくのが最も良さそうである。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;txのエラーメッセージは全体的にあまり丁寧ではなく、例えば入力のsvgに何かおかしい点（※ただしtxによる主観的評価）がある場合は&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;などとしか表示してくれない。デバッグモードもなさそうなので、根気強く原因を探すしかない。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;のような形式の出力については、おそらく最初の二文字（ここでは&amp;lt;code&amp;gt;sv&amp;lt;/code&amp;gt;&amp;amp;#61;svgだが、&amp;lt;code&amp;gt;cf&amp;lt;/code&amp;gt;&amp;amp;#61;cffなどもある）がフォーマットを表し、最後の一文字は&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;がerror、&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;がwarningを表すようである。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;そもそもAFDKO自体に「Adobe社内の業務用ツールが形だけ一般公開されている」ような雰囲気を感じなくもないような…&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
例えば以下は正しくtxに認識される入力のsvgである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;font horiz-adv-x=&amp;quot;1000&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;font-face &lt;br /&gt;
    font-family=&amp;quot;Untitled1&amp;quot;&lt;br /&gt;
    font-weight=&amp;quot;400&amp;quot;&lt;br /&gt;
    font-stretch=&amp;quot;normal&amp;quot;&lt;br /&gt;
    units-per-em=&amp;quot;1000&amp;quot;&lt;br /&gt;
    ascent=&amp;quot;880&amp;quot;&lt;br /&gt;
    descent=&amp;quot;-120&amp;quot;&lt;br /&gt;
    bbox=&amp;quot;0 0 1000 1000&amp;quot;&lt;br /&gt;
    underline-thickness=&amp;quot;50&amp;quot;&lt;br /&gt;
    underline-position=&amp;quot;-100&amp;quot;&lt;br /&gt;
  /&amp;gt;&lt;br /&gt;
&amp;lt;missing-glyph horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;M500 300l150 -300l-300 0zM650 760l-150 -300l-150 300l300 0zM730 760l0 -760l-190 380zM270 760l190 -380l-190 -380l0 760zM200 830l0 -900l600 0l0 900l-600 0z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;0&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;m-100,-100l100,0L0,100C0,200 200,0 200,200 m100,200 c 300,0 0,300 300,300 Zm-150,-150 c 200,100 -100,0 0,100 l-300,-200  l100,200 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;S&amp;quot; horiz-adv-x=&amp;quot;500&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph unicode=&amp;quot;D&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;system.svg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
今回はsvgを素材としてのみ使用する（フォント名などは後で設定する）のでfont&amp;amp;#45;faceタグの中身はあまり気にしなくてよいと思うが、フォントの高さ範囲を決める&amp;lt;code&amp;gt;ascent&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;descent&amp;lt;/code&amp;gt;は一応正しい値を入力してある。OpenTypeでは通常このようにフォントの高さは1000とする。&lt;br /&gt;
&lt;br /&gt;
以降がフォント本体のデータで、パス（d属性）と水平方向の幅（horiz&amp;amp;#45;adv&amp;amp;#45;x属性）をそれぞれ指定する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;missing&amp;amp;#45;glyph&amp;lt;/code&amp;gt;は普通のフォント用語でいうと&amp;lt;code&amp;gt;.notdef&amp;lt;/code&amp;gt;にあたるもので、文字が無かった時に表示されるいわゆる「豆腐」のことである。他のフォント形式に変換するとこのグリフが&amp;lt;code&amp;gt;.notdef&amp;lt;/code&amp;gt;に割り当てられることになる。このsvgではU+303F（〿、□の中に×が入った形）のような図形が入っている。&lt;br /&gt;
&lt;br /&gt;
それ以降のglyphタグではunicode属性によりどの文字を使用するかを設定している。&amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt;のようにd属性がない場合は空白（スペース）を表すことになる（逆にd&amp;amp;#61;””などと書くとエラーになったはず）。幅を見ればわかる通り、Sが半角スペース、Dが全角スペースである。&lt;br /&gt;
&lt;br /&gt;
==== d属性の解釈について ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
txによるd属性の解釈は&amp;lt;strong&amp;gt;ものすごく行儀が悪く&amp;lt;/strong&amp;gt;、エラーメッセージを出さない割に明らかに仕様を満たさない挙動を連発する。&lt;br /&gt;
&lt;br /&gt;
* txの挙動を迅速に確かめるには、&amp;lt;code&amp;gt;tx &amp;amp;#45;pdf input.svg &amp;amp;gt; output.pdf&amp;lt;/code&amp;gt;とpdfに変換して見るのがよい。&lt;br /&gt;
* 以下の不具合に関する具体的な報告はなさそうであるが、[https://github.com/adobe-type-tools/afdko/issues/1567 &amp;amp;#91;tx/SVG&amp;amp;#93; Replace homemade XML parser with LibXML2 for SVG parsing · Issue &amp;amp;#35;1567 · adobe&amp;amp;#45;type&amp;amp;#45;tools/afdko]は関係がありそうなのでこれがfixされれば治る可能性がある。&lt;br /&gt;
&lt;br /&gt;
txの1.3.0（2023年1月現在で多分最新）に関して挙動をまとめる。&lt;br /&gt;
&lt;br /&gt;
まず、正しく解釈できると思われるのは以下の命令である。&lt;br /&gt;
&lt;br /&gt;
* M（絶対座標によるパス開始点の指定）&lt;br /&gt;
* L（絶対座標による直線描画）&lt;br /&gt;
* l（相対座標による直線描画）&lt;br /&gt;
* C（絶対座標による3次ベジェ曲線描画）&lt;br /&gt;
* z, Z（パスを閉じる）&lt;br /&gt;
&lt;br /&gt;
問題なのはc（相対座標による3次ベジェ曲線）で、本来は現在の点が(x, y)であるときに&amp;lt;code&amp;gt;c x1,y1 x2,y2 x3,y3&amp;lt;/code&amp;gt;とすると(x, y)→(x+x1, y+y1)→(x+x2, y+y2)→(x+x3, y+y3)という3次ベジェ曲線が描画されるべきであるが、txでは(x,y) → (x+x1, y+y1) → (x+x1+x2, y+y1+y2) → (x+x1+x2+x3, y+y1+y2+y3) という意味に解釈される。&lt;br /&gt;
&lt;br /&gt;
似たような問題として、パスの開始点（最初やzの直後で使用する）でm（相対座標指定）を使用する場合は、本来は絶対座標として解釈されるべきであるが、txでは直前の座標（zの直前）からの相対位置で計算される。なお、フォントの描画においては必ず閉じたパスを使用する（多分）のでパスの描画途中でMやmを使用することはありえないが、仮に使用した場合、（txでは）その直前にzを付加したのと同じ挙動をするようである。&lt;br /&gt;
&lt;br /&gt;
そして、以下には対応していない。&lt;br /&gt;
&lt;br /&gt;
* V, v, H, h（絶対/相対座標による垂直/水平な直線の描画）&lt;br /&gt;
* Q, q（絶対/相対座標による2次ベジェ曲線描画）&lt;br /&gt;
&lt;br /&gt;
これらはそれぞれL, lとC, cに容易に変換できるので、そのようにしてから渡すべきである。&lt;br /&gt;
&lt;br /&gt;
さらに、svgではデータ量の圧縮のため直前と同じ命令を使用する場合は&amp;lt;code&amp;gt;l 100,100 l 200,200&amp;lt;/code&amp;gt;と書くかわりに&amp;lt;code&amp;gt;l 100,100 200,200&amp;lt;/code&amp;gt;などと略することができるがこれにも対応していない（余ったパラメータは余計なものとして無視される）。&lt;br /&gt;
&lt;br /&gt;
また、svgの仕様では座標データの数字において指数表現（1.2345e&amp;amp;#45;6のような）が許容されているが、これにも対応していない（&amp;lt;code&amp;gt;(svr)&amp;lt;/code&amp;gt;となる）。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝で使用したsvgに関しては、元データでM,C,Lのみ使っていたおかげかinkscapeの出力でもそれら以外が入ることはないようだったが、指数表現に関してはごく稀に（謎乃明朝全体でも10個以下程度）紛れ込んでいたので&amp;lt;code&amp;gt;sed &amp;amp;#45;r &amp;amp;quot;s/ &amp;amp;#45;?&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;\.&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;&amp;amp;#42;e&amp;amp;#45;&amp;amp;#91;0&amp;amp;#45;9&amp;amp;#93;+ / 0 /g&amp;amp;quot;&amp;lt;/code&amp;gt;で0に変えた。小数に直すのが筋かもしれないが、OpenTypeではそもそも座標が整数に丸められる気がするのでこれでいいはず。&lt;br /&gt;
&lt;br /&gt;
* Inkscapeが相対座標を使用するかどうかは設定で変えられるらしい。参考&amp;amp;#58; [https://stackoverflow.com/questions/6890685/is-there-a-tool-to-convert-svg-line-paths-from-absolute-to-relative Is there a tool to convert SVG line paths from absolute to relative? &amp;amp;#45; Stack Overflow]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontforgeの出力の修正&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== FontForgeの出力の修正 ====&lt;br /&gt;
&lt;br /&gt;
FontForgeで出力されるsvgには&amp;lt;code&amp;gt;l&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;に加えて&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;v&amp;lt;/code&amp;gt;なども（元データになくても）入ることがあり、これはtxが読めないので修正する。あとtxには関係ないが、PostScriptアウトラインの向きはFontForgeが出力するSVGのアウトラインの向き（＝TrueTypeのアウトラインの向き）と逆なので、この段階で修正しておくとよい。この2点の修正は謎乃明朝の生成スクリプトでは[https://github.com/thednp/svg-path-commander https://github.com/thednp/svg-path-commander]にやらせている。&lt;br /&gt;
&lt;br /&gt;
== txによる変換 ==&lt;br /&gt;
&lt;br /&gt;
この次で使用するmergefontsは、複数のフォントをマージするコマンドであるが、より正確には「親」となるフォントに「子」となるフォントを統合するコマンドである（ヘルプにも書いてある）。上記のようなsvg形式のフォントは「子」にはなれるが「親」にはなれない。&lt;br /&gt;
&lt;br /&gt;
そこでtxコマンド（fonttoolsのttxと名前が似ているが全く異なるものなので注意）を用いてsvgを「親」として使えるフォーマットに変換する。この際の出力は、&amp;lt;code&amp;gt;&amp;amp;#45;ps&amp;lt;/code&amp;gt;(PostScript形式)、&amp;lt;code&amp;gt;&amp;amp;#45;cff&amp;lt;/code&amp;gt;(CFF形式）、&amp;lt;code&amp;gt;&amp;amp;#45;t1&amp;lt;/code&amp;gt;(Type1形式)などいくつかのオプションが選べるが、&amp;lt;strong&amp;gt;psautohintでヒントを付ける方法を筆者が発見できたのは&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;t1&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;を使った場合のみ&amp;lt;/strong&amp;gt;であった。ヒントを付けないのであれば&amp;amp;#45;cffでも問題なくこの記事の最後まで進むことができる。&amp;amp;#45;psも&amp;amp;#45;cffと同じだったと思う。&lt;br /&gt;
&lt;br /&gt;
ちなみにmergefontsは子としてsvgが指定された場合にはそれを読むために内部的にtxを使用するため、子にしても親にしてもtxが読めるsvgを指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝では、.notdefや空白など一部のシステムグリフ的なものだけを含むsvg（上記のsystem.svg）を親フォントとしてまずType1形式に変換したあと、子フォントとして漢字グリフを統合することにしている。&lt;br /&gt;
&lt;br /&gt;
従ってコマンドとしては以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;tx -t1 system.svg &amp;gt; system.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
参考までに、system.pfaの最初のほうは以下のようになっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;%!FontType1-1.1: Untitled1&lt;br /&gt;
%ADOt1write: (1.0.35)&lt;br /&gt;
%%Copyright: Copyright 2023 Adobe System Incorporated. All rights reserved.&lt;br /&gt;
%%BeginResource: font Untitled1&lt;br /&gt;
12 dict dup begin&lt;br /&gt;
/FontType 1 def&lt;br /&gt;
/FontName /Untitled1 def&lt;br /&gt;
/FontInfo 4 dict dup begin&lt;br /&gt;
/FullName (Untitled1) def&lt;br /&gt;
end def&lt;br /&gt;
/PaintType 0 def&lt;br /&gt;
/FontMatrix [0.001 0 0 0.001 0 0] def&lt;br /&gt;
/Encoding 256 array&lt;br /&gt;
0 1 255 {1 index exch /.notdef put} for&lt;br /&gt;
def&lt;br /&gt;
/FontBBox {-100 -100 950 1050} def&lt;br /&gt;
end&lt;br /&gt;
currentfile eexec BAB431EA06BB0A1031E1AA11919E714AC6968FC4C8AFEB&lt;br /&gt;
5F1C717DAFACA48FA00303519D5ACA187D3A7A07245E6211EF0746489B63BDB8&lt;br /&gt;
0250FD69171FFE98581843A94F9CCED81A25205CD6D774793B21300079565F0A&lt;br /&gt;
...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== mergefonts ==&lt;br /&gt;
&lt;br /&gt;
次にmergefontsを使ってCIDフォントを作る。CIDフォントを作る場合は、コマンドの構文は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts -cid [cidfontinfo] [output] [font1.map] [font1] [font2.map] [font2] ...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
cidfontinfoはフォントに関していくつかの情報を設定するファイルで、今回は以下のものを使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;FontName       (NazoMin)&lt;br /&gt;
FullName       (NazoMin Unknown)&lt;br /&gt;
FamilyName     (NazoMin)&lt;br /&gt;
Weight         (Unknown)&lt;br /&gt;
version        (1.000)&lt;br /&gt;
Registry       (Adobe)&lt;br /&gt;
Ordering       (Identity)&lt;br /&gt;
Supplement     0&lt;br /&gt;
AdobeCopyright (Public Domain)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
細かい部分の効果はわからないが（詳しくは[https://shiromoji.hatenablog.jp/entry/20111206/1323270030 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 前篇：AFDKOのインストールとmergeFonts &amp;amp;#45; しろもじメモランダム]）、とりあえずこれで問題なく先に進めるだろう。FontName（&amp;lt;strong&amp;gt;Postscript名&amp;lt;/strong&amp;gt;）の「NazoMin」の部分は後で使用するので覚えておくこと。FullNameとFamilyNameについては最終的にどのように反映されるのかよくわかっていない。&lt;br /&gt;
&lt;br /&gt;
* Postscript名は、フォントの名前の一種であるが、あまりユーザーが目にすることはない。Postscript名では、空白を使用してはいけない。たとえば[https://github.com/adobe-fonts/source-han-code-jp/blob/master/Normal/cidfontinfo source&amp;amp;#45;han&amp;amp;#45;code&amp;amp;#45;jp/cidfontinfo at master · adobe&amp;amp;#45;fonts/source&amp;amp;#45;han&amp;amp;#45;code&amp;amp;#45;jp]のようにハイフンに置き換えられていることが多い。また、「+」は禁止ではないようだが、今回使用するhintcidfont.plは対応していない。フォント名に「+」が入っている代表的なフォントである「M+フォント」の一種[https://fonts2u.com/m-2m-regular.font M+ 2m regular font]においても、Postscript名は「mplus」となっているようである。&lt;br /&gt;
&lt;br /&gt;
outputで指定するファイル名は何でもいいが、そのままではまだ使えない「生」のCIDフォントということで「.raw」という拡張子を使う場合もあるようである。今回であればType 1が出力されるので.pfaとしてもよいだろう。&lt;br /&gt;
&lt;br /&gt;
==== mapファイルと素材フォント ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
では、残るmapファイルと素材フォントの部分について解説する。三点リーダ&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;で示した通り、この&amp;lt;code&amp;gt;&amp;amp;#91;font1.map&amp;amp;#93; &amp;amp;#91;font1&amp;amp;#93;&amp;lt;/code&amp;gt;のペアはいくらでも多く指定してよい。この部分がフォントの本体部分を形作ることになる。&lt;br /&gt;
&lt;br /&gt;
最初のペアとして指定されたものが前述の「親フォント」ということになる。ここにType1フォントを指定すれば出力もType1になるし、CFFフォントを指定すればCFFになる。&lt;br /&gt;
&lt;br /&gt;
今回は親フォントとして先ほどのsystem.pfaを使用する。&lt;br /&gt;
&lt;br /&gt;
以下がそれに対応するmapファイルの例（system.map）である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts NazoMin-System&lt;br /&gt;
0 .notdef&lt;br /&gt;
1 S&lt;br /&gt;
633 D&lt;br /&gt;
8720 S&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;system.map&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ファイルの最初にはこのようにmergeFontsという語が必要であり、その後にFDArray要素（この用語は後のヒント情報付加のところでまた出てくる）の名前を書く。&amp;lt;strong&amp;gt;ここではcidfontinfoで使用した&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NazoMin&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という（任意の）識別子にハイフンを付加してさらに別の（後でも使用する任意の）識別子である&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;を追加した&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NazoMin&amp;amp;#45;System&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という名前を指定している。このようにしないと、ヒント情報を付加するスクリプトである&amp;lt;/strong&amp;gt;[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl &amp;lt;strong&amp;gt;https&amp;amp;#58;//github.com/adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts/blob/master/hintcidfont.pl&amp;lt;/strong&amp;gt;]&amp;lt;strong&amp;gt;が正しく使えない&amp;lt;/strong&amp;gt;。これはどこを見てもあまりはっきりとは書かれおらず、最終的にスクリプトのソースを読んでわかったことなので注意が必要である（スクリプトの説明をよく読むと一応「the CIDFontName plus a unique identifier」などと書いてあるのだが、ハイフンを間に入れるという説明は全くない）。ただし、これはそうしないとこのスクリプトが使えないというだけであって、CIDフォントの仕様上必要というわけではない（多分）。ただ実際、多くのCIDフォント（例えば源ノ角ゴシックなど）ではこのような命名がされている気がする。&lt;br /&gt;
&lt;br /&gt;
2行目以降が、CIDからグリフへの対応を記述したものである。&lt;br /&gt;
&lt;br /&gt;
* 以下のように、x番目のCIDという意味で「CID+x」と書くことが多い&lt;br /&gt;
&lt;br /&gt;
まず2行目で、CID+0に先ほどのSVGのmissing&amp;amp;#45;glyphが割り当てられる。CIDフォント（少なくともCID形式のOpenTypeフォント？）ではCID+0は必ず含める必要があり、これが「豆腐」グリフとなる。&lt;br /&gt;
&lt;br /&gt;
3&amp;amp;#45;5行目により、CID+1とCID+8720には半角スペース（ただし後者は縦書き用として使用する。後のmakeotfの節も参照）、CID+633に全角スペースが割り当てられる。これは[https://github.com/adobe-type-tools/Adobe-Japan1 Adobe&amp;amp;#45;Japan1]に従ったものであるが、Adobe&amp;amp;#45;Japan1準拠のフォントを作るのでなければ（CID+0とは違って）必ずしもこのようにする必要はないはず。ただ、（現在はリンク切れとなっているのでweb archiveのURLを貼るが）[http://web.archive.org/web/20130225051414/http://d.hatena.ne.jp/mashabow/20120306/1331028598 花園明朝OTを0.510に更新、IVD 2012&amp;amp;#45;03&amp;amp;#45;02版に対応 &amp;amp;#45; しろもじメモランダム]において、「Windowsでは、CFFアウトラインのOpenTypeフォントのGSUBテーブルにvrt2 featureが定義されていないのにvhea/vmtxテーブルがあると、OSに不正なフォントして弾かれます。」との情報があり、[http://web.archive.org/web/20161115085209/http://shiromoji.net/font/HanaMinOT/ 花園明朝OT]ではこれに対応するためにこの3グリフを追加したとされている。そこで謎乃明朝でも一応この通りにしている（ただし謎乃明朝+では漢字と範囲を分けるためにCIDの割り当てを1, 633, 8720からそれぞれ1, 100, 101に変えている）。&lt;br /&gt;
&lt;br /&gt;
このファイルを見てわかる通り、ソースフォントの同じ文字を複数のCIDで使用しても構わない（その分データは増えるはず）（[https://github.com/adobe-type-tools/Adobe-Japan1/blob/master/README-JP.md Adobe&amp;amp;#45;Japan1/README&amp;amp;#45;JP.md at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/Adobe&amp;amp;#45;Japan1] の 「重複した漢字グリフ」もその一例）。CIDの部分は0000,00001のように先頭にいくつか0が付いていても構わない。&lt;br /&gt;
&lt;br /&gt;
次に、「子」として使用するmapファイルとSVGファイル（今回は子は1つだけなので1つずつ）をそれぞれ見てみよう。謎乃明朝には数万文字の漢字が収録されているが、ここでは解説に適した6グリフのみ収録したサンプルを使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;mergeFonts NazoMin-Ideographs&lt;br /&gt;
14197 u8279-j&lt;br /&gt;
14198 ufa5e&lt;br /&gt;
14199 ufa5d&lt;br /&gt;
24000 u20000-jv&lt;br /&gt;
24001 u20000-ue0101&lt;br /&gt;
24002 u20000-ue0102&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;kanjisample.map&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;font id=&amp;quot;Untitled1&amp;quot; horiz-adv-x=&amp;quot;1000&amp;quot; &amp;gt;&lt;br /&gt;
  &amp;lt;font-face &lt;br /&gt;
    font-family=&amp;quot;Untitled1&amp;quot;&lt;br /&gt;
    font-weight=&amp;quot;400&amp;quot;&lt;br /&gt;
    font-stretch=&amp;quot;normal&amp;quot;&lt;br /&gt;
    units-per-em=&amp;quot;1000&amp;quot;&lt;br /&gt;
    ascent=&amp;quot;880&amp;quot;&lt;br /&gt;
    descent=&amp;quot;-120&amp;quot;&lt;br /&gt;
    bbox=&amp;quot;0 0 1000 1000&amp;quot;&lt;br /&gt;
    underline-thickness=&amp;quot;50&amp;quot;&lt;br /&gt;
    underline-position=&amp;quot;-100&amp;quot;&lt;br /&gt;
  /&amp;gt;&lt;br /&gt;
&amp;lt;missing-glyph horiz-adv-x=&amp;quot;1000&amp;quot; d=&amp;quot;M50,0l900,0l0,533l-900,0 z M100,50l0,433l800,0l0,-433z&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u8279-j&amp;quot; d=&amp;quot;M 321.5 247.15039 L 321.5 411.21289 L 43.25 411.21289 L 43.25 436.41211 L 321.5 436.41211 L 321.5 562.9375 L 321.5 578.6875 L 321.5 600.38867 L 383.93359 588.48633 C 415.96232 582.32437 417.82989 565.93743 384.5 555.52148 L 384.5 436.41211 L 615.5 436.41211 L 615.5 562.9375 L 615.5 578.6875 L 615.5 600.38867 L 677.93359 588.48633 C 709.96232 582.32437 711.82989 565.93743 678.5 555.52148 L 678.5 436.41211 L 843.34961 436.41211 L 893.75 486.8125 L 956.75 436.41211 L 956.75 411.21289 L 678.5 411.21289 L 678.5 272.34961 L 615.5 247.15039 L 615.5 411.21289 L 384.5 411.21289 L 384.5 272.34961 L 321.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;ufa5e&amp;quot; d=&amp;quot;M 279.5 247.15039 L 279.5 411.21289 L 43.25 411.21289 L 43.25 436.41211 L 279.5 436.41211 L 279.5 562.9375 L 279.5 578.6875 L 279.5 600.38867 L 341.93359 588.48633 C 373.96232 582.32437 375.82989 565.93743 342.5 555.52148 L 342.5 436.41211 L 360.34961 436.41211 L 410.75 486.8125 L 473.75 436.41211 L 473.75 411.21289 L 342.5 411.21289 L 342.5 272.34961 L 279.5 247.15039 z M 657.5 247.15039 L 657.5 411.21289 L 526.25 411.21289 L 526.25 436.41211 L 657.5 436.41211 L 657.5 562.9375 L 657.5 578.6875 L 657.5 600.38867 L 719.93359 588.48633 C 751.96232 582.32437 753.82989 565.93743 720.5 555.52148 L 720.5 436.41211 L 843.34961 436.41211 L 893.75 486.8125 L 956.75 436.41211 L 956.75 411.21289 L 720.5 411.21289 L 720.5 272.34961 L 657.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;ufa5d&amp;quot; d=&amp;quot;M 342.5 247.15039 L 342.5 415.15039 L 43.25 415.15039 L 43.25 440.34961 L 342.5 440.34961 L 342.5 564.25 L 342.5 580 L 342.5 601.70117 L 404.93359 589.79883 C 436.96232 583.63687 438.82989 567.24993 405.5 556.83398 L 405.5 272.34961 L 342.5 247.15039 z M 594.5 247.15039 L 594.5 564.25 L 594.5 580 L 594.5 601.70117 L 656.93359 589.79883 C 688.96232 583.63687 690.82989 567.24993 657.5 556.83398 L 657.5 440.34961 L 843.34961 440.34961 L 893.75 490.75 L 956.75 440.34961 L 956.75 415.15039 L 657.5 415.15039 L 657.5 272.34961 L 594.5 247.15039 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-jv&amp;quot; d=&amp;quot;M 143 -31.099609 L 143 480.25 L 201.80078 450.84961 L 473.75 450.84961 L 473.75 756.40039 L 80 756.40039 L 80 781.59961 L 806.59961 781.59961 L 857 832 L 920 781.59961 L 920 756.40039 L 536.75 756.40039 L 536.75 385.75 L 473.75 360.55078 L 473.75 425.65039 L 206 425.65039 L 206 57.099609 L 775.09961 57.099609 L 825.5 107.5 L 888.5 57.099609 L 888.5 31.900391 L 206 31.900391 L 206 -5.9003906 L 143 -31.099609 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-ue0101&amp;quot; d=&amp;quot;M 143 -36.349609 L 143 417.25 L 201.80078 387.84961 L 468.5 387.84961 L 468.5 640.90039 L 80 640.90039 L 80 666.09961 L 468.5 666.09961 L 468.5 805.75 L 468.5 821.5 L 468.5 843.20117 L 530.93359 831.29883 C 562.86375 825.15583 564.51051 808.89709 531.5 798.47656 L 531.5 666.09961 L 806.59961 666.09961 L 857 716.5 L 920 666.09961 L 920 640.90039 L 531.5 640.90039 L 531.5 322.75 L 468.5 297.55078 L 468.5 362.65039 L 206 362.65039 L 206 51.849609 L 780.34961 51.849609 L 830.75 102.25 L 893.75 51.849609 L 893.75 26.650391 L 206 26.650391 L 206 -11.150391 L 143 -36.349609 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;glyph glyph-name=&amp;quot;u20000-ue0102&amp;quot; d=&amp;quot;M 143 -43.123047 L 143 395.38281 L 201.79688 365.98438 L 473.75 365.98438 L 473.75 601.78711 L 95.75 601.78711 L 95.75 626.98828 L 817.10156 626.98828 L 867.5 677.38672 L 930.5 626.98828 L 930.5 601.78711 L 536.75 601.78711 L 536.75 300.88281 L 473.75 275.68359 L 473.75 340.7832 L 206 340.7832 L 206 45.078125 L 775.10156 45.078125 L 825.5 95.476562 L 888.5 45.078125 L 888.5 19.876953 L 206 19.876953 L 206 -17.921875 L 143 -43.123047 z M 500 706 C 469.39653 706.23029 444.875 730.37828 444.875 761.125 C 444.875 791.87172 469.39653 816.01971 500 816.25 C 530.60347 816.01971 555.125 791.87172 555.125 761.125 C 555.125 730.37828 530.60347 706.23029 500 706 z&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;kanjisample.svg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
先ほどと違ってsvgにおいて各グリフにunicode属性ではなく&amp;lt;strong&amp;gt;glyph&amp;amp;#45;name属性&amp;lt;/strong&amp;gt;を指定していることに注意。system.svgではType1への変換を経由しているのでunicodeを指定してそれをグリフ名として使う必要があったが、svgフォントを直接指定する場合はglyph&amp;amp;#45;nameがかわりに使えるようである（unicodeでも探してくれるかもしれないが確かめていない）。「glyph&amp;amp;#45;00001」のようにunicodeとは全く無関係の識別子でも自由に使えるので便利である。ここではglyph&amp;amp;#45;nameとしてGlyphWikiでのグリフ名を使用している（例えばu8279&amp;amp;#45;jは[https://glyphwiki.org/wiki/u8279-j?view=all u8279&amp;amp;#45;j (艹) &amp;amp;#45; GlyphWiki]の字形である）。&lt;br /&gt;
&lt;br /&gt;
またmapファイルのFDArray要素の名前としては&amp;lt;code&amp;gt;NazoMin&amp;amp;#45;Ideographs&amp;lt;/code&amp;gt;と、先ほどの&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;とは異なり&amp;lt;code&amp;gt;Ideographs&amp;lt;/code&amp;gt;という識別子を使っている。これも後で使う。&lt;br /&gt;
&lt;br /&gt;
今後の説明でも必要になるので上記で例として使用している字について一通り説明しておこう。以下が&amp;lt;code&amp;gt;tx &amp;amp;#45;pdf kanjisample.svg &amp;amp;gt; kanjisample.pdf&amp;lt;/code&amp;gt;で出力されるpdfである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/kanjisample.pdf.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
見ての通り、最初の3文字は「くさかんむり」であるが、微妙に字形が異なる。&lt;br /&gt;
&lt;br /&gt;
この3グリフは（記事執筆時点の）GlyphWikiにおいてそれぞれ以下のUnicodeコードポイントや異体字シーケンスが割り当てられている。（ここでは異体字について詳しく解説はしないが、以下の意味がすんなり理解できるようになれば異体字マスターといっても過言ではない（？）。「異体字セレクタ」「Adobe&amp;amp;#45;Japan1」「CJK部首補助」などの語で適宜検索すること。）&lt;br /&gt;
&lt;br /&gt;
# つながった字形…CJK部首補助&amp;lt;code&amp;gt;U+2EBE&amp;lt;/code&amp;gt;（⺾）、CJK統合漢字&amp;lt;code&amp;gt;U+8279&amp;lt;/code&amp;gt;（艹）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0100&amp;lt;/code&amp;gt;（艹󠄀）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0105&amp;lt;/code&amp;gt;（艹󠄅）&lt;br /&gt;
# 「十」が2つの字形…CJK部首補助&amp;lt;code&amp;gt;U+2EBF&amp;lt;/code&amp;gt;（⺿）、CJK互換漢字&amp;lt;code&amp;gt;U+FA5E&amp;lt;/code&amp;gt;（艹）、それに対応するSVSである&amp;lt;code&amp;gt;U+8279 U+FE01&amp;lt;/code&amp;gt;（艹︁）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0102&amp;lt;/code&amp;gt;（艹󠄂）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0104&amp;lt;/code&amp;gt;（艹󠄄）&lt;br /&gt;
# 「T」が背中合わせの字形…CJK部首補助&amp;lt;code&amp;gt;U+2EC0&amp;lt;/code&amp;gt;（⻀）、CJK互換漢字&amp;lt;code&amp;gt;U+FA5D&amp;lt;/code&amp;gt;（艹）、それに対応するSVSである&amp;lt;code&amp;gt;U+8279 U+FE00&amp;lt;/code&amp;gt;（艹︀）、Adobe&amp;amp;#45;Japan1コレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0101&amp;lt;/code&amp;gt;（艹󠄁）、Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS&amp;lt;code&amp;gt;U+8279 U+E0103&amp;lt;/code&amp;gt;（艹󠄃）&lt;br /&gt;
&lt;br /&gt;
以上の通りこれらは全てAdobe&amp;amp;#45;Japan1コレクションに含まれている字であるため、游明朝などAdobe&amp;amp;#45;Japan1準拠のフォントでは、上記のうち「Moji_Joho及びHanyo&amp;amp;#45;DenshiコレクションのIVS」となっているもの以外は全て正しく表示できるはずである。カッコ内をコピペして試してみるとよい。&lt;br /&gt;
&lt;br /&gt;
謎乃明朝では、現時点では（2フォントに分ける前提で）グリフ数に多少余裕があるので、一応Adobe&amp;amp;#45;Japan1に従ってCID+14197, CID+14198, CID+14199をそれぞれ割り当てているが、Adobe&amp;amp;#45;Japan1準拠のフォントを作るのでなければこうする必要はなく、CID+1から順に漢字で埋めても構わないはず。&lt;br /&gt;
&lt;br /&gt;
その次の3文字は、U+20000（𠀀）の異体字である。Unicodeの20000&amp;amp;#45;2FFFFは「追加漢字面」（SIP）と呼ばれ、日本で普段使われることはない漢字が大半である（「𩸽（ほっけ）」など例外もある）。この範囲の文字を例に含めたのは、BMP外のUnicode文字はサポートが不十分なソフトも多い中で、AFDKOを使えばきちんと対応できる、ということを示すためである。&lt;br /&gt;
&lt;br /&gt;
こちらの割り当ては先ほどよりはずいぶん単純である。GlyphWikiでは、最初のu20000&amp;amp;#45;jvが&amp;lt;code&amp;gt;U+20000&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;U+20000 U+E0100&amp;lt;/code&amp;gt;、次のu20000&amp;amp;#45;ue0101が&amp;lt;code&amp;gt;U+20000 U+E0101&amp;lt;/code&amp;gt;、その次のu20000&amp;amp;#45;ue0102が&amp;lt;code&amp;gt;U+20000 U+E0102&amp;lt;/code&amp;gt;で使われている（後の2つは名前からして当然であるが）。これらは全てMoji_JohoコレクションのIVS異体字であり、U+20000自体もAdobe&amp;amp;#45;Japan1には含まれていないので、正しく表示するには謎乃明朝、花園明朝あるいはIPAmj明朝などが必要だろう。ここでは一応、Adobe&amp;amp;#45;Japan1のCID（現在23059まで定義されている）と被らないよう、24000以降を割り当てている（もちろんそうする必要はない。）&lt;br /&gt;
&lt;br /&gt;
なお、ここではSVS・IVSに対応したフォントを作成するが、Variation Selectorは特殊文字なので、それ自体にグリフを割り当てる必要はない。&lt;br /&gt;
&lt;br /&gt;
==== 出力 ====&lt;br /&gt;
&lt;br /&gt;
ここまで理解したら、以下のようにコマンドを実際に実行してみよう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ mergefonts -cid cidfontinfo merged.pfa system.map system.pfa kanjisample.map kanjisample.svg&lt;br /&gt;
mergefonts: --- system.pfa&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-0&amp;gt;&lt;br /&gt;
Adding font dict 0 from system.pfa.&lt;br /&gt;
mergefonts: --- kanjisample.svg&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14197&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14198&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-14199&amp;gt;&lt;br /&gt;
mergefonts: (cfw) unhinted &amp;lt;cid-24000&amp;gt;&lt;br /&gt;
Adding font dict 1 from kanjisample.svg.&lt;br /&gt;
mergefonts: (cfw) There are 2 additional reports of &#039;unhinted&#039;.&lt;br /&gt;
&lt;br /&gt;
mergefonts: --- merged.pfa&lt;br /&gt;
mergefonts: (cfr) /BlueValues missing: FD[1]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;unhinted&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;/BlueValues missing&amp;amp;#58; FD&amp;amp;#91;1&amp;amp;#93;&amp;lt;/code&amp;gt;などとwarning/errorが出ているが、あとでヒントを追加するので無視でよい（多分）（SVGに直接BlueValuesを追加する方法があってもおかしくはないと思うが見つけられなかった）。&lt;br /&gt;
&lt;br /&gt;
生成されたmerged.pfaを再びtxでpdfにしてみると以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/merged.pdf.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、各CIDに意図した字形が割り当てられていることがわかるだろう。しかし、それらのCIDがどの文字に対応するものなのかという情報は全く含まれていないので、これはまだ実際に使用できるフォントではない。&lt;br /&gt;
&lt;br /&gt;
== ヒントの付加 ==&lt;br /&gt;
&lt;br /&gt;
次に、このフォントにヒントを付加する。ヒントというのは、フォントをラスタライズ（実際にピクセルに変換して描画）する際に、線の太さなどを調節して見やすくするための機能であり、特に小さいサイズで表示したときの見た目に大きく影響する。日本語情報はあまりないが、Fontforge関連でいくつか見つけることができる。またBlueValuesやStdHWなど個々の値の仕様に関しては[https://kikakurui.com/x4/X4163-1994-01.html https&amp;amp;#58;//kikakurui.com/x4/X4163&amp;amp;#45;1994&amp;amp;#45;01.html]で日本語で読める。個人的にもあまりヒントの動作についてはよくわかっていないので、ここでは最低限のやり方だけ述べる。&lt;br /&gt;
&lt;br /&gt;
ちなみにこの記事では扱わないがAFDKOにはrotatefontというグリフを（ヒント情報含めて）自動で回転させてくれるコマンドがあり、これを使った場合にもその後で改めてpsautohintを実行するのが望ましいようである（参考 &amp;amp;#58;[https://aznote.jakou.com/afdko/anti02.html アンチックフォントを作る&amp;amp;#58; グリフの変形と合成]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hitcidfontplを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== hitcidfont.plを使う ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ヒントの付加はpsautohintというプログラムで行うが、psautohintが動作するためには、&amp;lt;strong&amp;gt;BlueValues&amp;lt;/strong&amp;gt;という値だけは最低限手動で設定しなければいけないようである。そこで、[https://github.com/adobe-type-tools/perl-scripts/blob/master/hintcidfont.pl perl&amp;amp;#45;scripts/hintcidfont.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts]を用いて、先ほど生成したmerged.pfaにBlueValues（やその他、必須ではないパラメータ）を付加する。&lt;br /&gt;
&lt;br /&gt;
このスクリプトは（今回であれば）以下のように使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;hintcidfont.pl hintparam.txt &amp;lt; merged.pfa &amp;gt; merged_out.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
前述の通りpfaフォント（ファイルの先頭がああいう感じのやつ）以外には使えないようである。この&amp;lt;code&amp;gt;hintparam.txt&amp;lt;/code&amp;gt;がBlueValuesなどを指定するファイルで、ここで先ほどFDArray要素の名前で使用した&amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Ideographs&amp;lt;/code&amp;gt;を使用する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;System&lt;br /&gt;
/BlueValues [-250 -250 1100 1100] def&lt;br /&gt;
/StdHW [100] def&lt;br /&gt;
/StdVW [100] def&lt;br /&gt;
&lt;br /&gt;
Ideographs&lt;br /&gt;
/BlueValues [-100 -200 1100 1100] def&lt;br /&gt;
/StdHW [70] def&lt;br /&gt;
/StdVW [100] def&lt;br /&gt;
/StemSnapH [70 80 60 90 50 40] def&lt;br /&gt;
/StemSnapV [80 70 90 60 100 50 110] def&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;hintparams.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、FDArray要素ごとに自動ヒント付けのための情報を付加できる。&lt;br /&gt;
&lt;br /&gt;
前述のようにBlueValuesは最低限必要で、これは確かフォントがラスタ化されるときの最大のバウンディングボックスを指定するものなので、該当のFDArrayに含まれるグリフのバウンディングボックスより大きければ大丈夫だと思う。今回のように1000x1000で漢字のみ入れるような場合は適当に&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#45;250 &amp;amp;#45;250 1100 1100&amp;amp;#93;&amp;lt;/code&amp;gt;などとしておけばよいはず。&lt;br /&gt;
&lt;br /&gt;
StdHWとStdVWは水平方向のステムの（垂直方向の）幅と垂直方向のステムの（水平方向の）幅の目安（？）をそれぞれ指定するものである。明朝なら横線のほうが細いということで、ここでは何となくStdHWを70、StdVWを100としているが、効果がどうなのかはよくわかっていない。StemSnapHとStemSnapVは、StdHWとStdVWと似ているが、より細かい精度でガイドラインを設定するような感じのやつである。あまり情報がなくてよくわからないので、かなり適当に設定していて、本当は小さい順に並べる必要があったりするのかもしれない。&lt;br /&gt;
&lt;br /&gt;
まあ言ってしまえば、見た目を追求するなら本来は手動でヒント付けを行うべきである（多分）。他の設定例は[https://ccjktype.fonts.adobe.com/wp-content/uploads/2012/06/afdko-lunde-20120625.pdf https&amp;amp;#58;//ccjktype.fonts.adobe.com/wp&amp;amp;#45;content/uploads/2012/06/afdko&amp;amp;#45;lunde&amp;amp;#45;20120625.pdf] なども参照。&lt;br /&gt;
&lt;br /&gt;
上手くいけば、以下のような出力とともにこれらの値が付加されたpfaファイルが生成される。テキストエディタで開いてみると、pfaファイルの上の方に&amp;lt;code&amp;gt;/BlueValues &amp;amp;#91;&amp;amp;#45;250 &amp;amp;#45;250 1100 1100&amp;amp;#93; def&amp;lt;/code&amp;gt;などと書きこまれているのがわかる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;$ hintcidfont.pl hintparam.txt &amp;lt; merged.pfa &amp;gt; merged_out.pfa&lt;br /&gt;
Detected CIDFontName: NazoMin&lt;br /&gt;
Modifying System hinting parameters...&lt;br /&gt;
Modifying Ideographs hinting parameters...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ここまでの記事に従っていれば大丈夫かと思うが、何も出なかったらおそらくどこかが間違っているのでpfaファイルの中身やスクリプトのソースを読んでみるなどして確認すること。&lt;br /&gt;
&lt;br /&gt;
==== psautohintの実行 ====&lt;br /&gt;
&lt;br /&gt;
では次にpsautohintを実行する。オプションなどは筆者がよくわかっていないので、今回は以下を実行するだけである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;psautohint merged_out.pfa -o hinted.pfa&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
今回はグリフ数が少ないのですぐに終わるが、数万グリフあるとなると数分ほどかかる処理である。&lt;br /&gt;
&lt;br /&gt;
手元ではたまに&amp;lt;code&amp;gt;ERROR&amp;amp;#58; cid51649&amp;amp;#58; Possible loop in element that goes from 109 46 to 109 47. Please check.&amp;lt;/code&amp;gt;（あるいは稀に&amp;lt;code&amp;gt;ERROR&amp;amp;#58; cid45515&amp;amp;#58; Check for duplicate subpath at 128 758&amp;lt;/code&amp;gt;）などと出る字もあるのだが特に見た目は問題無さそうなので無視している。&lt;br /&gt;
&lt;br /&gt;
== makeotfの準備 ==&lt;br /&gt;
&lt;br /&gt;
ここまででグリフのデータは完成したので、実際に使えるフォントにするためのmakeotfの実行に向けて準備を行う。&lt;br /&gt;
&lt;br /&gt;
基本的には、それぞれの文字（Unicode符号位置）でどのCIDを使用するかという&amp;lt;strong&amp;gt;CMap&amp;lt;/strong&amp;gt;が最も重要で、これさえあれば一通り使えるフォントにはなるが、ここでは（先ほど説明した）異体字セレクタも使えるようにSequenceファイルも使用する。OpenType featureに関しては（自分があまりよくわかっていないので）フォントの高さなど最低限の設定のみ行う。他にもGSUB・GPOSをはじめ様々な面白いfeatureがあるので調べてみてほしい。また、フォント名の設定のためFontMenuNameDBというファイルも使用する。&lt;br /&gt;
&lt;br /&gt;
これらについては[https://shiromoji.hatenablog.jp/entry/20111210/1323520587 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 後篇：makeotf &amp;amp;#45; しろもじメモランダム]も参考になる。また[https://github.com/adobe-fonts/source-han-sans https://github.com/adobe-fonts/source-han-sans]や[https://github.com/adobe-type-tools/Adobe-Japan1 https://github.com/adobe-type-tools/Adobe-Japan1]にも例がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;fontmenunamedb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== FontMenuNameDB ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;[NazoMin]&lt;br /&gt;
  f=NazonoMincho&lt;br /&gt;
  s=Regular&lt;br /&gt;
  l=NazonoMincho Regular&lt;br /&gt;
&lt;br /&gt;
  f=3,1,0x411,\8B0E\4E43\660E\671D&lt;br /&gt;
  s=3,1,0x411,Regular&lt;br /&gt;
  l=3,1,0x411,\8B0E\4E43\660E\671D Regular&lt;br /&gt;
&lt;br /&gt;
  f=1,1,11,\93\E4\94\54\96\BE\92\A9&lt;br /&gt;
  s=1,1,11,Regular&lt;br /&gt;
  l=1,1,11,\93\E4\94\54\96\BE\92\A9 Regular&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;FontMenuNameDB&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このように、先ほど使用したPostScript名である&amp;lt;code&amp;gt;NazoMin&amp;lt;/code&amp;gt;を先頭に書き、フォント名を設定する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\8B0E\4E43\660E\671D&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;\93\E4\94\54\96\BE\92\A9&amp;lt;/code&amp;gt;はそれぞれWinとMacのエンコーディングで「謎乃明朝」を表す。少なくともWindowsに関しては、UTF&amp;amp;#45;16のサロゲートペアを用いればBMP外文字でも指定できるようである（例えば先ほどのU+20000なら&amp;lt;code&amp;gt;\D840\DC00&amp;lt;/code&amp;gt;）が、やめておいた方が無難だろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmap&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== CMap ====&lt;br /&gt;
&lt;br /&gt;
CMapは、各UnicodeのためにどのCIDを使用するかを指定するもので、フォントの根幹部分を決める重要なファイルである。日本語の「、。」のような縦と横で字形（位置）が異なる文字のために縦書き用CMapが必要なこともあるが、今回は漢字だけなので、とりあえず横書きだけ指定しておけばあとはmakeotfがやってくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;%!PS-Adobe-3.0 Resource-CMap&lt;br /&gt;
%%DocumentNeededResources: ProcSet (CIDInit)&lt;br /&gt;
%%IncludeResource: ProcSet (CIDInit)&lt;br /&gt;
%%BeginResource: CMap (NazoMinCMAP-UTF32-H)&lt;br /&gt;
%%Title: (NazoMinCMAP-UTF32-H Adobe Identity 0)&lt;br /&gt;
%%Version: 2.004&lt;br /&gt;
%%Copyright: -----------------------------------------------------------&lt;br /&gt;
%%Copyright: (省略)&lt;br /&gt;
%%Copyright: -----------------------------------------------------------&lt;br /&gt;
%%EndComments&lt;br /&gt;
&lt;br /&gt;
/CIDInit /ProcSet findresource begin&lt;br /&gt;
&lt;br /&gt;
12 dict begin&lt;br /&gt;
&lt;br /&gt;
begincmap&lt;br /&gt;
&lt;br /&gt;
/CIDSystemInfo 3 dict dup begin&lt;br /&gt;
  /Registry (Adobe) def&lt;br /&gt;
  /Ordering (Identity) def&lt;br /&gt;
  /Supplement 0 def&lt;br /&gt;
end def&lt;br /&gt;
&lt;br /&gt;
/CMapName /NazoMinCMAP-UTF32-H def&lt;br /&gt;
/CMapVersion 2.004 def&lt;br /&gt;
/CMapType 1 def&lt;br /&gt;
&lt;br /&gt;
/WMode 0 def&lt;br /&gt;
&lt;br /&gt;
1 begincodespacerange&lt;br /&gt;
  &amp;lt;00000000&amp;gt; &amp;lt;0010FFFF&amp;gt;&lt;br /&gt;
endcodespacerange&lt;br /&gt;
&lt;br /&gt;
1 beginnotdefrange&lt;br /&gt;
&amp;lt;00000000&amp;gt; &amp;lt;0000001f&amp;gt; 1&lt;br /&gt;
endnotdefrange&lt;br /&gt;
&lt;br /&gt;
6 begincidchar&lt;br /&gt;
&amp;lt;00000020&amp;gt; 1&lt;br /&gt;
&amp;lt;00003000&amp;gt; 633&lt;br /&gt;
&amp;lt;00008279&amp;gt; 14197&lt;br /&gt;
&amp;lt;0000fa5d&amp;gt; 14199&lt;br /&gt;
&amp;lt;0000fa5e&amp;gt; 14198&lt;br /&gt;
&amp;lt;00020000&amp;gt; 24000&lt;br /&gt;
endcidchar&lt;br /&gt;
&lt;br /&gt;
1 begincidrange&lt;br /&gt;
&amp;lt;00002ebe&amp;gt; &amp;lt;00002ec0&amp;gt; 14197&lt;br /&gt;
endcidrange&lt;br /&gt;
&lt;br /&gt;
endcmap&lt;br /&gt;
CMapName currentdict /CMap defineresource pop&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
%%EndResource&lt;br /&gt;
%%EOF&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;NazoMinCMAP-UTF32-H&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このような感じで、unicode位置（このファイルはUTF32版である）からCIDへの対応関係を記述する。&lt;br /&gt;
&lt;br /&gt;
なお、begincidrangeはbegincidcharがCID・Unicode位置ともに連続しているときに楽に指定するためのものである。また、begincidcharやbegincidrangeによる1つのブロックまでには最大100個（上記では1や6になっている）までしか情報を入れられない。従って、機械的にCMapを生成するときは、以下のように全て&amp;lt;code&amp;gt;1 begincidchar ... endcidchar&amp;lt;/code&amp;gt;で指定してしまうのが楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;...&lt;br /&gt;
1 begincidchar&lt;br /&gt;
&amp;lt;00008279&amp;gt; 14197&lt;br /&gt;
endcidchar&lt;br /&gt;
1 begincidchar&lt;br /&gt;
&amp;lt;00002ebe&amp;gt; 14197&lt;br /&gt;
endcidchar&lt;br /&gt;
...&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
その上で、サイズを削減したいときは、[https://github.com/adobe-type-tools/perl-scripts/blob/master/cmap-tool.pl perl&amp;amp;#45;scripts/cmap&amp;amp;#45;tool.pl at master · adobe&amp;amp;#45;type&amp;amp;#45;tools/perl&amp;amp;#45;scripts]を使うと良い感じにbegincidrangeにした上で100個ずつにまとめてくれる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sequenceファイル&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Sequenceファイル ====&lt;br /&gt;
&lt;br /&gt;
今回は以下のものを使用する。先ほど解説した通りに「CJK統合漢字+異体字セレクタ」の組が該当CIDを参照していることを確認せよ。&lt;br /&gt;
&lt;br /&gt;
ちなみに、異体字セレクタが付けられている元の字（以下ならU+8279とU+20000）自体がフォントに含まれていないとたしか異体字も使えないはずなのでそこは注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;8279 E0100; AJ1; CID+14197&lt;br /&gt;
8279 E0105; AJ1; CID+14197&lt;br /&gt;
8279 E0104; AJ1; CID+14198&lt;br /&gt;
8279 FE01; AJ1; CID+14198&lt;br /&gt;
8279 E0102; AJ1; CID+14198&lt;br /&gt;
8279 E0101; AJ1; CID+14199&lt;br /&gt;
8279 E0103; AJ1; CID+14199&lt;br /&gt;
8279 FE00; AJ1; CID+14199&lt;br /&gt;
20000 E0100; AJ1; CID+24000&lt;br /&gt;
20000 E0101; AJ1; CID+24001&lt;br /&gt;
20000 E0102; AJ1; CID+24002&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;sequences.txt&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このファイル形式はAFDKOやOpenTypeフォント自体に由来するものであるというよりは多分Unicodeの[https://www.unicode.org/ivd/data/ IVD]に含まれるSequenceファイルに由来するものであるように思われる。SourceHanSansやAdobe&amp;amp;#45;Japan1のリポジトリにある例ではそれに従って中央の列に&amp;lt;code&amp;gt;Adobe&amp;amp;#45;Japan1&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Standardized_Variants&amp;lt;/code&amp;gt;などと律儀に書いてあるが、AFDKOが読むのは実際には第1のシーケンスと第3列のCID番号だけと思われるので、このように適当に&amp;lt;code&amp;gt;AJ1&amp;lt;/code&amp;gt;などと書いてファイル容量をケチっておいても問題はなさそうだった。&lt;br /&gt;
&lt;br /&gt;
==== featureファイル ====&lt;br /&gt;
&lt;br /&gt;
このファイルによって完成品のフォント名などが決められる。&lt;br /&gt;
&lt;br /&gt;
ほぼ[https://shiromoji.hatenablog.jp/entry/20111210/1323520587 AFDKO入門《CIDキー方式のOpenTypeフォントの作り方》 後篇：makeotf &amp;amp;#45; しろもじメモランダム]を参考に、最低限の内容だけ入れている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;table head {&lt;br /&gt;
  FontRevision     0.004;&lt;br /&gt;
} head;&lt;br /&gt;
&lt;br /&gt;
table hhea {&lt;br /&gt;
  CaretOffset          0;&lt;br /&gt;
  Ascender           880;&lt;br /&gt;
  Descender         -120;&lt;br /&gt;
  LineGap           1000;&lt;br /&gt;
} hhea;&lt;br /&gt;
&lt;br /&gt;
table OS/2 {&lt;br /&gt;
  FSType               0;&lt;br /&gt;
  Panose               2   # Latin, Text&lt;br /&gt;
                      11   # Normal Sans&lt;br /&gt;
                       4   # Thin&lt;br /&gt;
                       9   # Monospaced&lt;br /&gt;
             0 0 0 0 0 0;  # Any&lt;br /&gt;
  UnicodeRange&lt;br /&gt;
  0 1 2 5 6 7 9&lt;br /&gt;
 31&lt;br /&gt;
  32 33 34 35 36 37 38 39&lt;br /&gt;
        42 43 44 45 46 47&lt;br /&gt;
  48 &lt;br /&gt;
                      49   # Hiragana&lt;br /&gt;
                      50   # Katakana&lt;br /&gt;
    54 55 57&lt;br /&gt;
                     59   # CJK Unified Ideographs&lt;br /&gt;
                      61 # CJK Strokes, CJK Compatibility Ideographs (Supplement)&lt;br /&gt;
      65 68&lt;br /&gt;
                      91   # Variation Selectors&lt;br /&gt;
  ;&lt;br /&gt;
  CodePageRange&lt;br /&gt;
                    1252   # Latin 1&lt;br /&gt;
                    1250   # Latin 2&lt;br /&gt;
                     932   # JIS/Japan&lt;br /&gt;
                     936   # Chinese: Simplified chars—PRC and Singapore&lt;br /&gt;
                     949   # Korean Wansung&lt;br /&gt;
                     950     # Chinese: Traditional chars—Taiwan and Hong Kong&lt;br /&gt;
                    1361   # Korean Johab&lt;br /&gt;
  ;&lt;br /&gt;
  TypoAscender       880;&lt;br /&gt;
  TypoDescender     -120;&lt;br /&gt;
  TypoLineGap       1000;&lt;br /&gt;
  winAscent         1000;&lt;br /&gt;
  winDescent         100;&lt;br /&gt;
  XHeight              0;&lt;br /&gt;
  CapHeight            0;&lt;br /&gt;
  WeightClass        400;&lt;br /&gt;
  WidthClass           5;  # Full width&lt;br /&gt;
  Vendor          &amp;quot;YHVH&amp;quot;;&lt;br /&gt;
} OS/2;&lt;br /&gt;
&lt;br /&gt;
table vhea {&lt;br /&gt;
  VertTypoAscender   500;&lt;br /&gt;
  VertTypoDescender -500;&lt;br /&gt;
  VertTypoLineGap   1000;&lt;br /&gt;
} vhea;&lt;br /&gt;
&lt;br /&gt;
feature vrt2 {&lt;br /&gt;
  sub \1 by \8720;&lt;br /&gt;
} vrt2;&lt;br /&gt;
&lt;br /&gt;
feature vert {&lt;br /&gt;
  sub \1 by \8720;&lt;br /&gt;
} vert;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;features&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
詳しくは他サイトに譲る。Ascender/Descenderによりフォントの高さ・深さを指定している（880&amp;amp;#45;(&amp;amp;#45;120)でちょうど1000になっていることを確認せよ）。winAscentとwinDescentはWindows限定のようだが、少なくともこれを変えると手元ではWordでのフォント高さが変わるので重要そうである（この設定例はかなり小さめである）。FontRevisionは好きに設定してよい。わからないときは、ttx（txではない）で既存フォントのテーブルを見てみるのもよいだろう。&lt;br /&gt;
&lt;br /&gt;
UnicodeRangeやCodePageRangeは、フォントがどのような言語・文字集合に対応しているかの参考にされるのだと思うが、少なくともフォント名を自分で指定してこのフォントを使う分にはあまり影響しない部分かと思われる。&amp;lt;s&amp;gt;実際には一文字も収録していないUnicode範囲をこんな大量に指定するのはやめた方がよさそうである。&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vrt2の部分は前述の[http://web.archive.org/web/20130225051414/http://d.hatena.ne.jp/mashabow/20120306/1331028598 花園明朝OTを0.510に更新、IVD 2012&amp;amp;#45;03&amp;amp;#45;02版に対応 &amp;amp;#45; しろもじメモランダム]を参考にしたものである。vertは勝手に同じ内容でつけてみた。&lt;br /&gt;
&lt;br /&gt;
== makeotfの実行 ==&lt;br /&gt;
&lt;br /&gt;
ここまでできたら&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;makeotf -f hinted.pfa -ff features -o final.otf -ch NazoMinCMAP-UTF32-H -ci sequences.txt -mf FontMenuNameDB&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
としてフォントをビルドしてみよう。なお、&amp;lt;code&amp;gt;FontMenuNameDB&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;features&amp;lt;/code&amp;gt;はそれぞれAFDKOが探すデフォルトの名前なので、別の名前を使わない限りは指定しなくてもよい。&amp;lt;code&amp;gt;Built development mode font &amp;amp;quot;…./final.otf&amp;amp;quot;&amp;lt;/code&amp;gt;などと出ればめでたく成功である。ちなみに&amp;amp;#45;rオプションを付けるとreleaseモードになり、”Built release mode font”と出る。多少時間がかかるもののサイズが減るなどする。&lt;br /&gt;
&lt;br /&gt;
あとはインストールしてちゃんと文字が出るか確かめればよい。Wordで確かめているとインストール直後はフォントの色々な情報（特に高さなど）がうまく読み込まれない場合があるので、何かおかしいと思ったらOffice系のソフトを一旦全て終了するなどしてからまた起動するのがよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;truetypeへの変換&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== TrueTypeへの変換 ==&lt;br /&gt;
&lt;br /&gt;
AFDKOが生成するのはPostScriptアウトラインのOpenTypeフォントであるから、曲線データには3次ベジェ曲線が用いられる。TrueTypeでは2次ベジェ曲線しか使えないので、3次ベジェ曲線→2次ベジェ曲線の変換が必要である。これは自明な変換ではなく近似が必要であるが、AFDKOにはこれをやってくれるotf2ttfというコマンドがある。シンプルに&amp;lt;code&amp;gt;otf2ttf final.otf&amp;lt;/code&amp;gt;とすれば&amp;lt;code&amp;gt;final.ttf&amp;lt;/code&amp;gt;というTrueTypeフォントが出力される。&lt;br /&gt;
&lt;br /&gt;
== その他参考 ==&lt;br /&gt;
&lt;br /&gt;
その他、フォントに関連する記事としては、[[Webブラウザ（Chrome）|Webブラウザ（Chrome）]]と[[Wordの「検索と置換」について|Wordの「検索と置換」について]]も参考になるだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cssで謎乃明朝&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== CSSで謎乃明朝 ==&lt;br /&gt;
&lt;br /&gt;
IVSなどがあるので（body&amp;amp;#58;&amp;amp;#123;&amp;amp;#125;などに書く）font&amp;amp;#45;family&amp;amp;#58;のところではNazoMinを先に指定すること。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;@font-face {&lt;br /&gt;
      font-family: &amp;quot;NazoMin&amp;quot;;&lt;br /&gt;
      src: local(&amp;quot;謎乃明朝 Regular&amp;quot;);&lt;br /&gt;
      unicode-range: U+3400-U+4DFF, U+2F800-2FFFF, U+30000-3FFFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
      font-family: &amp;quot;NazoMin+&amp;quot;;&lt;br /&gt;
      src: local(&amp;quot;謎乃明朝+ Regular&amp;quot;);&lt;br /&gt;
      unicode-range: U+20000-2F7FF;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%92%B0%E5%A2%83&amp;diff=323</id>
		<title>Windowsでのターミナル環境</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%81%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E7%92%B0%E5%A2%83&amp;diff=323"/>
		<updated>2025-04-02T08:37:48Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WindowsはLinuxに比べるとライトユーザー向けのOSで、端末エミュレータで文字を打ってコマンドを実行するというCUIのスタイルで使いやすいようにデザインされているとは言い難い。それでも、ある程度工夫すれば不満点を改善することはできる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;c&amp;amp;#58;usersusernamepathにpathを通す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== C&amp;amp;#58;\Users\USERNAME\.pathにPATHを通す ==&lt;br /&gt;
&lt;br /&gt;
ユーザーフォルダ（C&amp;amp;#58;\Users\USERNAME）の直下などわかりやすいところに.path（もちろん名前は好きに決めてよい）というフォルダを作り、これをユーザー環境変数のPATH（の先頭がいいかな？）に追加しておく（他ユーザーから見えないフォルダなのでシステム環境変数に追加するのは不適切）。するとPATHをいちいち書き換えなくてもこの中に入れた実行ファイルやバッチファイルはファイル名だけで呼び出せる状態になる。&lt;br /&gt;
&lt;br /&gt;
これは、インストール不要（圧縮ファイル解凍のみ）、あるいはPATHを自動で通さないようなソフトウェアを使いやすくするのに有用である。実行ファイル単体で動作するならファイルを直接入れてもいいし、依存ファイルがあるなら&amp;lt;strong&amp;gt;本体の位置はそのままでそれを呼び出す&amp;lt;/strong&amp;gt;プログラムを入れればいい（バッチファイルでもいいが、欠点がある。詳しくは後述）。&lt;br /&gt;
&lt;br /&gt;
筆者はrclone（ファイル同期ソフト）やmpv（メディアプレイヤー）などをこの.path経由で起動できるようにしている。またLinuxでも同様の設定をしている。&lt;br /&gt;
&lt;br /&gt;
== 他のコマンドを呼び出すプログラム ==&lt;br /&gt;
&lt;br /&gt;
前項の目的を達するため、「自身に渡されたコマンドライン引数を（場合により多少の処理をした上で）ほぼそのまま使って他のコマンドを実行する」ようなプログラムを作成した。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]&lt;br /&gt;
&lt;br /&gt;
このプログラムは、「自分自身のファイル名の最後の文字と最後から3番目の文字を&amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;に変更したファイル（主にexe→txtを想定しているが、com→totなどでもよい）を読み込み、その内容と自分に与えられたコマンドライン引数をつなげた文字列をコマンドとして実行する」という挙動をする。すなわち、実行ファイルは（コンパイルし直さず）そのままコピーした上で、ペアとなる.txtファイルに適切な内容を書くことで、以下のようなプログラムが実現できる。&lt;br /&gt;
&lt;br /&gt;
==== 他のプログラムをそのまま実行 ====&lt;br /&gt;
&lt;br /&gt;
たとえばテキストファイルに以下のように書いておけば、mpvが起動される。&amp;lt;strong&amp;gt;末尾の半角スペースも入れること。&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;quot;C:\Users\username\Softwares\mpv\mpv.exe&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Windows版のmpvは、設定ファイル（mpv.conf）やプラグインなどを自身が存在するディレクトリから読み込むが、それらの動作を維持したままで、.pathにはmpv.exeという呼び出し専用のファイルだけを配置することができる。&lt;br /&gt;
&lt;br /&gt;
==== 指定フォルダにあるプログラムを実行 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;myprogram somecommand arg1 arg2 ...&amp;lt;/code&amp;gt;と呼び出されたときに、&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\somecommand arg1 arg2 ...&amp;lt;/code&amp;gt;をかわりに実行したい、ということがある。例えば複数の実行ファイルがまとまって提供されるような場合である。このときは以下のようなmycommand.txtをペアにすればよい。この場合はパスを直接引数につなげるため、&amp;lt;strong&amp;gt;末尾に半角スペースを入れてはいけない。&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;C:\path\to\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
ところで、&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\&amp;lt;/code&amp;gt;の部分に空白文字が含まれている場合、このままではパスが正しく認識されない。通常はパス全体をダブルクォーテーションで囲うことでこれを回避するが、今回は与えられた引数のどこにダブルクォーテーションを挿入するかが自明ではない（&amp;lt;code&amp;gt;myprogram someprogram&amp;amp;quot;&amp;lt;/code&amp;gt;と入力させるという方法もあるが美しくない）ため、&amp;lt;strong&amp;gt;半角スペースを含まない別名&amp;lt;/strong&amp;gt;（8.3形式）&amp;lt;strong&amp;gt;を使う&amp;lt;/strong&amp;gt;のがよいだろう（短い名前については[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]]も参照）。例えばProgram Filesなら普通は「PROGRA&amp;amp;#126;1」になっているはずである。以下はGit Bashでのtxtファイルの例である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;C:\PROGRA~1\Git\usr\bin\&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
これにより、PATHを変更せずとも、例えば&amp;lt;code&amp;gt;gb grep&amp;lt;/code&amp;gt;などとするだけでGit Bashの&amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;を呼び出すことができるようになる。gitやnpmやbusyboxやmagick（ImageMagick）のようにサブコマンドを指定して使うプログラムは多くあるが、これと同じような使用感になる。プレフィックスを設けることでそれぞれの名前の集合を別々に管理して衝突を防ぐ、という意味では、多くのプログラム言語で採用されている名前空間（namespace）に近い発想かもしれない。（コマンドにおけるこのような手法に特に名前は付いていないと思う。）&lt;br /&gt;
&lt;br /&gt;
==== pathなどの環境変数を変更して実行 ====&lt;br /&gt;
&lt;br /&gt;
上記と若干似ているが、PATHをはじめとした環境変数を変えることでプログラムがうまく実行されるようにしたい、という場合もある。この場合は、テキストファイルを以下のようにすればよい（Git Bashのフォルダをパスに追加し、&amp;lt;code&amp;gt;MYVAR&amp;lt;/code&amp;gt;に&amp;lt;code&amp;gt;value1&amp;lt;/code&amp;gt;をセットする例）。末尾の半角スペースはあってもなくてもいい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cmd /c path C:\Program Files\Git\usr\bin;%PATH% &amp;amp; set MYVAR=value1 &amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こちらは、先ほどと違って、内部でGit Bashのコマンドを使用する（Git Bashとは無関係な）プログラムを実行する際などに有用である。&lt;br /&gt;
&lt;br /&gt;
また、これに類似のケースとして、環境変数の設定などを行うバッチファイルが既に用意されていてそれを使いたいという場合もある。例えば以下のようなテキストファイルを用いれば、実質的にVisual Studioの開発者コマンドプロンプト（Developer Command Prompt for VS 2022）の内部で与えられたコマンドを実行してくれるプログラムが作れる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;cmd /c C:\PROGRA~1\MIB055~1\2022\Community\Common7\Tools\VsDevCmd.bat &amp;amp;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* ここでも短いパスを使用している。長いパスでも引用符で囲めばある程度うまく動作するが、&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;の後にくるコマンドに引用符が含まれている場合にうまくいかない。&lt;br /&gt;
&lt;br /&gt;
Linuxでも、例えば特定のvenv仮想環境の中で与えられたコマンドを実行するシェルスクリプトを全く同じ発想で作ることができる。&lt;br /&gt;
&lt;br /&gt;
=== 実装について ===&lt;br /&gt;
&lt;br /&gt;
* 言語はC++を使った。これはWindows APIのGetCommandLineから生のコマンドライン文字列が得られるからである。予め分割されたコマンドラインでは情報量が減ってしまう。WinMainが使えればlpCmdLineで楽にできたが、今回はコンソールアプリケーションで実装したかったので、[https://stackoverflow.com/questions/14150374/how-to-get-the-raw-command-line-arguments c++ &amp;amp;#45; How to get the raw command line arguments &amp;amp;#45; Stack Overflow]のようにして自身のファイルパスだけ取り除いた。&lt;br /&gt;
* コンソールイベント（Ctrl+Cなど）の転送に関しては、CreateProcessにCREATE_NEW_PROCESS_GROUPを指定した上で、SetConsoleCtrlHandlerによって全てのコンソールイベントを転送する方式とした。CREATE_NEW_PROCESS_GROUPを指定しない場合よりもこのほうが安定して動いている気がする。&lt;br /&gt;
* cmdの対話シェルには、実行するアプリケーションがコンソールアプリケーションではなくGUIアプリケーションである場合は実行終了を待たずに即座に制御を返すという仕様がある。これを模倣するため、自作プログラムにはGUIアプリケーションにしたバージョンも同梱している。&lt;br /&gt;
&lt;br /&gt;
=== batとの比較 ===&lt;br /&gt;
&lt;br /&gt;
上記の例は、いずれもバッチファイルを使って似たようなことが実現できる。例えばGit Bashならそれぞれ&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;prolog&amp;quot;&amp;gt;@C:\path\to\directory\%*&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
や&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;@cmd /c &amp;quot;path C:\path\to\directory;%PATH% &amp;amp; %*&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
のようにする（&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;は、echo offを一時的に行うために必要である）。&lt;br /&gt;
&lt;br /&gt;
しかし、cmd.exeには、バッチファイルの実行中にCtrl+Cを送信すると「バッチ ジョブを終了しますか (Y/N)?」というプロンプトを表示するという厄介な仕様がある。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で挟まれた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が文字列として含まれていた場合に展開されてしまう。そのため、先ほどの自作プログラムを使用するほうがスマートである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin-msysmingw-git-bashの違い&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwin, MSYS/MinGW, Git Bashの違い ==&lt;br /&gt;
&lt;br /&gt;
これらはいずれもWindows上でUnixライクなコマンドライン環境を整備してくれるツールだが、違いもある。&lt;br /&gt;
&lt;br /&gt;
個人的な印象としては&lt;br /&gt;
&lt;br /&gt;
* Cygwinは起動に若干タイムラグがあるが、最も信頼できる動作をするので、例えばシェルスクリプトを実行させるときなどはまずCygwinで試した方がいい。&lt;br /&gt;
* MSYS系は、C++でWindows向けに何かをコンパイルしたい時に使う。&lt;br /&gt;
* Git Bashは、最も手軽だが、Cygwinに比べると意外とWindowsとの互換性というか、動作が怪しいことがある。&lt;br /&gt;
** Git Bashからだと、cmdを起動したときに入力カーソルの位置がおかしい、Windowsのアプリケーションに&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;を引数として渡したいときは&amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;と書かなければいけない、xargsの並列実行の挙動がおかしい（[https://github.com/ge9/ExecuteCommand-Pipe/issues/3 With &amp;amp;quot;h&amp;amp;quot; option, ][https://github.com/ge9/ExecuteCommand-Pipe/issues/3 &amp;lt;code&amp;gt;xargs &amp;amp;#45;n1&amp;lt;/code&amp;gt;][https://github.com/ge9/ExecuteCommand-Pipe/issues/3  creates only one process · Issue &amp;amp;#35;3 · ge9/ExecuteCommand&amp;amp;#45;Pipe]）という例があった。&lt;br /&gt;
&lt;br /&gt;
==== 参考サイト ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://www.glamenv-septzen.net/view/1422 https&amp;amp;#58;//www.glamenv&amp;amp;#45;septzen.net/view/1422]これを見た限り（2017年のやつだけど）、MSYS2って意外と大したことなくない？という。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;呼び方の違いがわかりやすい表[https://gist.github.com/rz7d/4e699498d339a5837f016b3108631a2b https&amp;amp;#58;//gist.github.com/rz7d/4e699498d339a5837f016b3108631a2b]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://opcdiary.net/%E6%B7%B7%E3%81%9C%E3%82%8B%E3%81%AA%E5%8D%B1%E9%99%BA-msys2%E3%81%A8cygwin%E3%81%A8git-for-windows%E3%82%92%E4%B8%80%E7%B7%92%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%BE/ 混ぜるな危険 (msys2とCygwinとGit For Windowsを一緒に使ってはいけません) | OPCDiary]&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これがあるので、当サイトのように呼び出し用のコマンドを整備するのが割とおすすめ。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://sites.google.com/site/toriaezuzakki/msys2?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F https&amp;amp;#58;//sites.google.com/site/toriaezuzakki/msys2?tmpl&amp;amp;#61;%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F]&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MSYS2をインストールしたときに出る複数のシェルはパスの設定が違う（だけ？）らしい&amp;amp;#58;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;「これらの違いはパスの設定です。MSYS2 Shellを基本として、MinGW&amp;amp;#45;w64 Win32 Shellはそれに/mingw32/binが追加されており、MinGW&amp;amp;#45;w64 Win64 Shellは/mingw64/binが追加されています。」&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;詳しくは、「msys2_shell.cmd」を読んでみると良さそうである。MSYSTEM環境変数というのが重要そう。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://m-hiyama.hatenablog.com/entry/20151013/1444704189 Mingw&amp;amp;#45;w64/MSYS2 を入れなくても Git for Windows で間に合うみたい &amp;amp;#45; 檜山正幸のキマイラ飼育記 (はてなBlog)] Git BashはMinGW/MSYSベースなので、そちらと同様に、MSYSTEM環境変数を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;に設定すると/mingw64/binがパスに入る。ここにはgit.exeが入っているが、git.exe自体は実は/cmdに入っているので、そのことによる実効的な違いはあまりない。ということらしい。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただgit以外にもxzコマンドとか/mingw64/binにしかないものもいくつかあるので、違いが全くないわけでもない。（なぜxzがこっちに入っているんだろう？）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;MSYSTEMに何も設定せずusr/binにあるbashに&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を付けて実行したところ、MSYSTEMはMSYSに設定され、パスには/mingw64/binがないかわりに&amp;lt;strong&amp;gt;/opt/binが追加&amp;lt;/strong&amp;gt;されている。しかし実際には/optフォルダはGit Bashのインストール時には存在しておらず、無意味である。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== アプリ実行エイリアスの扱い ==&lt;br /&gt;
&lt;br /&gt;
wt.exeやmspaint.exeなどストアアプリ系の実行ファイルは「アプリ実行エイリアス」というやや特殊な仕組みで管理されており（例えばエクスプローラーで見るとこれらのファイルサイズは0バイトである）、Cygwin系と相性が悪い。Git BashではPermission Deniedでこれらのファイルの実行ができないという問題があった。最新リリースでは修正されている。&lt;br /&gt;
&lt;br /&gt;
[https://github.com/git-for-windows/git/issues/2675 Permission Error on all App Execution Aliases in git&amp;amp;#45;bash · Issue &amp;amp;#35;2675 · git&amp;amp;#45;for&amp;amp;#45;windows/git]&lt;br /&gt;
&lt;br /&gt;
Cygwinでは、実行は問題ないがwhich wtとすると見つからないと言われる（Git Bashでは大丈夫そう）（2023/08時点）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwinのforkに関するエラーを直す&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwinのforkに関するエラーを直す ==&lt;br /&gt;
&lt;br /&gt;
setupを再実行してバイナリがアップデートされた後に、以下のようなエラーが頻発するようになることがある。毎回出るわけではなく、確率的に生じるので厄介である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;child -1 – forked process 9272 died unexpectedly, retry 0, exit code 0xC0000142, errno 11&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;40 [main] bash 3348 fork: child -1 - forked process 4248 died unexpectedly, retry 0, exit code -1073741819, errno 11&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
解決方法はいくつかある（単に再起動などで治る場合もある？）らしいが、自分の場合は以下のようにrebaseallというのをやることで治った。&lt;br /&gt;
&lt;br /&gt;
[https://stackoverflow.com/questions/9300722/cygwin-error-bash-fork-retry-resource-temporarily-unavailable/14509551#14509551 Cygwin error&amp;amp;#58; &amp;amp;quot;&amp;amp;#45;bash&amp;amp;#58; fork&amp;amp;#58; retry&amp;amp;#58; Resource temporarily unavailable&amp;amp;quot; &amp;amp;#45; Stack Overflow]（元記事は[https://cygwin.fandom.com/wiki/Rebaseall https&amp;amp;#58;//cygwin.fandom.com/wiki/Rebaseall]らしい）&lt;br /&gt;
&lt;br /&gt;
ここには&amp;lt;code&amp;gt;rebaseall &amp;amp;#45;v&amp;lt;/code&amp;gt;と書いてあるが、手元ではそのようなオプションがなさそうだったので単純にrebaseallとしたら、それでうまく行ったようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;まとめると、手順は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Cygwin関連のプロセスをすべて終了させる。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;/usr/binにある&amp;lt;strong&amp;gt;dash.exe&amp;lt;/strong&amp;gt;を&amp;lt;strong&amp;gt;管理者権限で&amp;lt;/strong&amp;gt;起動させる（おそらく軽量で依存関係が少ないから？）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;./rebaseall&amp;lt;/code&amp;gt;を実行&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;他には以下のようにWindowsのセキュリティ設定をいじる方法もあるようだが、ちょっと不安。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://oni-gili.org/archives/290 https&amp;amp;#58;//oni&amp;amp;#45;gili.org/archives/290]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://umateku.com/archives/462 https&amp;amp;#58;//umateku.com/archives/462]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwinでcmdにを出力させる&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Cygwinでcmdに&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を出力させる ==&lt;br /&gt;
&lt;br /&gt;
[https://cygwin.com/pipermail/cygwin/2020-June/245226.html change in handling quotes in cygwin package from 3.1.4&amp;amp;#45;1 to 3.1.5&amp;amp;#45;1]にある通り、Cygwinでcmd（を含むWindowsネイティブのプログラム？）にダブルクォーテーション単体（あるいはダブルクォーテーションを途中に含む任意の文字列など）を渡すのは難しい（難しくなった？）。環境変数に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を入れておいて渡すという手はあるが、衝突する可能性も考えられる。一番確実なのは、与えられた引数に含まれる指定された文字列を全て&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に置き換えて実行するようなプログラムを別途書くことだろう（気が向いたらやるかも）。&lt;br /&gt;
&lt;br /&gt;
* [https://twitter.com/e9g/status/1660590434429865984 https&amp;amp;#58;//twitter.com/e9g/status/1660590434429865984]も参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwinなどでbatやvbsを拡張子無しで呼ぶ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Git Bash/Cygwinなどでbatやvbsを拡張子無しで呼ぶ ==&lt;br /&gt;
&lt;br /&gt;
Windows上では、実行ファイルの拡張子（の主流）である.exe以外にもバッチファイル（.bat）やVBScript（.vbs）などが環境変数&amp;lt;code&amp;gt;PATHEXT&amp;lt;/code&amp;gt;に登録され、拡張子無しで呼び出すことができる。しかし、Git Bash/Cygwinでは、exeのみが省略でき、他は明示的に付けないと呼び出せない。これは[https://qiita.com/snipsnipsnip/items/03b3bb9149954cb44bea Git Bashで.batや.lnkを使うとき拡張子を省く &amp;amp;#45; Qiita]のようにbash側で設定すると解決できる（が、あまり綺麗な方法とはいえない気がする）（なおCygwinでは未確認）。また、よく使う操作をコマンド一発で呼び出したい時は、batではなくシェルスクリプトや前述のようにexeファイルを使う手もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;conhostexeで文字選択中に出力がブロックされる&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== conhost.exeで文字選択中に出力がブロックされる ==&lt;br /&gt;
&lt;br /&gt;
Windows コンソールホスト（conhost.exe）というのは、Windowsで従来ずっと使われてきたターミナルのことであり、この上でコマンドプロンプト（cmd.exe）やPowerShellやその他のコンソールアプリケーションが動く。conhost.exeに代わるものとして最近出てきたのがWindows Terminal（wt.exe）である。&lt;br /&gt;
&lt;br /&gt;
この2つは以下の画像の通り、概ね見た目で区別できる。（Windows11以降でWindows Terminalをデフォルトにする機能が追加されるようであるが、そうしていない場合は、）cmdやPowerShell、あるいはpythonやnode.jsなどの対話コンソールを普通に開いた際にはこの上側のような感じのウインドウが表示されるはずである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/conhost.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;conhost.exeの見た目&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/wt.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;Windows Terminalの見た目&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
しかし、あまり知られていないようだが、このconhost.exeには「&amp;lt;strong&amp;gt;文字を選択した状態（ウインドウタイトルに「選択」と出る）だと一切の出力がブロックされる&amp;lt;/strong&amp;gt;」という仕様があるようである（文字選択を容易にするため？参考&amp;amp;#58; [https://github.com/microsoft/terminal/issues/34 https://github.com/microsoft/terminal/issues/34]）。例えば&amp;lt;code&amp;gt;ping &amp;amp;#45;t localhost&amp;lt;/code&amp;gt;を実行して文字を選択してみるといいだろう。方向キーや文字を入力するなどして選択状態を解除すると出力は再開する。&lt;br /&gt;
&lt;br /&gt;
この仕様により、[https://stackoverflow.com/questions/8140804/how-can-i-stop-my-server-from-freezing-when-powershell-is-in-select-mode ruby on rails &amp;amp;#45; how can I stop my server from freezing when powershell is in &amp;amp;#39;select&amp;amp;#39; mode? &amp;amp;#45; Stack Overflow] などにあるように、サーバーアプリケーションの実行が出力の際に意図せずブロックされるといった問題が起こる（筆者は[[error_private_page|error_private_page]]のサーバーを使っている際にこの問題に気付いた）。また、詳しい条件はわからないが、筆者の経験では、&amp;lt;strong&amp;gt;単にそのコンソールウインドウを長時間使わず放置するだけでも同じ現象が発生する&amp;lt;/strong&amp;gt;ことがあり、文字選択をしないように気を付けるだけでは不十分なようである。&lt;br /&gt;
&lt;br /&gt;
解決策としては、conhost.exe以外のターミナルを使えばよい。比較的新しいWindowsであればWindows Terminal、それが無理ならCygwinやGit Bashのターミナル（mintty.exeだっけ？）などでもよい（ただGit BashはCygwinと比べてWindowsアプリケーションとの互換性が微妙な気もする。例えばcmd.exeを開いて方向キーを押すと不自然な動作をする）。また、あくまでブロックされるのは出力に際してであるため、&amp;lt;code&amp;gt;&amp;amp;gt; nul&amp;lt;/code&amp;gt;などで出力を全て捨てればブロックはされない（ただしそれでは不便という場合も多いだろう）。&lt;br /&gt;
&lt;br /&gt;
== cmd ==&lt;br /&gt;
&lt;br /&gt;
あまり知られていないが、cmdでもbashなどと同じように&amp;lt;code&amp;gt;PROMPT&amp;lt;/code&amp;gt;変数にエスケープ文字を入れることでプロンプト（&amp;lt;code&amp;gt;C&amp;amp;#58;\Users&amp;amp;gt;&amp;lt;/code&amp;gt;みたいなやつ）の色やスタイル（太字など）を変えられる。&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/nanagami1369/items/9f6894b0759f74519f1e コマンドプロンプトのプロンプトに色をつける方法 &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://chiyosuke.blogspot.com/2018/05/blog-post_7.html ちよぶろ。&amp;amp;#58; コマンドプロンプトの色を変える。]&lt;br /&gt;
&lt;br /&gt;
ただしVista以降～Windows 10の途中（1607より前？）ではcmd+conhostという組み合わせ（といっても多分cmdを使うとしたら事実上conhostが必要となる）だとエスケープ文字がそのまま表示されてしまい色がつかない。これは[https://github.com/adoxa/ansicon ansicon]で解決できる。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://qiita.com/TsuneoNakanishi/items/a86f52a406b99d202c06 WindowsコマンドプロンプトでのANSIエスケープシーケンスの使用 &amp;amp;#45; Qiita]など&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Windows Terminal ==&lt;br /&gt;
&lt;br /&gt;
プロファイルを自分で追加できるなどの仕様は、Windowsにしてはなかなか偉い感じがする。&lt;br /&gt;
&lt;br /&gt;
フォントは、GUIからではなく設定ファイルを変更する必要はあるが、変えられる。デフォルトのCascadia CodeよりConsolasのほうが英数字が日本語のちょうど半分のサイズになるので読みやすい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;quot;defaults&amp;quot;: {&lt;br /&gt;
            &amp;quot;font&amp;quot;:{   &amp;quot;face&amp;quot;: &amp;quot;Consolas&amp;quot;,&lt;br /&gt;
            &amp;quot;size&amp;quot;: 12&lt;br /&gt;
             }&lt;br /&gt;
        },&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;設定例&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CSSのように複数のフォントを指定することはまだできないようである。[https://github.com/microsoft/terminal/issues/2664 https://github.com/microsoft/terminal/issues/2664] まあこれはしょうがないだろう。&lt;br /&gt;
&lt;br /&gt;
== コマンドライン引数をめぐる仕様 ==&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Windowsでのターミナル環境}}&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=322</id>
		<title>Zotero</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Zotero&amp;diff=322"/>
		<updated>2025-04-02T08:37:44Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;文献管理ソフト。Firefox界隈由来のOSSで、割と自由に何でも設定できるので、そういうのが好きな人にはおすすめ。&lt;br /&gt;
&lt;br /&gt;
== 初期設定 ==&lt;br /&gt;
&lt;br /&gt;
Zoteroが提供するストレージは300MBとかしかないので外部のクラウドストレージで論文ファイルを管理するのがおすすめ。これに関しては [https://note.com/sdeso/n/n013952313c1b 【令和最新版】文献管理ソフト Zoteroのすゝめ｜SD｜note] が大変詳しく、これでほぼ十分であるが、いくつか追加しておく。&lt;br /&gt;
&lt;br /&gt;
* Zotero自体がもともとFirefoxのアドオンに由来している関係で、Zoteroの拡張機能の拡張子.xpiはFirefoxのアドオンのものと同一であるため、FirefoxからZoteroの拡張機能をダウンロードしようとしてクリックすると（アドオンと混同されて）「ファイルが壊れています」などと出ることがある。なので右クリックから保存を選ぶ。&lt;br /&gt;
* ファイルの自動命名は日本人だと苗字がLast Nameと判断されてしまうなど微妙であったが、うまく直せなさそうなのでデフォルト設定のままでよさそう。&lt;br /&gt;
* コレクションごとにフォルダ分けしたい場合は、”Use subfolder defined by”を\%c(linuxでもこれで大丈夫だが/%cでもよい)にする（この場合は、複数のコレクションに属するアイテムが発生しないよう気を付ける）。参考&amp;amp;#58;[https://dr-kayai.hatenablog.com/entry/2020/02/09/234427 Zoteroの使い方（我流、逐次更新） &amp;amp;#45; Bag of ML Words]など&lt;br /&gt;
&lt;br /&gt;
=== ブラウザ拡張の使い方など ===&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張はZotero起動時のみ使える。Zoteroのウインドウで論文を入れたい対象のコレクションを開いておいてからブラウザで拡張機能アイコンをクリックするとそこに入れてくれる。普通に左クリックしたときにEmbedded Metadataを使用しろみたいなエラーがでることがあるので、そういうときは右クリックしてそれっぽいのを選ぶ。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由せずに（ローカルにあるpdfを）入れるときは、ZoteroのウインドウにD&amp;amp;amp;D（このとき元の場所にファイルを残しておく必要がなければshiftを押せば削除される（移動になる））して取り込む。日本語論文などで文献情報がうまく読まれない場合は、Manual Entryを作成するしかない場合もあるが、J&amp;amp;#45;STAGEなどから取ってきたものであれば、改めてWebでその論文を探してブラウザ拡張で入れるとうまくいくこともある（pdfエディタで注釈などを記入済みならファイルだけ後で差し替えればよい）。&lt;br /&gt;
&lt;br /&gt;
ブラウザ拡張を経由しない場合、ZotFileのフォルダ内の適切なコレクションには分類されないので、適宜アイテムを選択してRename Attachmentsをする必要がある。なお（最初のサイトで推奨されている通り）”&amp;lt;strong&amp;gt;サブコレクションからアイテムを表示&amp;lt;/strong&amp;gt;”がonだと特定コレクションの中身（サブコレクション内部を含め）すべてに対してRename Attachmentできて便利だが、実はonでしなくてもマイ・ライブラリを押したときは全アイテムが表示されるのでそれで十分だと思う（あと、サブコレクションから表示されてるアイテムを別コレクションに移動しようとしても正しく元の場所から削除されずコピー扱いになってしまうデメリットもこれで解決できる）。なお、前述のようにクラウドストレージのフォルダをLocation of Filesに指定して同期している場合、Rename Attachmentsすることで初めてファイルが同期されることになるので、できるだけ早めにやっておくべし。&lt;br /&gt;
&lt;br /&gt;
また、Zotero内のゴミ箱に移動してもファイルは自動で移動されないし、完全に削除してもファイルは消えない。今のところの筆者の運用としては、一旦DELETEという名前のコレクションに移動してからRename and moveを実行し、適宜ゴミ箱に移動して（アイテムを）削除し、DELETEフォルダの中身も定期的に削除する、とやっている。&lt;br /&gt;
&lt;br /&gt;
== dateデータのフォーマットについて ==&lt;br /&gt;
&lt;br /&gt;
Zotero Connectorはサイトやpdfから論文の投稿（掲載？）日時を自動で取得してくれるが、結果の文字列はブラウザ本体の言語設定によって変わる。具体的には、日本語であれば「4月 22 , 2011」、英語であれば「April 22, 2011」のようになる。なお、そもそも日付が取得できず年と月だけあるいは年だけの論文、また日付まで取れても「2011&amp;amp;#45;04&amp;amp;#45;22」のような書式になる論文もあり、これはどのサイトから取得するかなどによって異なるとみられるが詳細不明。&lt;br /&gt;
&lt;br /&gt;
本来はこんな言語依存の単一文字列ではなく年、月、日それぞれ明示的に別のデータとして管理するのが筋だろう。実際、この仕様のせいで、Better BibTeXの使用時に問題が発生していた（後述）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;better-bibtex-for-zotero-nmd_mw_mark_link&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== [https://retorque.re/zotero-better-bibtex/ &amp;lt;strong&amp;gt;Better BibTeX for Zotero&amp;lt;/strong&amp;gt;] ==&lt;br /&gt;
&lt;br /&gt;
まずは普通に[https://retorque.re/zotero-better-bibtex/ Better BibTeX for Zotero]からxpiをインストール、再起動すると再びdrag&amp;amp;#45;and&amp;amp;#45;dropを有効にするため再起動しろと言われるので再起動する。Citation keyが追加されている。設定はZotfileのような別メニューではなくZoteroの設定画面に追加されている。[https://qiita.com/skrb_hs/items/73061b7a8e39f1e73e0d Zotero+BibTeXで参考文献の出力を自動化&amp;amp;amp;論文の引用で出てきた順にソートする]の通り、export→fieldsのfields to omit from exportにabstract,file,doiと書く。[https://plaza.umin.ac.jp/shoei05/wp/index.php/2020/10/31/206/ Zotero で citation keys を設定する ( zotero&amp;amp;#45;better&amp;amp;#45;bibtex ) &amp;amp;#45; shoei05]の通りCitation keysを&amp;amp;#91;auth&amp;amp;#58;lower&amp;amp;#93;&amp;amp;#91;year&amp;amp;#93;&amp;amp;#91;shorttitle1_1&amp;amp;#93;に変更する。&lt;br /&gt;
&lt;br /&gt;
Citation keyは「情報」タブに表示されているほか、メイン画面に表示することもできる。また検索でも使える（これは設定で無効にできる）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;日本語文献のcitation-keyについて&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 日本語文献のCitation Keyについて ====&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977 https&amp;amp;#58;//qiita.com/shiro_takeda/items/dfb857e69aa8ed2cc977]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;yearデータの不具合6760で修正済&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== yearデータの不具合(&amp;lt;u&amp;gt;6.7.60で修正済&amp;lt;/u&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
参考文献には出版年を書く必要があり、BibTeXではyearというフィールドに書かれる。このデータはZoteroの文献情報のdateのところから取得されており、「April 22, 2011」「2011&amp;amp;#45;04&amp;amp;#45;22」のようなdateのデータからは正しく「2011」だけを抽出してくれるが、dateが前述の「4月 22 , 2011」のような書式になっていた場合はうまくいかず、この文字列全てがBibTeX（.bib）に出力されてしまう（報告済み&amp;amp;#58; [https://github.com/retorquere/zotero-better-bibtex/issues/2449 &amp;amp;#91;Bug&amp;amp;#93;&amp;amp;#58; Japanese date format is not parsed correctly · Issue &amp;amp;#35;2449 · retorquere/zotero&amp;amp;#45;better&amp;amp;#45;bibtex]、6.7.61あたりで修正済み）。←の通り、Better BibTeXのエクスポート時に適用されるscript（Export → postscript）のところにデータを置換するための以下のようなコードを書いておくとよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;if (tex.has.year) {&lt;br /&gt;
tex.add({name: &#039;year&#039;, replace: true, value: tex.has.year.value.replace(/.* /, &#039;&#039;)})&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
設定箇所はこんな感じ↓&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/zot-settings.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 今は治っているかもしれないが、デバッグ出力を有効化して再起動してからスクリプトを一度編集しないとスクリプトが読み込まれないバグがあった（[https://github.com/retorquere/zotero-better-bibtex/issues/2447 https://github.com/retorquere/zotero-better-bibtex/issues/2447]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;zotero-protocolを使用した操作&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Zotero Protocolを使用した操作 ==&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
ZoteroはGUIのソフトであるが、コマンドラインからも一定の操作が可能である。具体的には、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//&amp;lt;/code&amp;gt;という形式のURL（URIスキーム）を以下のように指定してZoteroを起動することができる（既に起動していた場合は、画面に変化が起こる）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;zotero.exe -url &amp;quot;zotero://url/here&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
URLについては、明確にAPIとして仕様が定められたものではなさそうで、全体的にあまりドキュメントは充実していない。&lt;br /&gt;
&lt;br /&gt;
一例として、特定のコレクション内のアイテムが選択された状態にするということができる。コメントが不親切でわかりづらいが [https://github.com/zotero/zotero/blob/master/components/zotero-protocol-handler.js zotero/zotero&amp;amp;#45;protocol&amp;amp;#45;handler.js at master · zotero/zotero] の&amp;lt;code&amp;gt;scopeObject&amp;lt;/code&amp;gt;などと書いてあるあたりをよく読むと、&amp;lt;code&amp;gt;zotero&amp;amp;#58;//select/library/collections/&amp;amp;#123;collection_key&amp;amp;#125;/items/&amp;amp;#123;item_key&amp;amp;#125;&amp;lt;/code&amp;gt;という形式で指定すればよいことがわかる（groupIDなどと書いてある部分もあって紛らわしいが、groupというのはcollectionとは別の概念で、複数ユーザー間での共有のライブラリのようなものを指すようである）。&amp;lt;code&amp;gt;collection_key&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;item_key&amp;lt;/code&amp;gt;はどちらも&amp;lt;code&amp;gt;1A2B3C4D&amp;lt;/code&amp;gt;のような英数字による8文字の識別子である。ちなみにcollectionとitemにはそれぞれ&amp;lt;strong&amp;gt;ID&amp;lt;/strong&amp;gt;も割り当てられているがこちらは1～3桁くらいの数字でありkeyとは別なので注意。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;指定されたcitation-keyのアイテムをzoteroで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 指定されたCitation keyのアイテムをZoteroで開く ==&lt;br /&gt;
&lt;br /&gt;
前述の方法を応用して実装してみる。ここではCitation keyとしてBetter BibTeXのものを使うことを仮定する。&lt;br /&gt;
&lt;br /&gt;
まず、Citation keyからアイテムのキーを取得する部分を作る。Citation keyはBetter BibTeXが管理しているので（ここではデフォルトの&amp;amp;#126;/Zoteroに各種データがあると仮定して）&amp;amp;#126;/Zotero/better&amp;amp;#45;bibtex.sqliteを読めばアイテムのkeyとの対応がわかる。次にアイテムが所属するコレクション（複数ある場合は最初のもの）のkeyをzotero.sqliteから取得する。ここではIDを一旦経由する必要がある。&lt;br /&gt;
&lt;br /&gt;
Zoteroの起動中はデータベースファイルがロックされているが、[https://sqlite.org/forum/info/a2e9387b8ea1c919b2ad1ecafb417cebb15c48634c55b3abd6a9acbb2fabf797 SQLite Forum&amp;amp;#58; Option to open a database as read&amp;amp;#45;only despite locked.]にある通り、（Windowsなら）&amp;lt;code&amp;gt;sqlite3 &amp;amp;quot;file&amp;amp;#58;Zotero\\zotero.sqlite?mode&amp;amp;#61;ro&amp;amp;amp;nolock&amp;amp;#61;1&amp;amp;quot;&amp;lt;/code&amp;gt;のようにしてやると読み取り専用で開くことはできる（書き込まないのでこれで充分）。今回はpythonで実装するが、pythonのsqliteでもこのパラメータが同じく使える。&lt;br /&gt;
&lt;br /&gt;
コード例&amp;amp;#58;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;python&amp;quot;&amp;gt;import sqlite3&lt;br /&gt;
import sys&lt;br /&gt;
import json&lt;br /&gt;
import subprocess&lt;br /&gt;
db = sqlite3.connect(&#039;file:&#039;+sys.argv[1]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur = db.cursor()&lt;br /&gt;
cur.execute(&#039;SELECT data FROM &amp;quot;better-bibtex&amp;quot; where name=&amp;quot;better-bibtex.citekey&amp;quot;&#039;)&lt;br /&gt;
d = json.loads(cur.fetchone()[0])&lt;br /&gt;
mydict = {}&lt;br /&gt;
for item in d[&amp;quot;data&amp;quot;]:&lt;br /&gt;
    mydict[item[&amp;quot;citekey&amp;quot;]] = item[&amp;quot;itemKey&amp;quot;]&lt;br /&gt;
myKey = mydict[sys.argv[3]]&lt;br /&gt;
&lt;br /&gt;
db2 = sqlite3.connect(&#039;file:&#039;+sys.argv[2]+&#039;?mode=ro&amp;amp;nolock=1&#039;, uri=True)&lt;br /&gt;
cur2 = db2.cursor()&lt;br /&gt;
cur2.execute(&amp;quot;SELECT itemID FROM items WHERE key=?&amp;quot;, (myKey, ))&lt;br /&gt;
item_id = cur2.fetchone()[0]&lt;br /&gt;
cur2.execute(&amp;quot;SELECT collectionID FROM collectionItems WHERE itemID=?&amp;quot;, (item_id, ))&lt;br /&gt;
# 所属する最初のコレクションIDを取得&lt;br /&gt;
collection_id = cur2.fetchone()[0]&lt;br /&gt;
# collectionIDからcollectionKeyを取得&lt;br /&gt;
cur2.execute(&amp;quot;SELECT key FROM collections WHERE collectionID=?&amp;quot;, (collection_id,))&lt;br /&gt;
collection_key =cur2.fetchone()[0]&lt;br /&gt;
print(collection_key)&lt;br /&gt;
subprocess.run(f&#039;&amp;quot;C:\Program Files (x86)\Zotero\zotero.exe&amp;quot; -url &amp;quot;zotero://select/library/collections/{collection_key}/items/{myKey}&#039;)&lt;br /&gt;
db.close()&lt;br /&gt;
db2.close()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;zoto.py&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記コードは以下のように起動できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;python &amp;quot;path\to\zoto.py&amp;quot; &amp;quot;%USERPROFILE%\Zotero\better-bibtex.sqlite&amp;quot; &amp;quot;%USERPROFILE%\Zotero\zotero.sqlite&amp;quot; %1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [[Windowsのクリップボードを用いた選択コンテンツの取得|Windowsのクリップボードを用いた選択コンテンツの取得]]と組み合わせれば、選択文字列をCitation keyとするアイテムを一発で開くことも可能。&lt;br /&gt;
&lt;br /&gt;
== その他 ==&lt;br /&gt;
&lt;br /&gt;
アイテムが入っているコレクションを知りたいときはアイテムが選択された状態でCtrlキーを押すとよい。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=321</id>
		<title>Windowsでエクスプローラーからフォルダを各種ターミナルで開く</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%97%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E5%90%84%E7%A8%AE%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7%E9%96%8B%E3%81%8F&amp;diff=321"/>
		<updated>2025-04-02T08:37:33Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Explorerの右クリックメニューやアドレスバーからフォルダを各種ターミナルで開くための設定方法の紹介。cmd.exe, powershell（pwsh含む）, Cygwin, Git Bashの4つに対応。&lt;br /&gt;
&lt;br /&gt;
== 基本 ==&lt;br /&gt;
&lt;br /&gt;
* [[Windowsの右クリックメニューから複数ファイルをまとめて開く|Windowsの右クリックメニューから複数ファイルをまとめて開く]] のように、レジストリでフォルダ・フォルダ背景の右クリックメニューを編集できる。&lt;br /&gt;
** Windows10までの右クリックメニューに戻そう。&lt;br /&gt;
** &amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定値に直接コマンドを書く方法と、&amp;lt;code&amp;gt;DelegateExecute&amp;lt;/code&amp;gt;値（など）を使ってCOMを通じて実行する方法（このために[https://github.com/ge9/ExecuteCommand-Pipe https://github.com/ge9/ExecuteCommand-Pipe]（使い方はレポジトリの説明を参照）を作った）がある。&lt;br /&gt;
** HKLMにあるマシン全体の設定は、それ自体は管理者権限（あるいはTrustedInstallerなどさらに上の権限）がないと書き換えられないが、&amp;lt;strong&amp;gt;HKCUに値があればそちらが優先される&amp;lt;/strong&amp;gt;ので、自分だけに関する設定変更ならユーザー権限だけで可能である。&lt;br /&gt;
** &amp;lt;code&amp;gt;Directory&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;Directory\Background&amp;lt;/code&amp;gt;の直下に&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という名前でキーを作った場合は、自動的に&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;の内容が管理者権限で実行される。ただ、&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;という固定のただ一つの名前しか使えないため、例えば管理者としてコマンドプロンプトを開くメニューとPowerShellを開くメニューを共存させることができない。そのためこの記事では&amp;lt;code&amp;gt;runas&amp;lt;/code&amp;gt;キーを使用するのではなくコマンドの中で明示的に管理者としての実行を行っている。&lt;br /&gt;
* Explorerのアドレスバー（address bar, location barなど）にcommandと入力してEnterを押すと、そのフォルダをカレントディレクトリとして&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;というコマンドが実行される。&lt;br /&gt;
** このアドレスバーの仕様はおそらく「ファイル名を指定して実行」とほぼ同じ。&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;で（メインとして）指定するファイルはフルパスなら必ず動作し、Pathが通っているまたはApp Pathsに登録されているならファイル名だけでよく、さらにbatやexeの場合は拡張子も省略できる。さらに、ほとんど知られていないが実は&amp;lt;strong&amp;gt;App Pathsの値には実行ファイル以外も書ける&amp;lt;/strong&amp;gt;ようである。&lt;br /&gt;
** つまり、パスの通っているフォルダにあるimage.pngはフルパスを打たなくても「image.png」で開けるし、さらにはApp Pathsの&amp;lt;code&amp;gt;openimage.exe&amp;lt;/code&amp;gt;というキーにimage.pngのフルパスを書けば&amp;lt;code&amp;gt;openimage&amp;lt;/code&amp;gt;と打つだけで（実際にはそのような実行ファイルは全く存在しないにもかかわらず）image.pngが開くようになる。当然、vbsなども拡張子無しで呼び出せることになる。&lt;br /&gt;
&lt;br /&gt;
== ポイント ==&lt;br /&gt;
&lt;br /&gt;
==== パス名のルール ====&lt;br /&gt;
&lt;br /&gt;
* Windowsではパスの長さが260文字以下という制限がある。詳しくは[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] 参照。&lt;br /&gt;
** 制限を超えるような長いパスは&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;というプレフィックスを付けて（UNCパスの一種として）扱われる。&lt;br /&gt;
*** このようなフォルダをカレントディレクトリとしてコマンドを実行することはできないので、アドレスバーに打ち込む方式は使えない（System32をカレントディレクトリとして実行される）。wt &amp;amp;#45;dなどにも指定できない。&lt;br /&gt;
*** 右クリックメニューでは、commandの既定の値に直接書く方式の場合は、&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を設定しないと呼び出されなくなる。&lt;br /&gt;
*** シンボリックリンク/ジャンクションでパスを短くしてやれば普通に扱えるようになる&lt;br /&gt;
* 普通に入力できる文字でWindowsのファイル名に使えないのは、&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#58;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;の9個（エクスプローラーの画面で入れようとすると表示される）。&lt;br /&gt;
** その他、ヌル文字やタブスペースのような0x20未満の制御文字も使えない（はず）。&lt;br /&gt;
*** これらを含むファイルはGit Bash/Cygwinを使っても作れない。&lt;br /&gt;
*** NTFS自体の制限はおそらく&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;だけで、それ以外に関してはLinux上で作ってからWindowsで見ると見られることもある。中身の閲覧などは不可。&lt;br /&gt;
* また、末尾が空白またはピリオドのファイルも禁止で、Explorerやcmdでは作れない（自動で除去される）。&lt;br /&gt;
** これらはGit Bash/Cygwinなら作れる。前者はエクスプローラーで閲覧など多少の操作ができるが後者はほとんど何もできず、DelegateExecuteの右クリックメニューでもピリオドが外れた名前しか取得できない。&lt;br /&gt;
* 先頭が空白のファイルはExplorerだと作れないがcmdなら作れる。禁止ではないはず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
* Git BashではWindowsの実行ファイルにスラッシュ付きオプションを渡すときはスラッシュを2つにする必要がある。&amp;lt;code&amp;gt;cmd //c&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;bcdedit //v&amp;lt;/code&amp;gt;など。&lt;br /&gt;
* printf関数の%qオプションを使うと、文字列を&amp;lt;strong&amp;gt;エスケープされた状態にして&amp;lt;/strong&amp;gt;返してくれる。これはshからの呼び出し先の別のshで再びフォルダ名をcdなどの引数として利用したいときに使える。&lt;br /&gt;
** bash（POSIX互換ではない）の組み込みコマンドのprintfと、独立実行ファイル（GNU Coreutilsの一部）である/bin/printfがある。基本的な趣旨としては同一のコマンドだが、組み込みコマンドのほうは入力に&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が含まれていない限り結果にも&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が使われることはないようで、このおかげで意図しない動作を回避できることがある。今回扱う例に関しては前者が後者の上位互換であるということになる。後者を使っているものはそれでも動いたものである。&lt;br /&gt;
** そもそも%qは組み込みコマンドのほうにしかないという話もある。環境によって違いそう。&lt;br /&gt;
* &amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くような長いパスをカレントディレクトリにしていても、Git Bash/Cygwinに付属の（というかMSYS/Cygwin向けにコンパイルされた？）exeなら実行できる。&lt;br /&gt;
* Git Bashの(ba)shは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけて起動してもカレントディレクトリが維持されるが、&amp;lt;s&amp;gt;Cygwinの(ba)shは&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;をつけると強制的にホームディレクトリに移動する。&amp;lt;/s&amp;gt;&lt;br /&gt;
** 2024/4頃、Cygwinの挙動が変化し、カレントディレクトリが維持されるようになっていることに気付く。変わっていた方のバージョンは3.5.3、変わっていない方は3.3.6であった。&lt;br /&gt;
** ところで、[https://superuser.com/questions/345964/start-bash-shell-cygwin-with-correct-path-without-changing-directory Start bash shell (cygwin) with correct path without changing directory &amp;amp;#45; Super User]の通り、&amp;lt;code&amp;gt;CHERE_INVOKING&amp;lt;/code&amp;gt;という変数を1に設定しておけばカレントディレクトリは維持される。&lt;br /&gt;
* Git Bashにおいては環境変数を正しく設定するため&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;の時点で環境変数&amp;lt;code&amp;gt;MSYSTEM&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;MINGW64&amp;lt;/code&amp;gt;にしておく必要がある。[[Windowsでのターミナル環境|Windowsでのターミナル環境]] 参照。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershellpwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell/pwsh ====&lt;br /&gt;
&lt;br /&gt;
* バージョン5まで（Windows PowerShell）はpowershell.exe、6以降（PowerShell Core, PowerShell）はpwsh.exeと実行ファイル名が違う&lt;br /&gt;
** 以後、「powershell(.exe)」と「pwsh(.exe)」で呼び分ける。ただし手元ではpowershellの5.1とpwshの7.2～7.3くらいでしか試していないので、一部バージョンではまた違う可能性もある。&lt;br /&gt;
** pwshは必ずしもWindowsに標準では入っていないので、以下の例でもあまり依存しないように気を付ける。&lt;br /&gt;
** 基本、シングルクォートで囲えばほとんどの特殊文字が無効になり、シングルクォート自体を書くときは2つ並べる。ただし注意点として、驚くべきことにpowershell/pwshでは「&amp;lt;strong&amp;gt;全角のシングルクォート&amp;lt;/strong&amp;gt;（U+2018&amp;amp;#45;U+201B、&amp;lt;code&amp;gt;‘&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;’&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‚&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;‛&amp;lt;/code&amp;gt;の4つ）」も通常のシングルクォートと同じ効力があるので、同じようにエスケープする必要がある（参照&amp;amp;#58; [https://learn.microsoft.com/ja-jp/powershell/scripting/lang-spec/chapter-02?view=powershell-7.2 https&amp;amp;#58;//learn.microsoft.com/ja&amp;amp;#45;jp/powershell/scripting/lang&amp;amp;#45;spec/chapter&amp;amp;#45;02?view&amp;amp;#61;powershell&amp;amp;#45;7.2]）。掲載したスクリプトでは省略しているがやることは同じ。&lt;br /&gt;
* powershell.exe&lt;br /&gt;
** &amp;amp;#45;Commandがなくても付けたのと同じ扱いになる？&lt;br /&gt;
*** 逆に、&amp;amp;#45;Commandを付けなければいけないという点を除いてはpwshがpowershellの上位互換という感覚である（新しいのでそれはそう）。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダの扱いにバグがあり、cmdなどでこれらのフォルダをカレントディレクトリとした状態で5系のPowerShellを起動すると&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;amp;gt;&amp;lt;/code&amp;gt;をカレントディレクトリとして起動される（たとえば&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#93;&amp;amp;#91;&amp;lt;/code&amp;gt;なら前者、&amp;lt;code&amp;gt;C&amp;amp;#58;\somefolder&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;なら後者）。&lt;br /&gt;
** &amp;amp;#45;Fileを使用してスクリプトを実行するとき、ダブルクォーテーションで囲われていない &amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt; が引数に含まれているとエラーになるバグがある。&lt;br /&gt;
* powershell.exe・pwsh.exe共通&lt;br /&gt;
** 連続した&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;があるフォルダに関する挙動にバグがある。コンソールプログラムを実行しても新規ウインドウで開かれる、そこをカレントディレクトリとしたときにファイルをmvできないなど。&lt;br /&gt;
** &amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#93;&amp;lt;/code&amp;gt;を含むフォルダに関しても、絶対パス指定したりきちんとエスケープしたりすれば操作自体はできる（場合もある）。&lt;br /&gt;
*** エスケープはいずれも直前に&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;を付ける。&lt;br /&gt;
*** これらを特殊文字として扱いたくないときは&amp;lt;code&amp;gt;&amp;amp;#45;LiteralPath&amp;lt;/code&amp;gt;を付けると良い場合もある。&lt;br /&gt;
** UNCパスをカレントディレクトリにすることができるが、&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;lt;/code&amp;gt;とかいう謎のプレフィックスが付く。&lt;br /&gt;
** 末尾が空白のフォルダについてはcdできず、Cygwinなどでそのようなフォルダをカレントディレクトリとして起動したとしても&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\PowerShell\7&amp;lt;/code&amp;gt;に移動してしまう。&lt;br /&gt;
** 8.3形式のパスを強制的に長い名前に戻してcdしてしまう。その結果、長いフォルダをカレントディレクトリとして外部プログラムを実行できなくなる。&lt;br /&gt;
* PSModulePath環境変数の関係な気がするが、pwshの中でcmdを起動してその中でpowershellを起動したりするとPSReadLineモジュールが読み込めない（&amp;lt;code&amp;gt;PSReadline モジュールを読み込めません。コンソールは PSReadline なしで実行されています。&amp;lt;/code&amp;gt;）とか言われたりする&lt;br /&gt;
&lt;br /&gt;
==== 環境変数への置換 ====&lt;br /&gt;
&lt;br /&gt;
cmdなどを使うと&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;で囲われた環境変数（&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;など）が置換される。&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はファイル名にも普通に使える文字なので、注意が必要となる&lt;br /&gt;
&lt;br /&gt;
* 該当の名前の環境変数が定義されていたときのみ置換が行われ、定義されていなければそのままになる。&lt;br /&gt;
* &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;の置換は必ずしも&amp;lt;strong&amp;gt;cmdだけで行われるわけではない&amp;lt;/strong&amp;gt;。「ファイル名を指定して実行」、VBSのWscript.Shellのrun、conhost、wtの引数などでも行われる。しかしCreateProcessやShellExecute(Ex)やレジストリ値では行われない（無理やりREG_EXPAND_SZにしたら展開されるが、後述の&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;との適用順などは不明）。&lt;br /&gt;
* 一般には、環境変数には英数字とアンダースコアしか使えないとの説明もよくあるが、実際にはほとんどの記号が有効である。従って、&amp;lt;code&amp;gt;^%PATH^%&amp;lt;/code&amp;gt;のようなキャレットによるエスケープはcmd向けにはある程度有効だが、&amp;lt;code&amp;gt;PATH^&amp;lt;/code&amp;gt;という環境変数が定義されているとうまく動かない。&lt;br /&gt;
* （そういう変数が定義されていることは現実にほとんどないだろうし、それが保証できるなら以下の部分を読む必要はない）&lt;br /&gt;
&lt;br /&gt;
これを防ぐ方法はいくつかある。ちなみに、&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;でのエスケープというのはバッチファイルの中だけの話で、今回の場面では以下より簡単なエスケープ方法は多分ないと思う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;既に定義されているかもしれない環境変数をバックアップし、一時的にその中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変えて使用することでリテラル文字としての&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を表現し、後で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;すなわち、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;のような変数の中身をバックアップし、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に変え、未知の文字列中の&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をすべて&amp;lt;code&amp;gt;%MY_PERCENT%&amp;lt;/code&amp;gt;にすることで&amp;lt;strong&amp;gt;この部分が置換によって&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;に変わるのを利用して&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をそのまま渡すということである（環境変数の置換は左から順に行われるため、たとえば&amp;lt;code&amp;gt;%MY_PERCENT%PATH%MY_PERCENT%&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;が置換されることはない）。受け渡しが終わったら&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の中身を復元する。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、変数のバックアップとリストアを同じプロセス・スクリプト内で行える（&amp;lt;strong&amp;gt;呼び出した後に元に戻ってくる&amp;lt;/strong&amp;gt;）場面で有用である。呼び出し先プロセスでリストアすることも不可能ではないと思うが、環境変数には任意の文字が入る可能性があることを考えるとエスケープが大変困難になることが予想される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;VAR1, VAR2, VAR3, …のような無限個の変数を最初からチェックし、最初の未定義の変数を上記と同様に使用し、後で未設定にする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;ほぼ上記と同じだが、内容のリストアでなく未設定にするだけなので、呼び出し先プロセスでも容易に行える。ただし実装が面倒である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;へと置換して、置換のプロセスを抜けた段階で元に戻す。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;これは、&amp;lt;strong&amp;gt;最初の文字以外に&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;が含まれる&amp;lt;/strong&amp;gt;環境変数名は（実際に環境変数が設定されていたとしても絶対に）置換されないことがわかったためである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;%&amp;amp;#61;%&amp;lt;/code&amp;gt;（あるいは、&amp;lt;code&amp;gt;%&amp;amp;#61;VAR%&amp;lt;/code&amp;gt;など）は少なくともcmdの対話シェル上だと置換されてしまうので&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;へのエスケープだと不十分に見えるが、実際には&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;一つでも問題なく動く場合もあった。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;しかし、動かないときもあるので、多くの例では&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にエスケープしている。&amp;lt;code&amp;gt;&amp;amp;#61;%&amp;lt;/code&amp;gt;になっているものは、試した限りはそれでも問題なく動いているものである。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[https://learn.microsoft.com/en-us/windows/win32/procthread/environment-variables Environment Variables &amp;amp;#45; Win32 apps | Microsoft Learn]では「&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;は環境変数に使えない」と書かれていて、ダイアログからでも設定はできないが、レジストリだと無理やり設定できる。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ユーザー環境変数に設定する分にはとりあえず問題なさそうだが、システム環境変数にレジストリから&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;（と、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を名前に含むいくつかの変数。どれが原因かは正確にはわからない）を無理やり追加したら&amp;lt;strong&amp;gt;0xc000021のブルースクリーンでWindowsが起動しなくなった&amp;lt;/strong&amp;gt;（該当の変数を全て削除したら治った）のでこれはやってはいけない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみに、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;はUnix側では特殊文字ではないので、printfとの適用順はあまり気にする必要はない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;この方法のメリットは、一度置換してしまえばその文字列を何度使いまわしても変化がないことが保証されることと、未定義の変数の探索や変数のリストアが必要ないことである。&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;要は&amp;lt;code&amp;gt;%(&amp;amp;#61;を含まない文字列)%&amp;lt;/code&amp;gt;を含まない文字列だけを値にとる単射を構成すればいいだけなので、base64エンコーディングのようにしても構わない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ただ、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に置換するという操作はPowerShellやshにとっては容易でもcmdにとっては不可能に近いので、最終的な呼び出し先がcmdであるときには採用しづらい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、今回の記事ではcmdやvbsのRunを経由してコマンドを実行しているものが多くあるが、&amp;lt;strong&amp;gt;このスクリプトの内容自体もエスケープが必要&amp;lt;/strong&amp;gt;である。つまり、例えば&amp;lt;code&amp;gt;cmd /c&amp;lt;/code&amp;gt;の内側に&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;,&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;というPowershellコードが含まれるなら、&amp;lt;code&amp;gt;&amp;amp;#39;,&amp;amp;#39;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;という環境変数が定義されていた時にその部分が置換されてしまう。これを回避するのはそこまで難しくなく、この例であれば&amp;lt;code&amp;gt;$mypath.Replace(&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;),&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;のように&amp;lt;code&amp;gt;&amp;amp;#61;&amp;lt;/code&amp;gt;を含む無意味なコードを挿入すればよい。また、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をいったん&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;にしている部分に関しては、&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;ではなく&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#61;&amp;amp;#61;&amp;lt;/code&amp;gt;にすることで問題を避けられるだろう。無駄に複雑になるのでスクリプト例ではそのような措置はしていない。&lt;br /&gt;
&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
* UNCパス（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;だけでなく普通のUNCパスも含む）をカレントディレクトリにすることはできない（rdなど一部コマンドでの取り扱いは可能）。&lt;br /&gt;
* 末尾が空白のフォルダにcdすることはできないが、Cygwinなどでそのようなフォルダをカレントディレクトリとした状態でcmdを起動した場合は、そのフォルダをカレントディレクトリとして起動する（外部プログラムの起動はできないがcdなどの内部コマンドは有効で、一度でも出たら戻れない）。&lt;br /&gt;
* 各種のパース規則が本当に謎。特に引用符周りは地獄である。[https://thinca.hatenablog.com/entry/20100210/1265813598 cmd.exe のコマンドラインの仕様を解析してみた &amp;amp;#45; 永遠に未完成]を読むとわかるが、例えば「ファイル名を指定して実行」で以下の挙動を確かめよう。&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;と出る&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;&amp;amp;quot;a &amp;amp;amp; b&amp;amp;quot;c d&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;cmd /k echo &amp;amp;quot;a b&amp;amp;quot;c &amp;amp;amp; d&amp;amp;quot;&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;echo &amp;amp;quot;a b&amp;amp;quot;c&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;d&amp;amp;quot;&amp;lt;/code&amp;gt;がそれぞれ別々に実行される&lt;br /&gt;
** すなわち、&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;が一見特殊文字でないかのような振る舞いをする（そのまま出力される）割に、その前後で特殊文字の扱いが切り替わっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
* 以下、wtと略す（実行ファイル名がwt.exeなため）。パスが通っているものと仮定する。&lt;br /&gt;
* wtでは&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;が特殊文字になるようで、&amp;lt;code&amp;gt;\&amp;amp;#59;&amp;lt;/code&amp;gt;とエスケープが必要。[https://github.com/microsoft/terminal/issues/13264 https://github.com/microsoft/terminal/issues/13264] かな？&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;も&amp;lt;code&amp;gt;\&amp;amp;quot;&amp;lt;/code&amp;gt;にする必要がある。一方で、単一の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;は（うしろに&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;などがなければ）そのまま&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;になるようである。大丈夫なのか…？&lt;br /&gt;
* 起動時にカレントディレクトリがユーザーフォルダ（%USERPROFILE%）になる&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#45;d&amp;lt;/code&amp;gt;オプションで明示的に指定することができる&lt;br /&gt;
&lt;br /&gt;
==== 連続空白 ====&lt;br /&gt;
&lt;br /&gt;
空白が連続するファイル名の対応は割と厄介である。Windows側では引数を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;で囲うことで、またsh側では適宜&amp;lt;code&amp;gt;IFS&amp;amp;#61;&amp;lt;/code&amp;gt;と設定することで対処できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;unicode対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Unicode対応 ====&lt;br /&gt;
&lt;br /&gt;
* UTF8を使おう&lt;br /&gt;
* &amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が一応使えるが、一旦シェル内部に入らないと使えないのでやや不便&lt;br /&gt;
** 使わなくても大丈夫なときもある。あまりちゃんと理解できていないが、経験上、powershellで&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;変数を用いて標準入力を受け取る際には&amp;lt;code&amp;gt;chcp 65001&amp;lt;/code&amp;gt;が必要そう。&lt;br /&gt;
* /bin/printfやprintfの実行時には&amp;lt;code&amp;gt;LANG&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;en_US.UTF8&amp;lt;/code&amp;gt;とかに設定する。&lt;br /&gt;
** Cygwinなら不要？&lt;br /&gt;
&lt;br /&gt;
==== デバッグ時 ====&lt;br /&gt;
&lt;br /&gt;
* 管理者権限のものを試すときでもまず&amp;lt;code&amp;gt;&amp;amp;#45;Verb Runas&amp;lt;/code&amp;gt;を外して動作確認するとよい。&lt;br /&gt;
* 後述のwaitrunも役に立つだろう。&lt;br /&gt;
* 特殊文字に関しては、最初は空白のないフォルダ、次に空白のあるフォルダや連続空白のあるフォルダ、次にシングルクォートや&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;を含むフォルダなどとだんだん難しくしていくとよい。&lt;br /&gt;
* それとは別に、Unicode対応、&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;（ドライブ直下）対応、259文字のフォルダ対応（後述）などをチェックする&lt;br /&gt;
* 難しい例は、例えば&amp;lt;code&amp;gt;z  𠮷𠮷%PATH%  &amp;amp;#39;  &amp;amp;#39;&amp;amp;#39;  `  `` $PATH &amp;amp;amp; &amp;amp;amp;&amp;amp;amp;   %%PATH%%&amp;amp;#91;&amp;amp;#93; &amp;amp;#93; &amp;amp;#91;  ^  ^^   &amp;amp;#39;  &amp;amp;#59;  &amp;amp;#59;&amp;amp;#59;  𩸽𩸽!PATH!&amp;amp;#35;$%&amp;amp;amp;&amp;amp;#39;()&amp;amp;#61;&amp;amp;#126;&amp;amp;#123;`+&amp;amp;#125;_,.&amp;amp;#93;&amp;amp;#91;&amp;amp;#59;@^&amp;amp;#45; &amp;amp;#45; ‘ ’ ‚ ‛&amp;lt;/code&amp;gt;のような感じ（適当）。こんなファイル名を現実に見ることはないが、エクスプローラー上で普通に入力できる内容である。&lt;br /&gt;
** 「𠮷」はBMP外かつJIS外の漢字としては最も変換で出しやすいのでテストに重宝する。（𩸽はBMP外だがJIS外ではない（第4水準））&lt;br /&gt;
&lt;br /&gt;
==== その他 ====&lt;br /&gt;
&lt;br /&gt;
* デフォルトシェルは、通常ユーザーはwtでも管理者の場合はconhostに設定されているっぽい？&lt;br /&gt;
* &amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のようなドライブ直下のパスは末尾に&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を付けなければいけないことが多い。たとえばwt &amp;amp;#45;dの引数にする場合など。またcmdでcdコマンドや&amp;lt;code&amp;gt;CD&amp;lt;/code&amp;gt;環境変数を見るときもドライブ直下のときだけは&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;が付いて返ってくる。&lt;br /&gt;
** ただ、wt &amp;amp;#45;d に&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;lt;/code&amp;gt;が渡されるように見えるのになぜか動いているものもある。未調査。&lt;br /&gt;
* shやcmdなどの中に一旦入ってしまうと一部の環境変数などが書き換わってしまうかもしれないが、多少は許容することとする。&lt;br /&gt;
* コマンド例は網羅的でない可能性があり、色々な書き方を提示しようとあえて統一していないところもある。現実にはもっと簡単なやり方があるかもしれない。あくまで一例ということで。&lt;br /&gt;
* CygwinとGit Bashはほぼ同じなのでGit Bashを主に載せてCygwinは適宜差分のみ記述する。&lt;br /&gt;
* shは、特にベースのシェルとして使うにはエスケープの方式などでWindowsと相性が悪く使いづらい感じがする。逆にcmdは内部コマンドは地獄だがベースのシェルとしては意外と副作用が少なく、そう悪くはない。&lt;br /&gt;
* 以下の例ではCygwinやGit Bashの実行ファイルにはPATHを通していないことを想定している。&amp;lt;code&amp;gt;C&amp;amp;#58;\cygwin64&amp;lt;/code&amp;gt;あたりは適当に読み替えていただきたい。&lt;br /&gt;
* 2021年途中ごろまで、wtなどのストアアプリ系？の実行ファイル（Explorer上で0バイトになってるエイリアス）をGit Bashから実行できない（Permission deniedとなる）バグがあった。 [https://github.com/git-for-windows/git/issues/2675 https://github.com/git-for-windows/git/issues/2675]&lt;br /&gt;
* ネットワークドライブは各ユーザー対象に割り当てられているせいなのか、&amp;lt;strong&amp;gt;管理者として実行すると利用できない&amp;lt;/strong&amp;gt;らしい。割り当てられる前のネットワークパス自体は有効。&lt;br /&gt;
* wtを管理者権限で呼び出すときに（確率的に）ウインドウが最前面にならないことがある。chcpの有無で変わったりするなど詳細不明。conhostだとならない気がする。startrunなどを介して実行すると必ず最前面に出るようになるっぽい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;準備&amp;amp;#58;-win&amp;amp;#45;console&amp;amp;#45;delegator&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 準備&amp;amp;#58; win&amp;amp;#45;console&amp;amp;#45;delegator ==&lt;br /&gt;
&lt;br /&gt;
cmdやPowerShellやCygwinのbashなどのシェルを使えば、スクリプトを起動して複雑なコマンドを呼び出せたり、パイプ実行が可能になったりと色々便利だが、それだけのためには大仰すぎて、特殊文字の扱いなどがかえって仇になることもある。&lt;br /&gt;
&lt;br /&gt;
そこで、シェル関連の操作に汎用的に使えるコマンドをいくつか作成して公開した。[https://github.com/ge9/win-console-tools https://github.com/ge9/win-console-tools]&lt;br /&gt;
&lt;br /&gt;
* 以前はC++で書いていた（[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator]）が、C&amp;amp;#35;のほうが文字列の扱いなどが簡明。&lt;br /&gt;
&lt;br /&gt;
ただし、これはあくまで筆者が独自に作ったものであり、Windows標準のもので何とかしようとするのが面白いところでもあるので、それほど積極的には使わない。今後出てくる例はすべて、これらを一切使わなくても（余計な環境変数が設定されてしまうかもしれないという点をのぞけば）同等の機能が実現できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられた引数を特定の文字列とつなげて実行してくれるプログラム。この実行ファイル自体の名前を適宜変更して使用し、「特定の文字列」は別のファイルから読ませる。使用例は[[Windowsでのターミナル環境|Windowsでのターミナル環境]] を参照。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;runother&amp;amp;#45;gui&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;runotherとほぼ同じだが、コンソールアプリケーションではなくWindowsアプリケーション（黒いウインドウが出ない、cmd上で実行したときに終了待ちが行われないなど）。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;evalrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行し、その出力をそのままコマンドラインとして実行するコンソールアプリケーション。（テキストファイルからのコマンドラインの読み込みなどに使える）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;startrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインをWindowsのデフォルトシェルで起動するだけのWindowsアプリケーション。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;waitrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを実行したあとキー入力を待ってから終了するコンソールアプリケーション。一瞬でウインドウが消えてしまうときのデバッグに使いやすい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;hiderun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;コンソールウインドウ非表示の状態で与えられたコマンドを実行するWindowsアプリケーション。（GUIアプリケーションなどを与えた場合は非表示にならないかも）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;vbsのvbHideでも非表示にできるが、コンソールウインドウの表示位置をみると非表示のウインドウが一つ挟まっていることが分かるのに対して、こちらの場合はそうならない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを最初の&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;とそれ以降の2つに区切ってそれぞれコマンドとしてパイプでつなげて実行するコンソールアプリケーション。ただし最初のコマンドのほうに&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;自体を入力したいときは&amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt;でエスケープする。また2つ目のコマンドの先頭の空白は除去される。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperunex&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;piperunと似ているが、2つだけでなく3つ以上の任意個のパイプ実行を一度に行う。一見便利だが、コマンドの後ろ側に未知の文字列が渡される場合、&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;をエスケープする必要が生じる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun piperunex command1 || command2 || ... || commandN | unknown_commandline&amp;lt;/code&amp;gt;のように外側を&amp;lt;code&amp;gt;piperun&amp;lt;/code&amp;gt;で囲うと安全。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;adminrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドラインを管理者として実行するWindowsアプリケーション。&amp;lt;code&amp;gt;ShellExecuteEx&amp;lt;/code&amp;gt;では実行ファイルパスと引数は別々に指定しなければいけないので最低限の引数の解析を行っている。PowerShell経由で管理者権限で実行するときのような面倒なエスケープが全て不要になるため非常に使いやすいが、この記事ではこれに依存しないようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;ちなみにこういうのもある。[https://github.com/mattn/sudo mattn/sudo&amp;amp;#58; sudo for windows] これは、通常のUACのように別ウインドウで実行するのではなく、localhostのランダムなポートを使い、自分自身にポート番号を渡しつつ管理者権限で呼び出すことで標準入出力を転送し、元の端末でそれを読み書きできるという点で、linuxのsudoに近い。しかし標準入出力を介しているので、&amp;lt;code&amp;gt;cmd /c for /?&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cmd /c pause&amp;lt;/code&amp;gt;の挙動が変わってしまうという問題がある。また、呼び出し元でchcp 65001をしていると文字化けする。また、コマンドライン引数を一旦配列に分割してから組み直しているので情報が一部落ちている。あと、セキュリティ的にも懸念があるかもしれないが、これはそもそもLinuxのsudo自体がまずどうなの？という気持ちになった。（未解決）（参照&amp;amp;#58; [https://twitter.com/e9g/status/1687385469921931264?s=20 https&amp;amp;#58;//twitter.com/e9g/status/1687385469921931264?s&amp;amp;#61;20]）&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;uacrun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startrunと同じだが、コンパイル時のマニフェスト設定でこのプログラム自体の実行に管理者権限を要求するようにしたので、adminrunと同じように使える（管理者権限で実行する対象が渡されたコマンドではなくuacrun自体になるという違いはある）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pecho&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;与えられたコマンドライン引数をそのままコンソールに出力する。→WindowsでUnicode文字（特にU+10000以上）を正しく表示（&amp;amp;amp;ファイルに書き込み）するには、「出力先がコンソールならWriteConsoleW、そうでなければWriteFileを使用する」といった非常に面倒な実装が必要であり（参照&amp;amp;#58; [https://twitter.com/mattn_jp/status/542581083242364928 https&amp;amp;#58;//twitter.com/mattn_jp/status/542581083242364928] など）、C++やC&amp;amp;#35;では扱いづらい。そこでrustを用いて実装した。→[https://github.com/ge9/pure-echo-win pure&amp;amp;#45;echo&amp;amp;#45;win]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;printcd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;カレントディレクトリをコンソールに出力する。（ちなみにpwdの由来はprint working directoryなのでそれに倣った）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;注意&amp;amp;#58;-当初は後述のnoworkingdirectoryを知らなかったので1の方法に頼っていたが実際には2の方法のほうが簡明なのでそちらを使うことを勧める1は残しておくが読む必要はあまりない&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 注意&amp;amp;#58; 当初は後述のNoWorkingDirectoryを知らなかったので1.の方法に頼っていたが、実際には2.の方法のほうが簡明なので、そちらを使うことを勧める。1.は残しておくが、読む必要はあまりない。 ==&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;1標準入力から受け取る場合&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.標準入力から受け取る場合 ==&lt;br /&gt;
&lt;br /&gt;
まず「標準入力からディレクトリのフルパスを受け取り、そのディレクトリで各種ターミナルを起動するコマンド」を紹介する。&lt;br /&gt;
&lt;br /&gt;
そのようなコマンドを仮に&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;とすると、ExecuteCommand&amp;amp;#45;Pipeを使用して、レジストリ（該当CLSIDのLocalServer32の既定の値）に以下のように書くことで、CLSIDが右クリックメニューのDelegateExecute値に使えるようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C&amp;amp;#58;\path\to\ExecuteCommand4000.exe h openterm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt;はコンソールウインドウを非表示にするExecuteCommand&amp;amp;#45;Pipeのオプションである。&lt;br /&gt;
&lt;br /&gt;
また、この&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分は非常に長くなることがあり、その場合レジストリに書いて直接編集するのは手間がかかる（操作もしづらいし、更新を即座に反映させるために「&amp;lt;code&amp;gt;LocalServer32&amp;lt;/code&amp;gt;」キーの名前などを変えて戻す必要もあって面倒）。そこで、runotherを使ってtxtに&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の内容をそのまま書くことで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;の部分にそのexeの名前だけを書けばよくなる。&lt;br /&gt;
&lt;br /&gt;
また、いくつかはCygwin/Git Bash向けに冒頭でcygpathによる変換を入れているが、これを取り除けば、Cygwin/Git Bash用のパスを受け取って動作するコマンドということになる。&lt;br /&gt;
&lt;br /&gt;
では以下で、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分についてそれぞれ紹介する。&lt;br /&gt;
&lt;br /&gt;
* 直接コマンド記入でも&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;を指定すれば&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;に対応できるというのをこのセクションの大部分を書き終えてから知ったので、&amp;lt;strong&amp;gt;このセクションは内容の多さの割には実際の必要性はそこまで大きくないかもしれない&amp;lt;/strong&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git&amp;amp;#45;bashexeで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;で開く ====&lt;br /&gt;
&lt;br /&gt;
この場合shの感覚で&amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;に引数を渡せば勝手にminttyのウインドウで開いてくれるので最も楽である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.utf8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Git BashのcygpathでGit Bash用のパスに変換&lt;br /&gt;
* printfでエスケープ、utf8を設定&lt;br /&gt;
* git&amp;amp;#45;bash.exeに渡す&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-①startrunを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ①startrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git&amp;amp;#45;bash.exe&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;C&amp;amp;#58;\Program Files\Git\bin&amp;lt;/code&amp;gt;のbashではなく/usr/binのbash.exeを使う。以後同じ。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトのターミナルで開く&amp;amp;#58;-②cmdのstartを使う&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトのターミナルで開く&amp;amp;#58; ②cmdのstartを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/\\^/^^/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;amp;/^&amp;amp;amp;/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125; ^| sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* この場合、cmdによる環境変数への置換を避ける必要があるほか、キャレットによるエスケープにも対応する必要がある。&lt;br /&gt;
* Git Bashからcmdを実行しているので&amp;lt;code&amp;gt;//c&amp;lt;/code&amp;gt;のところのスラッシュは2つ。&lt;br /&gt;
&lt;br /&gt;
==== conhostで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; conhost &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;quot;$(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g)&amp;amp;quot;&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
conhostによる環境変数の置換を抑制。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminalで開く&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminalで開く ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8 printf %q $(/bin/sed &amp;amp;#39;s/%/&amp;amp;#61;%/g&amp;amp;#39;)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%/%/g) \\&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
上記に加えてセミコロンへの対応が必要なのと、こっちは/bin/printfじゃなくて組み込みのprintfでこうしないとだめだった。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cygwin&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Cygwin ====&lt;br /&gt;
&lt;br /&gt;
付属のminttyを使うものだけはGit Bashと割と差があるので載せる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\mintty.exe&amp;amp;quot; &amp;amp;#45;e &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-startrun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, startrun ====&lt;br /&gt;
&lt;br /&gt;
* パスのエスケープがおかしい気がするが、なぜか動いている&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; startrun powershell  &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;quot;&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;&amp;amp;#39;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-cmdのstart&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル, cmdのstart ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;%/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; cmd //c start &amp;amp;quot;&amp;amp;quot; powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;\&amp;amp;#39;&amp;amp;#123;&amp;amp;#125;\&amp;amp;#39;.Replace(\&amp;amp;#39;&amp;amp;#61;^%\&amp;amp;#39;,\&amp;amp;#39;%\&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]] でも書いた通り、Windows側は&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのフォルダだけは（その必要があるにもかかわらず）8.3形式を使った短いパスにして渡してくれない。そこで、パス長さが258を超えていればcmdに渡して8.3形式の名前に変換する処理をPowerShell側で行う。この際はエスケープされていない正確なパス名をcmdに渡さなければならないので&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;の値を一時的に&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に設定する方法をとっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;念のため再確認しておくが、この&amp;lt;code&amp;gt;&amp;amp;#39;%MY_PERCENT%&amp;amp;#39;&amp;lt;/code&amp;gt;の部分は&amp;lt;code&amp;gt;&amp;amp;#39;%&amp;amp;#39;.Trim(&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;)+&amp;amp;#39;MY_PERCENT%&amp;amp;#39;)&amp;lt;/code&amp;gt;などと変えておかないと、&amp;lt;code&amp;gt;MY_PERCENT&amp;lt;/code&amp;gt;が定義されていた場合に正しく動作しない。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cmdでは&amp;lt;strong&amp;gt;ちょうど258文字&amp;lt;/strong&amp;gt;のフォルダでもdirが失敗するなど挙動が不自然であるため、もう少し保守的に&amp;lt;strong&amp;gt;257&amp;lt;/strong&amp;gt;を超えていれば短くするという仕様でもいいかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;（追記）8.3形式のパスを取得するのは普通にPowerShell内でもできるらしい…。以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; (New&amp;amp;#45;Object &amp;amp;#45;ComObject Scripting.FileSystemObject).GetFolder($mypath).ShortPath&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
259文字のフォルダを無視するなら以下のように簡潔に済む。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command wt &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39; $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
これは案外難しい。なぜなら、cmd内でcdさせるのは%のエスケープの関係で難しく（cmd内で&amp;amp;#61;を含む文字列を置換することがどうやってもできなさそう（外部プログラムを呼び出すのも難しそうだった）なので、未定義の変数を探索するやり方しかない）、Start&amp;amp;#45;Processの&amp;amp;#45;WorkingDirectoryやCygwinのshは8.3形式に対応していないからである。要は「与えられたディレクトリ（8.3形式のパスが含まれるかもしれない）をカレントディレクトリとして与えられたコマンドを実行する」だけやってくれるプログラムがあればよく、これ自体はそう難しくないことのはずだが、現状、Windows標準環境でこれができるのは自前でプログラムをコンパイルする以外だと（pwshを入れていいならpwshと）&amp;lt;strong&amp;gt;vbsしかない&amp;lt;/strong&amp;gt;ようである。結局、この部分をついでにやってくれるWindows Terminalのほうが楽ということになる。&lt;br /&gt;
&lt;br /&gt;
たとえば以下のようなvbsを用意する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight style=&amp;quot;margin-bottom:0.2em;&amp;quot; lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Set objShell = CreateObject(&amp;quot;WScript.Shell&amp;quot;)&lt;br /&gt;
objShell.CurrentDirectory = WScript.Arguments(1)&lt;br /&gt;
objShell.Run(WScript.Arguments(0)),,False&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;div style=&#039;text-align: center;&#039;&amp;gt;startatdir.vbs&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
すると以下のように書ける。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
なお&amp;lt;code&amp;gt;startatdir.vbs&amp;lt;/code&amp;gt;のパス指定はフルパスが必要そう（ただしここはcmd /cの中なので&amp;lt;code&amp;gt;%USERPROFILE%&amp;lt;/code&amp;gt;とかを使って書いてもよい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;11標準入力から受け取る場合-&amp;amp;#45;-管理者権限あり&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 1.1.標準入力から受け取る場合 &amp;amp;#45; 管理者権限あり ==&lt;br /&gt;
&lt;br /&gt;
上記の続きで、こちらは管理者権限ありのもの。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39; &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39;, &amp;amp;#39;&amp;amp;quot;`&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe`&amp;amp;quot;&amp;amp;quot;&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;i&amp;amp;#39; , &amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start&amp;amp;#45;Process自体がstartみたいなものなので、引数にコンソールアプリケーションを指定したらデフォルトシェルで開かれる。&lt;br /&gt;
* 最後のところ、「&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59; exec bash\&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;」のかわりに「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 とか「&amp;lt;code&amp;gt;&amp;amp;#39;\&amp;amp;#39;\&amp;amp;quot;cd &amp;amp;#123;&amp;amp;#125;&amp;amp;#59;exec bash&amp;amp;quot;\&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;」 でも動くのは謎。シングルクォーテーションのエスケープ規則がわからない。参考→[https://twitter.com/e9g/status/1678283164689760256 https&amp;amp;#58;//twitter.com/e9g/status/1678283164689760256]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF&amp;amp;#45;8 printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;#39;&amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot;&amp;amp;#39; , &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot; , &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;&amp;amp;#45;login&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;&amp;amp;quot;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39; &amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== adminrunを使う ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\cygpath&amp;amp;quot; &amp;amp;#45;f &amp;amp;#45; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; /bin/env LANG&amp;amp;#61;en_US.UTF8 /bin/printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; adminrun wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; &amp;amp;quot;MSYSTEM&amp;amp;#61;MINGW64&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g) \\&amp;amp;#59; exec bash&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#123;&amp;amp;#125;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;#39;&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Cygwin系なしで&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;set&amp;amp;#45;location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;literalpath&amp;amp;#39;,  (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;) &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== cmd ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;デフォルトシェル-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== デフォルトシェル ====&lt;br /&gt;
&lt;br /&gt;
再び、startatdir.vbsを使う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;gt; nul &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windows-terminal-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Windows Terminal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command &amp;amp;quot;$mypath&amp;amp;#61;($input | ForEach&amp;amp;#45;Object &amp;amp;#123; return $_ &amp;amp;#125;)&amp;amp;#59; $bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;%MY_PERCENT%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。259文字のフォルダを無視するなら以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;2直接コマンド記入の右クリックメニュー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 2.直接コマンド記入の右クリックメニュー ==&lt;br /&gt;
&lt;br /&gt;
レジストリの&amp;lt;code&amp;gt;command&amp;lt;/code&amp;gt;キーの既定の値に直接コマンドを記入する方式である。&lt;br /&gt;
&lt;br /&gt;
デフォルトでは、右クリックメニューを&amp;lt;strong&amp;gt;押した時点&amp;lt;/strong&amp;gt;でのフォルダ（フォルダを右クリックするメニューからだと&amp;lt;strong&amp;gt;対象フォルダの親&amp;lt;/strong&amp;gt;、フォルダ背景を右クリックするメニューなら対象フォルダ）をカレントディレクトリとしてコマンドが起動される。そのため&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けなければならないような長大なパスのフォルダでは動作しない。しかし、&amp;lt;code&amp;gt;shell\xxxx&amp;lt;/code&amp;gt;キーに&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;値&amp;lt;/strong&amp;gt;を設定することで、カレントディレクトリが必ず&amp;lt;code&amp;gt;C&amp;amp;#58;\Windows\System32&amp;lt;/code&amp;gt;に設定されるようになるので動くようになる。&lt;br /&gt;
&lt;br /&gt;
対象のディレクトリはどう取得するかというと、レジストリに書き込んだ値のうち&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;strong&amp;gt;という部分が対象ディレクトリに書き換えられて&amp;lt;/strong&amp;gt;コマンドが実行される。この&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;もC&amp;amp;#58;などの場合は&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;になる。コマンドの中で&amp;lt;strong&amp;gt;そのまま%という文字を使いたい場合はバッチファイルと同様に%%とエスケープする必要がある&amp;lt;/strong&amp;gt;ようである（これはどこにも書いてない？）。&lt;br /&gt;
&lt;br /&gt;
しかし、こうして渡される（特殊文字を含むかもしれない）ディレクトリ名を完璧に取得するのは意外と難しい。cmdに解釈させると&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換されてしまうし、シングルクォートとバッククォートが両方含まれているのでpowershellやshに渡すのも簡単ではない。&lt;br /&gt;
&lt;br /&gt;
コツは、powershell &amp;amp;#45;commandやsh &amp;amp;#45;cの中に直接書くのではなく、&amp;lt;strong&amp;gt;スクリプトへのコマンドライン引数として渡した上で、スクリプト内で引数として取得する&amp;lt;/strong&amp;gt;ことである。それぞれ、基本形（そのまま出力するだけ）は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;powershell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;というトークンを入れることでその後のパラメータの解析を行わないようにできる。args&amp;amp;#91;0&amp;amp;#93;は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;になるのでargs&amp;amp;#91;1&amp;amp;#93;を使う。レジストリに書く際は&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;をエスケープして&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%%&amp;lt;/code&amp;gt;。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;でも同様のことができる？&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;echo $args&amp;amp;#91;0&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;（args&amp;amp;#91;&amp;lt;strong&amp;gt;0&amp;lt;/strong&amp;gt;&amp;amp;#93;になっていることに注意）&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;というか、&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;%&amp;lt;/code&amp;gt;で書き進めてしまったが、本当は&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;&amp;lt;/code&amp;gt;のほうが安定するかもしれない。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;あるいは&amp;lt;code&amp;gt;$MyInvocation.Line&amp;lt;/code&amp;gt;を使う方法もある。この場合、powershellへの引数が全て（この例なら&amp;lt;code&amp;gt;&amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; ...&amp;lt;/code&amp;gt;のところから）取得されるので、目当ての部分を取り出すためにここでは最後から2番目の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;と最後の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;の間を取得するという風にしている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39; &amp;amp;#59; Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;昔のPowerShell（2くらい）で試してみたらこちらでないと&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;amp;&amp;lt;/code&amp;gt;あたりの処理がうまくいかない場合があった。argsを使うものからの書き換えは容易である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;sh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;sh &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;最後が&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;lt;/code&amp;gt;と閉じられていないのはミスではなく、&amp;lt;code&amp;gt;&amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;としてしまうと&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のときに&amp;lt;code&amp;gt;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;が渡されてしまうのでそれを避けるためである（これはかなりトリッキーなのでもう少し真面目にやってもいいとは思う）。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;UNCパスの最初の&amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt;が&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;に変わってしまう（手元では、Cygwinの場合は&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみで発生している？）という問題があり、適宜置換する必要がある。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これらの書き方はいわゆる「ワンライナー」的なものであるが、もちろん外部にスクリプトファイルを用意してもよい。&lt;br /&gt;
&lt;br /&gt;
また、外部にスクリプトを用意してよいという条件であれば、&amp;lt;strong&amp;gt;vbsも使用可能&amp;lt;/strong&amp;gt;である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この場合、まずレジストリには&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wscript &amp;amp;quot;C&amp;amp;#58;\path\to\script.vbs&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などと書く。スクリプトの内容は上記のレジストリの内容をほぼそのままWscript.ShellでRunすればよいが、&amp;lt;code&amp;gt;%V&amp;lt;/code&amp;gt;のかわりにWscript.Arguments(0)を挿入するのと、&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%%&amp;lt;/code&amp;gt;にエスケープしなくてよいのと、VBSなので文字列内の&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;は&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えなければならない。これに加え、Runの引数に含まれる&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;VAR&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;が置換の対象となるため、対象フォルダの文字列については&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;への置換でエスケープして、呼び出し先のpowershellなどで元に戻す。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;必要に応じてRunのオプションでvbHideを指定する。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;というか別に258文字を超えていたら云々みたいな処理も全部vbs側でやってしまってもよい（面倒なのでそういう例は載せていない）&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
バッチファイルに渡すのは、バッチファイルをcmdが呼び出す時点で&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のようなファイル名の環境変数は既に展開されてしまうので、どうやっても不可能。&lt;br /&gt;
&lt;br /&gt;
他には、（hiderunと）piperunとpechoを併用するという方法もあり、それらの実行ファイルを用意する必要があるという以外は綺麗にできる方法である。&lt;br /&gt;
&lt;br /&gt;
いずれにしろ、一旦取得できてしまえばあとは前述の&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込むだけでよい。ただ、実際にはわざわざ&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;に流し込まなくても（パイプを使わなくても）もっと簡単に起動できることもあるのでそちらを中心に紹介する。&lt;br /&gt;
&lt;br /&gt;
* commandの最初で指定する（メインの）実行ファイル（先ほどなら&amp;lt;code&amp;gt;powershell&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;）をファイル名単体で書く場合は、それが（メニューをHKCUで設定するならHKCUの（最近のWindowsならHKLMのでも可？）、HKLMで設定するならHKLMの）&amp;lt;strong&amp;gt;App Pathsキー&amp;lt;/strong&amp;gt;に登録されていなければならない（&amp;lt;strong&amp;gt;PATHは通っていなくてもいい&amp;lt;/strong&amp;gt;）。登録されていない場合はフルパスで指定する必要がある。&lt;br /&gt;
&lt;br /&gt;
=== 設定例 ===&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限なし ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;noexit &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath $args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;参考までに、Windowsにもともと入っているメニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell.exe &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;literalPath &amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これだとシングルクォートと連続スペースに対応できない。連続スペースだけなら&amp;lt;code&amp;gt;&amp;amp;#39;%V&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;quot;&amp;amp;#39;%V&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;に変えると解決できる。&amp;lt;code&amp;gt;%$&amp;amp;#91;&amp;amp;#93;`&amp;lt;/code&amp;gt;あたりは見た感じ問題なし。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;以下の解決策でもまだ不完全 [https://superuser.com/questions/1310258/open-powershell-window-here-file-explorer-context-menu-command-breaks-with-fol &amp;amp;quot;Open PowerShell window here&amp;amp;quot; File Explorer context&amp;amp;#45;menu command breaks with folder names with apostrophes (single quotes) &amp;amp;#45; Super User]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;この問題は[https://github.com/PowerShell/PowerShell/issues/6598 https://github.com/PowerShell/PowerShell/issues/6598]や[https://github.com/PowerShell/PowerShell/pull/6660 https://github.com/PowerShell/PowerShell/pull/6660] で扱われており、結局pwshでは&amp;amp;#45;WorkingDirectoryというパラメータが追加された。[https://github.com/PowerShell/PowerShell/issues/14091 https://github.com/PowerShell/PowerShell/issues/14091]にある以下の文字列をレジストリに書いたところ、正しく動作したので、pwshではこれでよい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh.exe &amp;amp;#45;NoExit &amp;amp;#45;RemoveWorkingDirectoryTrailingCharacter &amp;amp;#45;WorkingDirectory &amp;amp;quot;%V!&amp;amp;quot; &amp;amp;#45;Command &amp;amp;quot;$host.UI.RawUI.WindowTitle &amp;amp;#61; &amp;amp;#39;PowerShell 7 (x64)&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;wt powershell &amp;amp;#45;noexit &amp;amp;#45;Command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;wtで。標準入力のときとほぼ同じ。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;wt &amp;amp;#45;d ($mypath &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトターミナルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59; wscript &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39; cmd (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Windowsにもともと入っているメニューでは以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;cmd.exe /s /k pushd &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは（&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付くパスを除いて）ほとんどの場合に正しく機能するが、&amp;lt;code&amp;gt;%PATH%&amp;lt;/code&amp;gt;のような文字列が含まれているフォルダではうまくいかない。ちなみにpushdによりUNCパスには自動的にネットワークドライブが割り当てられる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;mintty（git&amp;amp;#45;bash.exe使用）&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bashのインストーラにより設定される「Git Bash Here」メニューでは以下のようになっている。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\git&amp;amp;#45;bash.exe&amp;amp;quot; &amp;amp;quot;&amp;amp;#45;&amp;amp;#45;cd&amp;amp;#61;%v.&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;これは、特殊文字にはすべて対応しているが、（NoWorkingDirectoryをつけたとしても）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;で始まるパスではうまくいかない。最後の「.」はよくわからないがこれを付けておくと&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;cd&amp;lt;/code&amp;gt;がうまくやってくれるっぽい。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;export MSYSTEM&amp;amp;#61;MINGW64&amp;amp;#59;exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\/\\\\\\\\/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe\&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 \&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;デフォルトシェルで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;cd $(echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;)&amp;amp;#59;exec bash&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;置換の対象を&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のみとするためsedの引数に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が増えている&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;wtで&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;echo $&amp;amp;#42;|/bin/sed &amp;amp;#39;s/\\\\?/\\\\\\\\?/&amp;amp;#39;|/bin/cygpath &amp;amp;#45;f &amp;amp;#45;|printf %%q $(/bin/sed &amp;amp;#39;s/%%/&amp;amp;#61;%%/g&amp;amp;#39;)|/bin/sed &amp;amp;#39;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;#39;|/bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|sed s/&amp;amp;#61;%%/%%/g)\\&amp;amp;#59;exec bash&amp;amp;#39;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;%V&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 管理者権限 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;PowerShell&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;環境変数の置換を抑止する必要がある。デフォルトシェルで起動するならこれは不要（で、wtでないので&amp;lt;code&amp;gt;&amp;amp;#59;&amp;lt;/code&amp;gt;のエスケープも不要）で、以下のようになる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;) &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;MyInvocationを使う例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl &amp;amp;#61; $MyInvocation.Line &amp;amp;#45;split&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath powershell &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, Set&amp;amp;#45;Location, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;vbsの例&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;次の節で解説する「（自分が起動された）カレントディレクトリでの起動」にも対応している（引数がない場合）。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;Dim objShell&lt;br /&gt;
Dim curDir&lt;br /&gt;
&lt;br /&gt;
Set ws = CreateObject(&amp;quot;Wscript.Shell&amp;quot;)&lt;br /&gt;
Dim dir&lt;br /&gt;
If WScript.Arguments.Count = 0 Then&lt;br /&gt;
   dir = ws.CurrentDirectory&lt;br /&gt;
Else&lt;br /&gt;
   dir = Wscript.Arguments(0)&lt;br /&gt;
End If&lt;br /&gt;
dir = Replace(dir,&amp;quot;%&amp;quot;,&amp;quot;==%&amp;quot;)&lt;br /&gt;
ws.run &amp;quot;powershell -Command &amp;quot;&amp;quot;&amp;amp; {Start-Process -Verb Runas -Filepath wt -Argumentlist powershell, -noexit, -command, Set-Location, -LiteralPath, (&#039;\&amp;quot;&amp;quot;&#039;&#039;&#039;+($args[1].Trim(&#039;\&amp;quot;&amp;quot;&#039;) -replace &#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;&#039; -replace &#039;;&#039;, &#039;\;&#039; )+&#039;&#039;&#039;.Replace(&#039;&#039;==%&#039;&#039;,&#039;&#039;%&#039;&#039;)\&amp;quot;&amp;quot;&#039;)}&amp;quot;&amp;quot; --% &amp;quot;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;amp;dir&amp;amp;&amp;quot;\&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;, vbHide&lt;br /&gt;
&lt;br /&gt;
Set objShell = Nothing&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;cmd&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+($mypath &amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;この場合も&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;のための対処（&amp;lt;code&amp;gt;&amp;amp;#45;replace &amp;amp;#39;\\$&amp;amp;#39;,&amp;amp;#39;\\\\&amp;amp;#39;&amp;lt;/code&amp;gt;）が必要である。デフォルトシェルなら、startatdir.vbsを使う。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$bak&amp;amp;#61;$env&amp;amp;#58;MY_PERCENT&amp;amp;#59;$mypath&amp;amp;#61;$args&amp;amp;#91;1&amp;amp;#93;.Trim(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; $env&amp;amp;#58;MY_PERCENT &amp;amp;#61; &amp;amp;#39;%%&amp;amp;#39;&amp;amp;#59;if ($mypath.Length &amp;amp;#45;gt 258) &amp;amp;#123; $mypath &amp;amp;#61; cmd /c \&amp;amp;quot;for %%A in (`\&amp;amp;quot;$($mypath.Replace(&amp;amp;#39;%%&amp;amp;#39;, &amp;amp;#39;%%MY_PERCENT%%&amp;amp;#39;))`\&amp;amp;quot;) do @echo %%&amp;amp;#126;sA\&amp;amp;quot; &amp;amp;#125;&amp;amp;#59;$env&amp;amp;#58;MY_PERCENT &amp;amp;#61; $bak&amp;amp;#59;Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wscript &amp;amp;#45;Argumentlist &amp;amp;#39;//Nologo&amp;amp;#39;, &amp;amp;#39;C&amp;amp;#58;\path\to\startatdir.vbs&amp;amp;#39;, &amp;amp;#39;cmd&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$mypath+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;%% &amp;amp;quot;\&amp;amp;quot;%V\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;理論上はワンライナーでも書けるが、エスケープが面倒すぎるのでファイルに書いたほうがよいだろう。まずレジストリの中身は以下のようにする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;quot;C&amp;amp;#58;\path\to\gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;で、&amp;lt;code&amp;gt;gb&amp;amp;#45;wt&amp;amp;#45;admin.sh&amp;lt;/code&amp;gt;の中身は以下。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
IFS=&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
echo $*|/bin/sed &#039;s/\\/\\\\/&#039;|/bin/cygpath -f -|printf %q $(/bin/cat) |/bin/sed &amp;quot;s/&#039;/&#039;&#039;/g;s/%/==%/g;s/;/\\\\;/g&amp;quot;|/bin/xargs -d &#039;\n&#039; -I {} powershell -Command Start-Process -Filepath wt -ArgumentList &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\env.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &#039;&amp;quot;MSYSTEM=MINGW64&amp;quot;&#039; , &amp;quot;&#039;&amp;quot;&#039;&amp;quot;C:\Program Files\Git\usr\bin\sh.exe&amp;quot;&#039;&amp;quot;&#039;&amp;quot; , &amp;quot;&#039;--login&#039;&amp;quot;, &amp;quot;&#039;-c&#039;&amp;quot;, &amp;quot;&#039;&amp;quot;&#039;&amp;quot;IFS=\;cd $(echo {}| /bin/sed s/==%/%/g) \; exec bash&amp;quot;&#039;&amp;quot;&#039;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Cygwinも同様である。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vs-codeのメニューおまけ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== VS Codeのメニュー（おまけ） ====&lt;br /&gt;
&lt;br /&gt;
「Code で開く」メニューのcommand値は以下のように設定されている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Microsoft VS Code\Code.exe&amp;amp;quot; &amp;amp;quot;%V&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは特殊文字などに関しても問題なく動作するうえ、実はそのまま&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付いたパスにも適用可能である。従って、&amp;lt;code&amp;gt;VSCode&amp;lt;/code&amp;gt;キーに&amp;lt;code&amp;gt;NoWorkingDirectory&amp;lt;/code&amp;gt;値を設定する（設定の書き換えまたはHKCUによるオーバーライド）だけで、長大フォルダでもVS Codeが使えるようになる。ターミナルの起動には失敗してしまうがファイル・フォルダの作成・編集などの基本操作がGUIでできるので意外と便利（もちろん、他のBetter Explorer的なツールを使う手もあるだろう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;3-エクスプローラーのアドレスバーから&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 3. エクスプローラーのアドレスバーから ==&lt;br /&gt;
&lt;br /&gt;
このときは、末尾が空白のパスや&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が必要な長大パスやちょうど259文字のフォルダはそもそも対応していないので考えなくてよい。しかし通常のネットワークファイル向けのUNCパス（&amp;lt;code&amp;gt;\\192.168.1.1\disk&amp;lt;/code&amp;gt;など）に対応する必要はあるので、cmdをベースにすることはできない（cmdの中に入った時点でカレントディレクトリが変わってしまう）。また&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;が含まれるパスをカレントディレクトリにできないことから、powershell.exeもベースとしては使えない。&lt;br /&gt;
&lt;br /&gt;
なので、パイプを使って先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;にむけて流し込もうと思ったら選択肢はpwsh.exeかpiperunかCygwin系だけである。それぞれの書き方は以下のようになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;pwsh&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;piperun&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;piperun pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;) | openterm&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;上とほぼ変わっていないが、pwshはディレクトリの取得だけで使っているので&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;のところで環境変数が汚染されるのを防げる。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin/Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;cmd //c \&amp;amp;quot;chcp 65001 &amp;amp;gt; nul\&amp;amp;quot;| pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | openterm&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;一つ問題があり、hiderunを使う（コンソールを非表示にする）とchcpが効かないようで、&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;でPowerShellの&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使っているとUnicode文字が化けてしまう。&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;先ほどの&amp;lt;code&amp;gt;openterm&amp;lt;/code&amp;gt;部分で先頭にcygpathが入っているものを使うときは、そちらのcygpathとこちらでのcygpath &amp;amp;#45;wは打ち消し合って無駄なので消してよい。&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このほかにvbs(wscript)もカレントディレクトリの取得のところは問題なくやってくれるので、それをさっきのWscript.Arguments(0)のかわりに使えばよい。&lt;br /&gt;
&lt;br /&gt;
最初に表示されるコンソールを非表示にしたければ、&amp;lt;code&amp;gt;hiderun&amp;lt;/code&amp;gt;を付けてrunother経由で実行するのが手軽だが、前述の通りvbsも拡張子無しで呼び出せるように設定できるので、そうした上でvbHideで隠してもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;管理者権限なし-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 管理者権限なし ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-3&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
これは普通にcmdと打てばよい。&lt;br /&gt;
&lt;br /&gt;
（デフォルトシェルがconhostだとして）wtで開きたいときは、&amp;amp;#59;をエスケープして&amp;amp;#45;dで渡す。以下の通りbatファイルを作ってpathを通す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wtではなくconhostの場合はconhost cmdだけでよい。batにするなら&amp;lt;code&amp;gt;start &amp;amp;quot;&amp;amp;quot; conhost cmd&amp;lt;/code&amp;gt;でよい。&lt;br /&gt;
&lt;br /&gt;
コンソール非表示ならcmd /cをつけてhiderunする。runotherで、txtの中身は以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command wt &amp;amp;#45;d $input.Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
pwshはそのままpwshと打てばよい。powershell及びwtやconhostを明示的に指定する場合について以下で述べる。&lt;br /&gt;
&lt;br /&gt;
たとえばwtでpwshなら、runotherを使って、txtの内容は以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command wt &amp;amp;#45;d $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;) pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellの場合は&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;に対応するため起動後に移動する。runotherでpiperunを使って、txtは以下。最終的に起動する方のpowershellで&amp;lt;code&amp;gt;&amp;amp;#61;&amp;amp;#61;%&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;に戻している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath (&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pwshが使えるならprintcdのかわりに&amp;lt;code&amp;gt;pwsh &amp;amp;#45;Command $pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;でもよい。&lt;br /&gt;
&lt;br /&gt;
以下はpiperunを使わずshでやる例。前述の通りパイプからPowerShell側で&amp;lt;code&amp;gt;$input&amp;lt;/code&amp;gt;を使って受け取ると文字化けするので引数として渡す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$(pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt powershell &amp;amp;#45;noexit &amp;amp;#45;command Set&amp;amp;#45;Location &amp;amp;#45;LiteralPath \(\&amp;amp;quot;&amp;amp;#39;$WD&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;,&amp;amp;#39;%&amp;amp;#39;)\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bashcygwin-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash/Cygwin ====&lt;br /&gt;
&lt;br /&gt;
Git Bashは&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;をつけてもカレントディレクトリを維持するので単純である。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinは起動後にcdする。そのかわり&amp;lt;code&amp;gt;export MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;が不要。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;/bin/bash &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;i &amp;amp;#45;c &amp;amp;#39;cd &amp;amp;#39;$(/bin/printf %q `pwd`)&amp;amp;#39;&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
printfで一旦エスケープしたものをcdの後につなげてそのまま渡している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;wtで&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Git Bash&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;wt &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\env.exe&amp;amp;quot; MSYSTEM&amp;amp;#61;MINGW64 &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\bash.exe&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;あれ、wtなのにカレントディレクトリ維持されてる…？wt cmdではダメなのだが…&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;Cygwin&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59;WD&amp;amp;#61;$(printf %q `pwd` | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59;  s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; wt \&amp;amp;quot;C&amp;amp;#58;\cygwin64\bin\bash.exe\&amp;amp;quot; &amp;amp;#45;&amp;amp;#45;login &amp;amp;#45;c &amp;amp;#39;IFS&amp;amp;#61;\\&amp;amp;#59;cd $(echo &amp;amp;#39;$WD&amp;amp;#39;|sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec bash&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 管理者権限あり ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cmd-4&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== cmd ====&lt;br /&gt;
&lt;br /&gt;
runotherを使って以下の通り。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;gt; nul &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TrimEnd(&amp;amp;#39;\\&amp;amp;#39;)&amp;lt;/code&amp;gt;のところは&amp;lt;code&amp;gt;C&amp;amp;#58;\&amp;lt;/code&amp;gt;の末尾のバックスラッシュへの対応である（&amp;lt;code&amp;gt;wt &amp;amp;#45;d &amp;amp;quot;C&amp;amp;#58;&amp;amp;quot;&amp;lt;/code&amp;gt;は通らないので一見ダメそうだが、なぜかこれで動く。原因不明。）。&lt;br /&gt;
&lt;br /&gt;
batならそのまま以下の通り（黒い画面が一瞬出てしまう）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$input.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
別解としてパイプを使わないものも載せておこう。cmdでは特殊文字ではないので&amp;lt;code&amp;gt;&amp;amp;#39;&amp;lt;/code&amp;gt;を&amp;lt;code&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/code&amp;gt;に変えるのは簡単である。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$args&amp;amp;#91;0&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;&amp;amp;#39;%CD&amp;amp;#58;&amp;amp;#39;&amp;amp;#61;&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以下もうまくいく。cmdの&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;に関する仕様により、例えばStart&amp;amp;#45;Processの直前に&amp;lt;code&amp;gt;echo &amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#59;&amp;lt;/code&amp;gt;のような&amp;lt;code&amp;gt;&amp;amp;quot;&amp;lt;/code&amp;gt;を奇数個含む文字列を入れると動かなくなる。argsを使うとバッククォートがうまくいかなかったのでMyInvocationを使ってみる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c powershell &amp;amp;#45;Command &amp;amp;quot;&amp;amp;amp; &amp;amp;#123;$spl&amp;amp;#61;$MyInvocation.Line.Split(&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;)&amp;amp;#59; Start&amp;amp;#45;Process &amp;amp;#45;Filepath wt &amp;amp;#45;Verb Runas &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$spl&amp;amp;#91;$spl.Length&amp;amp;#45;2&amp;amp;#93;.TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), cmd&amp;amp;#125;&amp;amp;quot; &amp;amp;#45;&amp;amp;#45; &amp;amp;quot;\&amp;amp;quot;%CD%\&amp;amp;quot;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell-pwsh-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== powershell, pwsh ====&lt;br /&gt;
&lt;br /&gt;
UNC非対応でよく、かつ（&amp;lt;code&amp;gt;``&amp;lt;/code&amp;gt;をカレントディレクトリとして起動できる）pwshでよければ、上記のcmdをpwshに変えればよい。powershellならSet&amp;amp;#45;Locationで移動が必要。以下をrunotherのtxtに書く。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun cmd /c &amp;amp;quot;chcp 65001 &amp;amp;amp; cd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;powershell&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;noexit&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;command&amp;amp;#39;, &amp;amp;#39;Set&amp;amp;#45;Location&amp;amp;#39;, &amp;amp;#39;&amp;amp;#45;LiteralPath&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; )+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UNC対応なら、管理者でないときと同じで、PSReadLineのエラーを回避するためpwshを一貫して使うのがいいだろう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun pwsh &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;#45;d&amp;amp;#39;, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;+$pwd.Path.Replace(&amp;amp;#39;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\&amp;amp;#39;, &amp;amp;#39;\\&amp;amp;#39;).TrimEnd(&amp;amp;#39;\\&amp;amp;#39;).Replace(&amp;amp;#39;&amp;amp;#59;&amp;amp;#39;,&amp;amp;#39;\&amp;amp;#59;&amp;amp;#39;)+&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;), pwsh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
powershellならpiperunを使う。カレントディレクトリの取得にpwshを使っているがprintcdでもよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex cmd /c chcp 65001 | printcd | powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;FilePath wt &amp;amp;#45;ArgumentList powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, (&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;+($input &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#59;&amp;amp;#39;, &amp;amp;#39;\&amp;amp;#59;&amp;amp;#39; &amp;amp;#45;replace &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;, &amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;  &amp;amp;#45;replace &amp;amp;#39;%&amp;amp;#39;, &amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;)+&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\&amp;amp;quot;&amp;amp;#39;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
shなら以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;WD&amp;amp;#61;$( pwd | /bin/cygpath &amp;amp;#45;w &amp;amp;#45;f &amp;amp;#45; | /bin/sed \&amp;amp;quot;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g&amp;amp;#59; s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59; s/%/&amp;amp;#61;&amp;amp;#61;%/g\&amp;amp;quot;)&amp;amp;#59; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;Argumentlist powershell, &amp;amp;#45;noexit, &amp;amp;#45;command, Set&amp;amp;#45;Location, &amp;amp;#45;LiteralPath, \(\&amp;amp;quot;&amp;amp;#39;\\\&amp;amp;quot;&amp;amp;#39;&amp;amp;#39;$WD&amp;amp;#39;&amp;amp;#39;.Replace(&amp;amp;#39;&amp;amp;#39;&amp;amp;#61;&amp;amp;#61;%&amp;amp;#39;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#39;%&amp;amp;#39;&amp;amp;#39;)\\\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;\)&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash-2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Git Bash ====&lt;br /&gt;
&lt;br /&gt;
runotherとpiperunで以下。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun piperunex &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd || printf %q $(/bin/cat)&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sed.exe&amp;amp;quot; &amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\&amp;amp;#59;/g&amp;amp;quot; | &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\xargs.exe&amp;amp;quot; &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, &amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;|| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;amp;#39;&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MSYSTEM&amp;amp;#61;MINGW64&amp;lt;/code&amp;gt;をもっと手前で設定して、&amp;lt;code&amp;gt;&amp;amp;#45;ArgumentList&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;login&amp;lt;/code&amp;gt;を指定して、最後を&amp;lt;code&amp;gt;exec bash&amp;lt;/code&amp;gt;にしてもよい。&lt;br /&gt;
&lt;br /&gt;
piperunを使わずにshで頑張ることもできるが、エスケープが多く読みづらくなる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;hiderun &amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe&amp;amp;quot; &amp;amp;#45;c &amp;amp;quot;IFS&amp;amp;#61;&amp;amp;#59; LANG&amp;amp;#61;en_US.UTF8&amp;amp;#59; pwd | printf %q $(/bin/cat) | /bin/sed \&amp;amp;quot;s/&amp;amp;#39;/&amp;amp;#39;&amp;amp;#39;/g&amp;amp;#59;s/%/&amp;amp;#61;&amp;amp;#61;%/g&amp;amp;#59;s/&amp;amp;#59;/\\\\\\\\&amp;amp;#59;/g\&amp;amp;quot; | /bin/xargs &amp;amp;#45;d &amp;amp;#39;\n&amp;amp;#39; &amp;amp;#45;I &amp;amp;#123;&amp;amp;#125; &amp;amp;#45;&amp;amp;#45; powershell &amp;amp;#45;Command Start&amp;amp;#45;Process &amp;amp;#45;Verb Runas &amp;amp;#45;Filepath wt &amp;amp;#45;ArgumentList &amp;amp;#39;\&amp;amp;quot;C&amp;amp;#58;\Program Files\Git\usr\bin\sh.exe\&amp;amp;quot;&amp;amp;#39;,&amp;amp;#39;&amp;amp;#45;c&amp;amp;#39;, \&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;IFS&amp;amp;#61;\\&amp;amp;#59; export MSYSTEM&amp;amp;#61;MINGW64\\&amp;amp;#59;cd $(echo &amp;amp;#123;&amp;amp;#125;| /bin/sed s/&amp;amp;#61;&amp;amp;#61;%/%/g)\\&amp;amp;#59; exec /bin/bash &amp;amp;#45;&amp;amp;#45;login\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot;&amp;amp;#39;\&amp;amp;quot; &amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cygwinも同様。&lt;br /&gt;
&lt;br /&gt;
== 関連 ==&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9 コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://qiita.com/tmiki/items/0dab4fd17e9bed04ed91 【Windows】GitBashをcontext menuからAdministrator権限付きで実行する &amp;amp;#45; Qiita]&lt;br /&gt;
&lt;br /&gt;
[https://note.com/redpeak/n/n5ddc3673117b エクスプローラーから管理者権限でコマンドプロンプトを開く方法｜ひるあんどん]&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=320</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=320"/>
		<updated>2025-04-02T08:28:25Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。エラーメッセージなどがかなり不親切だが、ちゃんと動くソフト。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、go製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
=== tun系 ===&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限（最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことになる。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tun2proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=319</id>
		<title>HTTP・SOCKS・透過プロキシ・UDP</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=HTTP%E3%83%BBSOCKS%E3%83%BB%E9%80%8F%E9%81%8E%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%83%BBUDP&amp;diff=319"/>
		<updated>2025-04-02T08:04:44Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SOCKS・透過プロキシ・UDP&amp;amp;#45;over&amp;amp;#45;TCPなどを中心に、ネットワークの変更に使えるプロキシ関連の各種技術を雑にまとめた。&lt;br /&gt;
&lt;br /&gt;
近年はGo製のものが多い。また検閲に対抗するためか、中国系（中国語でissueが投稿されているなど）のものが多い。gost, go&amp;amp;#45;proxy, hysteria, txthinking/socks5, things&amp;amp;#45;go/socks5などはいずれもその2つに当てはまる。たまにロシア系もある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;大規模多機能系&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 大規模・多機能系 ==&lt;br /&gt;
&lt;br /&gt;
以下のものは機能が多くて分類できないのでソフトウェアごとに紹介する。&lt;br /&gt;
&lt;br /&gt;
==== gost ====&lt;br /&gt;
&lt;br /&gt;
GO Simple Tunnelの略らしい。安定版のv2系（[https://github.com/ginuerzh/gost https://github.com/ginuerzh/gost], [https://v2.gost.run/ https&amp;amp;#58;//v2.gost.run/]）と開発中のv3系（[https://github.com/go-gost https&amp;amp;#58;//github.com/go&amp;amp;#45;gost], [https://gost.run/ https&amp;amp;#58;//gost.run/]）で大きく仕様が異なる。v3は開発中と言いつつv2系のページを見るとかなりv3推しに見える。&lt;br /&gt;
&lt;br /&gt;
starはバージョン2が16k、バージョン3が5kほど。&lt;br /&gt;
&lt;br /&gt;
イメージとしては、TCPによるシンプルなトンネルプロトコル（これがgost）（暗号化無し）と他の大量のプロトコルの間の相互変換を実装しているような感じと思われる。&lt;br /&gt;
&lt;br /&gt;
非常に多機能で、このページで紹介している多くソフトウェアの基本機能をカバーしていると言ってもいいくらい。UDP&amp;amp;#45;over&amp;amp;#45;TCP系は基本これ1つで十分。機能の豊富さに比して明らかにドキュメントが不足しており、エラーメッセージも親切ではない（起動時ではなく実際にパケットが来てからエラーが出るような感じ）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;connectorとしてはsocks5も用意されているが、相手がgostでない限りUDP Associateは動かない模様。具体的には&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;gost -L &amp;quot;auto://:8480?udp=true&amp;amp;relay=udp&amp;quot; -F socks5://192.168.1.13:3129&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;などとしても、 05f3 0001 0000 0000 0000みたいなよくわからんリクエストが送られてしまう。このf3のところは下記の独自拡張っぽい。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17 https://github.com/go-gost/x/blob/04d1587a77964636d8e50f5cce475ee8621bece7/internal/util/socks/socks.go#L17]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== go&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/snail007/goproxy https://github.com/snail007/goproxy]&lt;br /&gt;
&lt;br /&gt;
これも見た感じgostと同じくらいか一部では上回るくらい多機能に見えるが、この雰囲気にしては珍しく有料版があり、無料版だと一部機能が制限されているようなので、あまり使ったことはない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;gfw回避&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== GFW回避 ==&lt;br /&gt;
&lt;br /&gt;
中国政府の検閲システムであるグレート・ファイアウォール（GFW）に対抗することを主な目的とするもの。&lt;br /&gt;
&lt;br /&gt;
==== shadowsocks ====&lt;br /&gt;
&lt;br /&gt;
SOCKSに暗号化を施した独自プロトコルで、いくつかの実装がある。[https://github.com/shadowsocks/shadowsocks-rust https://github.com/shadowsocks/shadowsocks-rust]などが主流とみられる。&lt;br /&gt;
&lt;br /&gt;
VPN以外のGFW回避ソフトウェアだとおそらくもっともメジャー。&lt;br /&gt;
&lt;br /&gt;
サーバーとクライアントに分かれていて、クライアント側では透過プロキシにも対応している。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;hysteria&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Hysteria ====&lt;br /&gt;
&lt;br /&gt;
通信路がHTTP/3に偽装した形で暗号化される。shadowsocksの次世代に位置付けられるソフトウェアのように見える。&lt;br /&gt;
&lt;br /&gt;
SOCKS5サーバー部分にはtxthinking/socks5を使っている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;sni-proxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SNI Proxy ==&lt;br /&gt;
&lt;br /&gt;
HTTP・HTTPSのリバースプロキシで、host（HTTPの場合）あるいはsni（HTTPSの場合）に基づいてアクセスを振り分けるものをSNI Proxyと呼ぶことがあるらしい。&amp;lt;strong&amp;gt;Nginx&amp;lt;/strong&amp;gt;や&amp;lt;strong&amp;gt;HAProxy&amp;lt;/strong&amp;gt;のような汎用のプロキシサーバーでも使える機能だが、これを専門とするソフトウェアもある。&lt;br /&gt;
&lt;br /&gt;
* こんな使い方もある（自分の記事）→ [https://turgenev.hatenablog.com/entry/2025/03/21/020550 【Android】NextDNSをアプリごとに有効無効切り替え+Tailscale経由の自宅鯖を使ってControl D風のトラフィック転送 - turgenev’s blog]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dlundquistsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== dlundquist/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dlundquist/sniproxy https://github.com/dlundquist/sniproxy]　starは2.6kほど。2024年に更新あり。非推奨である理由（HTTP/2とかQUICでうまくいかないとか）も書いてある。&lt;br /&gt;
&lt;br /&gt;
==== tcpproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/inetaf/tcpproxy https://github.com/inetaf/tcpproxy]　starは1.3kほど。ライブラリ用途がメインか。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ameshkovsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ameshkov/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ameshkov/sniproxy https://github.com/ameshkov/sniproxy]　starは70ほど。上流のSOCKS5, HTTPプロキシへの転送機能がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;puxxustcsniproxy&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== puxxustc/sniproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/puxxustc/sniproxy https://github.com/puxxustc/sniproxy]　starもほぼなく更新も9年前。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socksプロキシサーバー&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKSプロキシサーバー ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;dante&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Dante ====&lt;br /&gt;
&lt;br /&gt;
[https://www.inet.no/dante/index.html Dante - A free SOCKS server]&lt;br /&gt;
&lt;br /&gt;
企業（Inferno Nettverk A/S）によるオープンソースなSOCKS5実装で、有償サポートまであるらしい。見るからに古臭いHPで、メンテされているかどうか不安になるが、つい最近2024年末にもアップデートがあり、次期バージョンの計画についても記載されている。&lt;br /&gt;
&lt;br /&gt;
Cで書かれていて、おそらく最も正確なSOCKS5実装だろう。コメントも親切で、リファレンス実装のような雰囲気がある。他の透過プロキシクライアントなどをテストする際はDanteでテストして動けば安心感がある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;openssh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
&lt;br /&gt;
現実的に最もよく使われているSOCKSサーバーは間違いなくOpenSSHだろう。しかし、UDP&amp;amp;#45;over&amp;amp;#45;TCPの問題があるため、UDPはサポートされていない。&lt;br /&gt;
&lt;br /&gt;
ssh &amp;amp;#45;Dでforward方向のプロキシを建てるのが有名だが、OpenSSH 7.6からは&amp;amp;#45;Rでreverse方向にも建てられるようになった。クライアント側が7.6以上であればよい。&lt;br /&gt;
&lt;br /&gt;
* 参考&amp;amp;#58; [https://www.openssh.com/txt/release-7.6 OpenSSH 7.6] （&amp;lt;code&amp;gt;ssh(1)&amp;amp;#58; add support for reverse dynamic forwarding&amp;lt;/code&amp;gt;）&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;with&amp;amp;#45;udp&amp;amp;#45;over&amp;amp;#45;ssh ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/socks-with-udp-over-ssh https://github.com/ge9/socks-with-udp-over-ssh]&lt;br /&gt;
&lt;br /&gt;
TCP接続（あるいは任意のバイトストリーム）の上にUDP付きのSOCKS5を通すために自分が実装したツール。サーバー側とクライアント側に分かれている。しかし実装した後にgostで同じことができることに気付いた。&lt;br /&gt;
&lt;br /&gt;
経緯・使い方などは[https://turgenev.hatenablog.com/entry/2024/05/12/231208 root権限のないssh上にUDPを通す方法について（ポートフォワード、SOCKS5プロキシなど） - turgenev’s blog]に書いてある。&lt;br /&gt;
&lt;br /&gt;
==== 3proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://3proxy.ru/ 3proxy tiny free proxy server for Windows, Linux, Unix: SOCKS, HTTP, FTP proxy]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/3proxy/3proxy https://github.com/3proxy/3proxy]&lt;br /&gt;
&lt;br /&gt;
ロシア系。エラーメッセージなどがかなり不親切だが、ちゃんと動くソフト。&lt;br /&gt;
&lt;br /&gt;
==== fast&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/dizda/fast-socks5 https://github.com/dizda/fast-socks5] Rust製では最も有名か。starは500ほど。使ったことなし&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;txthinkingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== txthinking/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/txthinking/socks5 https://github.com/txthinking/socks5]&lt;br /&gt;
&lt;br /&gt;
starは700前後。hysteriaやtrojan&amp;amp;#45;goなどいくつかの大きなプロジェクトで使われており、go製のSOCKS5関連ライブラリでは一番メジャーか。&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
自分のfork（[https://github.com/ge9/socks5 https://github.com/ge9/socks5]）ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;armongo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== armon/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/armon/go-socks5 https://github.com/armon/go-socks5]&lt;br /&gt;
&lt;br /&gt;
starは2kだが、最終更新2016年でUDP Associateも無し。Wireproxyで以前使われていたが使われなくなった（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）。&lt;br /&gt;
&lt;br /&gt;
ここからフォークされたものが複数ある。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;things&amp;amp;#45;gogo&amp;amp;#45;socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== things&amp;amp;#45;go/go&amp;amp;#45;socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/things-go/go-socks5 https://github.com/things-go/go-socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのフォーク（GitHub上ではfork扱いではない）。starは400個ほど。UDP Associateはサポートしているがバグあり（自分のPRが採用されるかどうかで揉めてる[https://github.com/things-go/go-socks5/pull/63 https://github.com/things-go/go-socks5/pull/63]）。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使われている。&lt;br /&gt;
&lt;br /&gt;
自分のフォーク [https://github.com/ge9/go-socks5 https://github.com/ge9/go-socks5] ではFull Cone NATを追加した&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haxiisocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haxii/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haxii/socks5 https://github.com/haxii/socks5]&lt;br /&gt;
&lt;br /&gt;
armon/go&amp;amp;#45;socks5からのfork。UDP Associate対応。starは50個前後。最終更新2019年。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wzshimingsocks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== wzshiming/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wzshiming/socks5 https://github.com/wzshiming/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
starは90個ほど。最終更新2024年。&lt;br /&gt;
&lt;br /&gt;
とりあえずredsocksと組み合わせでUDP透過プロキシ動作確認済。&lt;br /&gt;
&lt;br /&gt;
Wireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;haochen233socks5&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== haochen233/socks5 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haochen233/socks5 https://github.com/haochen233/socks5]&lt;br /&gt;
&lt;br /&gt;
クライアントもある。&lt;br /&gt;
&lt;br /&gt;
UDP Associateはサポートしているが、starは49とさらに少なく、最終更新も2021年。&lt;br /&gt;
&lt;br /&gt;
同じくWireproxyで使用が検討された（[https://github.com/whyvl/wireproxy/issues/15 https://github.com/whyvl/wireproxy/issues/15]）が結局使用されず。&lt;br /&gt;
&lt;br /&gt;
=== tun系 ===&lt;br /&gt;
&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;透過socksプロキシクライアント&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 透過SOCKSプロキシクライアント ==&lt;br /&gt;
&lt;br /&gt;
[https://turgenev.hatenablog.com/entry/2024/03/25/160556 透過プロキシを用いて特定アプリケーションのTCP・UDP通信をSOCKS5経由にする方法（Windows・Linux（iptables TPROXY）・Androidなど） - turgenev’s blog]で扱った内容。&lt;br /&gt;
&lt;br /&gt;
バックにSOCKS(SOCKS5)プロキシを用いてTCP・UDPのレイヤで透過プロキシを行うもの。基本的には管理者権限（最低でもCAP_NET_ADMIN）が必要。&lt;br /&gt;
&lt;br /&gt;
==== redsocks ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/semigodking/redsocks semigodking/redsocks] （fork元の[https://github.com/darkk/redsocks darkk/redsocks]はメンテされておらず、TCPのTPROXYに非対応）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#42;nix対応。BSD系で動かすことができたという話は[https://turgenev.hatenablog.com/entry/2024/06/10/134017 FreeBSD/OpenBSD/NetBSDで透過プロキシのredsocksを動かしてみる - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifyre&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ProxiFyre ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/wiresock/proxifyre https://github.com/wiresock/proxifyre] Windows用の透過SOCKSクライアント。管理者権限必要。TCP/UDP両方対応。インストールも簡単で、よくできている。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tproxy https://github.com/heiher/hev-socks5-tproxy] Linux向け。redsocksより若干知名度は下がるものの、きちんとメンテされている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxifier&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== Proxifier ====&lt;br /&gt;
&lt;br /&gt;
[https://www.proxifier.com/ https&amp;amp;#58;//www.proxifier.com/] 見た感じ機能は十分そうだが、有料なので試していない。&lt;br /&gt;
&lt;br /&gt;
== ライブラリ関数ハック系 ==&lt;br /&gt;
&lt;br /&gt;
ライブラリ関数レベルでの置き換えになるため厳密性・安定性に欠ける（異常終了する場合もある）ものの、root権限がない場合に有効な手法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;linuxld_preload&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Linux（LD_PRELOAD） ===&lt;br /&gt;
&lt;br /&gt;
libc依存でないプログラム（Go製のものなど）には効かない。&lt;br /&gt;
&lt;br /&gt;
==== socksify ====&lt;br /&gt;
&lt;br /&gt;
後述のDanteの一部。UDP/TCP両対応。唯一のUDP対応のものである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;route {&lt;br /&gt;
  from: 0.0.0.0/0 to: 0.0.0.0/0 via: 192.168.1.1 port = 1080&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
こんな感じの&amp;lt;code&amp;gt;/etc/socks.conf&amp;lt;/code&amp;gt;を作るか、&amp;lt;code&amp;gt;SOCKS5_SERVER&amp;amp;#61;192.168.1.1&amp;amp;#58;1080 socksify curl http&amp;amp;#58;//ipv4.icanhazip.com&amp;lt;/code&amp;gt; とかでもよい。&lt;br /&gt;
&lt;br /&gt;
Macでも動くはずだが、筆者が唯一試したMac環境ではcurlに対してさえうまく動作しなかった（socksifyを使わないのと全く同様に動作するだけだった）（&amp;lt;code&amp;gt;DYLD_FORCE_FLAT_NAMESPACE&amp;amp;#61;1&amp;lt;/code&amp;gt;は指定している）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;proxychains&amp;amp;#45;ngproxychains&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== proxychains&amp;amp;#45;ng(proxychains) ====&lt;br /&gt;
&lt;br /&gt;
ngはnew generationの略で、proxychainsの後継である。ただしコマンド名はproxychains4である。&lt;br /&gt;
&lt;br /&gt;
多段プロキシを構成するためのソフトウェア。&lt;br /&gt;
&lt;br /&gt;
UDP非対応（[https://github.com/rofl0r/proxychains-ng/issues/336 https://github.com/rofl0r/proxychains-ng/issues/336]）。ただしDNSに対応したproxy_dnsというオプションがあり、これを有効にするとDNS以外のUDP通信が正常に機能しなくなる副作用がある（[https://github.com/rofl0r/proxychains-ng/issues/103 https://github.com/rofl0r/proxychains-ng/issues/103]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;torsockstsocks&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== torsocks(tsocks) ====&lt;br /&gt;
&lt;br /&gt;
多分、メンテされていないtsocksがTorに取り込まれてtorsocksになったような感じ。tsocksは非常に古く、多分2010年以降には更新されていないが、知名度は高く、今でも多分そこそこ使われてそう。&lt;br /&gt;
&lt;br /&gt;
torsocksはアクティブなはず。ただし、Torでない普通のSOCKS5を指定しても動かないようである（やり方が悪いかも）。&lt;br /&gt;
&lt;br /&gt;
tsocksはUDPには対応していない。torsocksもそうだが、まずそもそもTor自体がUDPに対応していない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;windowsdll-hijacking&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Windows（DLL Hijacking） ===&lt;br /&gt;
&lt;br /&gt;
どのDLLを置き換えたらいいか自明ではなさそうなので、LD_PRELOADと違って対象とするソフトウェアごとに実装が必要そう。そもそも不可能なソフトウェアもLD_PRELOADの場合より多そう。よく見かけるのはDiscordを対象にしたもので、ロシア系のものが多い。筆者は使ったことがない。&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;drover ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/hdrover/discord-drover https://github.com/hdrover/discord-drover]&lt;br /&gt;
&lt;br /&gt;
==== discord&amp;amp;#45;voice&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/runetfreedom/discord-voice-proxy https://github.com/runetfreedom/discord-voice-proxy]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;httpプロキシ&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== HTTPプロキシ ==&lt;br /&gt;
&lt;br /&gt;
Squid, Privoxyなどが有名。&lt;br /&gt;
&lt;br /&gt;
Squidには透過プロキシ機能があるが、redsocksなどとは動作の細かい部分が異なる。[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]に書いた。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks関連の話題&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== SOCKS関連の話題 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;socks5によるドメイン解決&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== SOCKS5によるドメイン解決 ====&lt;br /&gt;
&lt;br /&gt;
SOCKS5（SOCKS4aも？）では、クライアントがCONNECTなどの要求をする際、接続先をIPアドレスではなくホスト名（ドメイン名）で指定することができる仕様になっている。これによりクライアント側ではなくSOCKS5サーバー側でドメイン解決が行われる。&lt;br /&gt;
&lt;br /&gt;
Proxifyreやredsocksを普通に使う場合、TCP/UDPレイヤでのプロキシとなるので、この機能が使われることはない（[https://turgenev.hatenablog.com/entry/2025/03/25/171736 squidで透過プロキシ（intercept, tproxy）を動かす - turgenev’s blog]）。一方、Webブラウザなどでは、この機能が使われる場合がある（参照&amp;amp;#58; [https://github.com/FelisCatus/SwitchyOmega/issues/2304 https://github.com/FelisCatus/SwitchyOmega/issues/2304]、[https://stackoverflow.com/questions/33099569/how-does-sock-5-proxy-ing-of-dns-work-in-browsers How does SOCK 5 proxy-ing of DNS work in browsers?]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;ブラウザのsocks5プロキシのwebrtc対応&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== ブラウザのSOCKS5プロキシのWebRTC対応 ====&lt;br /&gt;
&lt;br /&gt;
基本的に現在主流のブラウザ（Firefox, Chrome）のSOCKS5プロキシ機能（拡張機能で設定する場合を含む）はUDPには対応していないため、Discordの通話などWebRTC関係の機能を使うと生IPが漏洩する（またはそれを防ごうとすると単にその機能が使えない）。これは原理的に実装が不可能なわけではなく、単に需要が少ないから実装されていないだけである。&lt;br /&gt;
&lt;br /&gt;
* Chromeではどれが最新か不明（最近の物は少ない）。このへんとか？[https://issues.chromium.org/issues/41180783 Chromium]&lt;br /&gt;
* torのバグ報告 [https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/issues/151 https&amp;amp;#58;//gitlab.torproject.org/tpo/applications/mullvad&amp;amp;#45;browser/&amp;amp;#45;/issues/151]&lt;br /&gt;
* firefoxの [https://bugzilla.mozilla.org/show_bug.cgi?id=1808692 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1808692]&lt;br /&gt;
** QUIC関連 [https://bugzilla.mozilla.org/show_bug.cgi?id=1882071 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1882071]&lt;br /&gt;
** 新しめの包括的なバグレポート [https://bugzilla.mozilla.org/show_bug.cgi?id=1947229 https&amp;amp;#58;//bugzilla.mozilla.org/show_bug.cgi?id&amp;amp;#61;1947229]&lt;br /&gt;
&lt;br /&gt;
従って、ブラウザのWebRTCをプロキシさせたい場合はVPNや透過プロキシなどroot/管理者権限が必要な手法を使うことになる。ただしLinux+Firefoxの場合はsocksifyが使えるのでrootが無くても可能。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udp-associateリクエストのdstaddrとdstport&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDP AssociateリクエストのDST.ADDRとDST.PORT ====&lt;br /&gt;
&lt;br /&gt;
クライアントがサーバー側にUDP Associateリクエストをするとき、この2フィールドには通信したい宛先ではなく（←というかそもそもそれが複数ある場合もある）、&amp;lt;strong&amp;gt;クライアント側がUDP Associateに使用する予定のポート&amp;lt;/strong&amp;gt;を入れる。指定しない場合（例えばNATがある場合、これを予測するのは難しくなる）は、全ビットを0に設定する必要がある。&lt;br /&gt;
&lt;br /&gt;
これによってサーバー側は、UDPパケットが送られてきたタイミングでそれが事前に通知されたものと一致するかどうか確認できるというわけである。&lt;br /&gt;
&lt;br /&gt;
この部分に誤って&amp;lt;strong&amp;gt;クライアント側が通信したい宛先ポート&amp;lt;/strong&amp;gt;を入れるよう実装していたSOCKS5クライアントがいくつかある。&lt;br /&gt;
&lt;br /&gt;
* semigodking/redsocks…自分の[https://github.com/semigodking/redsocks/issues/210 https://github.com/semigodking/redsocks/issues/210]で修正済み。&lt;br /&gt;
* gost…[https://github.com/ginuerzh/gost/issues/96 https://github.com/ginuerzh/gost/issues/96]で修正済み。&lt;br /&gt;
* txthinking/socks5…[https://github.com/txthinking/socks5/issues/15 https://github.com/txthinking/socks5/issues/15]で修正済み。&lt;br /&gt;
* things&amp;amp;#45;go/go&amp;amp;#45;socks5…これはサーバー側。[https://github.com/things-go/go-socks5/issues/29 https://github.com/things-go/go-socks5/issues/29]の通り、クライアントが必ずアドレス・ポートを通知してくれる（ゼロ埋めしない）と仮定していたが、修正された。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;vpntun&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== VPN(tun) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tun2proxy-1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== tun2proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/tun2proxy/tun2proxy https://github.com/tun2proxy/tun2proxy]&lt;br /&gt;
&lt;br /&gt;
Rust製。starは700ほど。SOCKSとHTTPをtunにしてくれる。&lt;br /&gt;
&lt;br /&gt;
==== hev&amp;amp;#45;socks5&amp;amp;#45;tunnel ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/heiher/hev-socks5-tunnel https://github.com/heiher/hev-socks5-tunnel]&lt;br /&gt;
&lt;br /&gt;
hev&amp;amp;#45;socks5&amp;amp;#45;tproxyの作者による。Androidアプリの[https://github.com/heiher/sockstun https://github.com/heiher/sockstun]もここから。&lt;br /&gt;
&lt;br /&gt;
== プロキシプロトコル間の変換 ==&lt;br /&gt;
&lt;br /&gt;
==== socks&amp;amp;#45;to&amp;amp;#45;http&amp;amp;#45;proxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/KaranGauswami/socks-to-http-proxy https://github.com/KaranGauswami/socks-to-http-proxy]&lt;br /&gt;
&lt;br /&gt;
名前の通り、socksをhttpにしてくれる。starは250ほど。&lt;br /&gt;
&lt;br /&gt;
==== privoxy ====&lt;br /&gt;
&lt;br /&gt;
基本的にはHTTPプロキシソフトウェア。socksプロキシをhttpプロキシとして使えるようにする機能はあるが、より大がかり（一般ユーザーでの実行がしづらい）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpwireguard関連&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== UDP・Wireguard関連 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;udpでサーバークライアントにデータ送信&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== UDPでサーバー→クライアントにデータ送信 ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/prof7bit/udp-reverse-tunnel https://github.com/prof7bit/udp-reverse-tunnel]&lt;br /&gt;
&lt;br /&gt;
これを使うと、&amp;lt;strong&amp;gt;サーバー側だけでポートが開けられるとしても事実上クライアント側で開けられるのと同等&amp;lt;/strong&amp;gt;になるのでreverseをするのが楽になる&lt;br /&gt;
&lt;br /&gt;
* [https://superuser.com/questions/1737943/how-to-create-a-reverse-udp-tunnel https&amp;amp;#58;//superuser.com/questions/1737943/how&amp;amp;#45;to&amp;amp;#45;create&amp;amp;#45;a&amp;amp;#45;reverse&amp;amp;#45;udp&amp;amp;#45;tunnel]&lt;br /&gt;
* どっちも開放できない場合、UDPホールパンチングで何とかするしかない&lt;br /&gt;
&lt;br /&gt;
==== wgslirpy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/vi/wgslirpy https://github.com/vi/wgslirpy]&lt;br /&gt;
&lt;br /&gt;
Slirp（ユーザーランドで動くPPPサーバーのようなもの）のような形で実装されたWireguardサーバー。rootなしでWireguardサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
==== wireproxy ====&lt;br /&gt;
&lt;br /&gt;
[https://github.com/whyvl/wireproxy https://github.com/whyvl/wireproxy]&lt;br /&gt;
&lt;br /&gt;
wgslirpyの逆のような（？）ツール。Wireguardクライアントであるが、SOCKSサーバーとして動作する。&lt;br /&gt;
&lt;br /&gt;
依存ライブラリのUDP Associate対応が不完全（自分がプルリクを送っている）だが、クライアントによってはうまくUDP Associateが動く（[https://github.com/whyvl/wireproxy/issues/30 https://github.com/whyvl/wireproxy/issues/30]）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;自分でカスタマイズしてCone NATを加えたthings&amp;amp;#45;go/go&amp;amp;#45;socks5を使えば（&amp;lt;code&amp;gt;go.mod&amp;lt;/code&amp;gt;で&amp;lt;code&amp;gt;replace github.com/things&amp;amp;#45;go/go&amp;amp;#45;socks5 &amp;amp;#61;&amp;amp;gt; ../../go&amp;amp;#45;socks5&amp;lt;/code&amp;gt;などとする）、以下のようなコードをroutine.goのsocks5.Optionのところに追加することでCone NATにできる。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;socks5.WithDialUDP(func(laddr, raddr *net.UDPAddr) (net.PacketConn, error) { return vt.Tnet.DialUDP(laddr, raddr) }),&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;wireguard通信の確立&amp;amp;#58;-各パターンでのやり方&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Wireguard通信の確立&amp;amp;#58; 各パターンでのやり方 ===&lt;br /&gt;
&lt;br /&gt;
各状況に応じて、2端末間でUDPの暗号化された通信路を確立するための方法を書いた。&lt;br /&gt;
&lt;br /&gt;
* forwardは「クライアント→サーバー」、reverseは「サーバー→クライアント」という意味。「サーバー」は、「ポートが開放できる方」という意味合い。&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootあり ====&lt;br /&gt;
&lt;br /&gt;
普通にWireguardを使う&lt;br /&gt;
&lt;br /&gt;
==== サーバーのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
サーバーはWireguard、クライアントは普通にWireproxyでいける&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張って逆にする（あるいはホールパンチング）。&lt;br /&gt;
&lt;br /&gt;
その上で、wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
==== クライアントのみrootあり ====&lt;br /&gt;
&lt;br /&gt;
↑さっきと逆&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wgslirpyを使うか、Hysteriaを使うか&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelで頑張ったうえで普通にWireguardとWireproxy&lt;br /&gt;
&lt;br /&gt;
==== どっちもrootなし ====&lt;br /&gt;
&lt;br /&gt;
この場合そもそもWireguardを使うメリットはあまりないかも。というのとrootがないならポート開放も無理そう&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;forward&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hysteriaでいけそう。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;reverse&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
udp&amp;amp;#45;reverse&amp;amp;#45;tunnelしてHysteria？かな&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=318</id>
		<title>Sandbox4moved3</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=318"/>
		<updated>2025-04-02T07:56:31Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;a&lt;br /&gt;
[[Category:sandbox]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Notion2mdtest&amp;diff=317</id>
		<title>Notion2mdtest</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Notion2mdtest&amp;diff=317"/>
		<updated>2025-04-02T07:55:54Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;head&amp;lt;br /&amp;gt;&lt;br /&gt;
ここは常に表示&lt;br /&gt;
&lt;br /&gt;
== 表示1 ==&lt;br /&gt;
&lt;br /&gt;
content2e&lt;br /&gt;
&lt;br /&gt;
=== 表示2 ===&lt;br /&gt;
&lt;br /&gt;
==== 表示3作業中 ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
==== 表示4 ====&lt;br /&gt;
&lt;br /&gt;
content4&lt;br /&gt;
&lt;br /&gt;
== 表示5 ==&lt;br /&gt;
&lt;br /&gt;
==== レベル3作業中 ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
== 見出し書式 ==&lt;br /&gt;
&lt;br /&gt;
===  ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;bold&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;BOLD&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;double-quote&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;amp;quot;double quote ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;tag&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== &amp;amp;lt;tag&amp;amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;&amp;amp;#35;&amp;amp;#35;-そのまま&amp;amp;#35;表示&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;amp;#35;&amp;amp;#35; そのまま&amp;amp;#35;表示 ===&lt;br /&gt;
&lt;br /&gt;
{{UnderConstruction|Notion2mdtest}}&lt;br /&gt;
&lt;br /&gt;
== テンプレート ==&lt;br /&gt;
&lt;br /&gt;
{{Stub}}&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
== インデント ==&lt;br /&gt;
&lt;br /&gt;
test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;indented&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    indented2&amp;lt;/pre&amp;gt;&lt;br /&gt;
text&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# インデント見出し&amp;lt;/pre&amp;gt;&lt;br /&gt;
test2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;### インデント見出し2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## インデント見出し黄色&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;箇条書き要約など&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 箇条書き・要約など ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/souvikinator/notion-to-md/issues/91 https://github.com/souvikinator/notion-to-md/issues/91]への対応確認&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;summary1&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
detail1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* bullet1&lt;br /&gt;
** bullet2&lt;br /&gt;
&lt;br /&gt;
(some text)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;summary2&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
detail2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== セル内改行 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;リンクと箇条書き&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;リンクと箇条書き&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;br /&amp;gt;&lt;br /&gt;
text&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;br /&amp;gt;&lt;br /&gt;
[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;[https://www.google.com/ Google]&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/ Google]&lt;br /&gt;
&lt;br /&gt;
==== 箇条書き ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;11111111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;2222222222222&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaaaaa&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;bbbbbbbbbbb&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;iiiiiiii&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;IIIIIII&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cccccc&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dddddddddd&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;separator&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;22222&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;3333&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;33333&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaa&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== デフォルト表示の設定 ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;デフォルトで折り畳み  &lt;br /&gt;
改行&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
中身&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;デフォルトで表示  &lt;br /&gt;
改行&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
インデント&lt;br /&gt;
&lt;br /&gt;
* a&lt;br /&gt;
** ed&lt;br /&gt;
** %&amp;amp;amp;\$\\`+&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ネスト ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;toggle  &lt;br /&gt;
kaigyo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tog&amp;lt;br /&amp;gt;&lt;br /&gt;
kaigyo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;toggled2  &lt;br /&gt;
kaigyo&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
lev2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;lev3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
cont3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ciot&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;lev22  &lt;br /&gt;
s&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;clev3&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
aaa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 表 ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/souvikinator/notion-to-md/issues/86 https://github.com/souvikinator/notion-to-md/issues/86]への対応&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| d&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| f&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 書式 ==&lt;br /&gt;
&lt;br /&gt;
=== 文字の消滅確認 ===&lt;br /&gt;
&lt;br /&gt;
tex&amp;lt;u&amp;gt;t&amp;lt;/u&amp;gt;&amp;lt;u&amp;gt;&amp;lt;em&amp;gt;i&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;em&amp;gt;talic&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;BO&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;L&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;o&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;strong&amp;gt;ld&amp;lt;/strong&amp;gt;&amp;lt;s&amp;gt;&amp;lt;strong&amp;gt;a&amp;lt;/strong&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;b&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== セル内改行入り ===&lt;br /&gt;
&lt;br /&gt;
* 基本的に非推奨、連続改行（空行）は禁止&amp;lt;br /&amp;gt;&lt;br /&gt;
先頭に空白とか特殊文字入れるとかも危なそう&lt;br /&gt;
&lt;br /&gt;
test&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&amp;lt;br /&amp;gt;&lt;br /&gt;
改行3&amp;lt;br /&amp;gt;&lt;br /&gt;
改行&amp;lt;code&amp;gt;e&amp;lt;br /&amp;gt;&lt;br /&gt;
a&amp;lt;br /&amp;gt;&lt;br /&gt;
f&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
z&amp;lt;br /&amp;gt;&lt;br /&gt;
aa&amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;ug&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;code&amp;gt;g&amp;lt;br /&amp;gt;&lt;br /&gt;
f&amp;lt;br /&amp;gt;&lt;br /&gt;
|aa|bb|vc|&amp;amp;#123;&amp;amp;#125;&amp;amp;#123;|&amp;amp;#125;a&amp;amp;#123;a&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
|aa|bb|vc|&amp;amp;#123;&amp;amp;#125;&amp;amp;#123;|&amp;amp;#125;a&amp;amp;#123;a&amp;amp;#123;&amp;amp;#123;s|aa&amp;amp;#125;&amp;amp;#125;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;dd&amp;amp;#61;&amp;amp;#61;aaaa&amp;amp;#61;&amp;amp;#61;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#59; bbbb&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;#42; bbbb&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#58; 一個のインデント&amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#58;&amp;amp;#58; 二個のインデント&amp;amp;lt;br /&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45; sdg&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#42; sfs&amp;lt;br /&amp;gt;&lt;br /&gt;
space&amp;lt;br /&amp;gt;&lt;br /&gt;
  space2&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45; spacehyphen&amp;lt;br /&amp;gt;&lt;br /&gt;
  &amp;amp;#45; hyphen2&lt;br /&gt;
&lt;br /&gt;
=== その他エスケープシーケンスの確認 ===&lt;br /&gt;
&lt;br /&gt;
code&amp;lt;code&amp;gt;d`d`d&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
（Wikipediaの書式の例から流用）&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#58;&amp;amp;#58;&amp;amp;#58;&amp;amp;#58;&amp;amp;#58; 多数のインデント&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 二&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・二&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 三&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#59; 三 項目一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 三 定義一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 四&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一から続いているように見えるので&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; &amp;amp;amp;lt&amp;amp;#59;nowiki&amp;amp;amp;gt&amp;amp;#59;&amp;amp;amp;lt&amp;amp;#59;br /&amp;amp;amp;gt&amp;amp;#59;&amp;amp;amp;lt&amp;amp;#59;/nowiki&amp;amp;amp;gt&amp;amp;#59; の代わりとして &amp;amp;amp;lt&amp;amp;#59;br /&amp;amp;amp;gt&amp;amp;#59;&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; よく使われます&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 五&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35;&amp;amp;#35; 五の一の一&amp;amp;lt;br /&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の二&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;lt&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;amp&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;&amp;amp;#35;98&amp;amp;#59;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;可能&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#35; 一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#42; 二・二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 三&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#59; 三 項目一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 三 定義一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 四&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; 四 定義一から続いているように見えるので&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; &amp;amp;lt;nowiki&amp;amp;gt;&amp;amp;lt;br /&amp;amp;gt;&amp;amp;lt;/nowiki&amp;amp;gt; の代わりとして &amp;amp;lt;br /&amp;amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#58; よく使われます&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35; 五&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35;&amp;amp;#35; 五の一の一&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#35;&amp;amp;#35; 五の二&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;lt&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;amp&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;amp;&amp;amp;#35;98&amp;amp;#59;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;amp;#45;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
あ&amp;amp;#126;&amp;amp;#126;a&amp;amp;#126;&amp;amp;#126;b&amp;amp;#126;c&amp;amp;#126;&amp;amp;#126;d&amp;amp;#126;&amp;amp;#126;e&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;f&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;g&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#123;&amp;amp;#123;stub&amp;amp;#125;&amp;amp;#125;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#123;&amp;amp;#123;UnderConstruction&amp;amp;#125;&amp;amp;#125;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#61;&amp;amp;#61;aaaa&amp;amp;#61;&amp;amp;#61;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;amp;amp ^caret^ +&amp;amp;#42;@&amp;amp;#42;&amp;amp;#42;&amp;amp;#42;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;#42;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;amp;#42;&amp;lt;/em&amp;gt;&amp;amp;#42;&amp;lt;u&amp;gt;&amp;amp;#42;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\\$\$%&amp;amp;amp;@@`””’’a’a’’’a’’’’’a\”&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#91;text&amp;amp;#93;(link) &amp;amp;#123;bra&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’ck&amp;amp;#39;&amp;amp;#39;a&amp;amp;#39;’et&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’’_’&amp;amp;#125; |bar|+&amp;amp;#45;.!()&amp;amp;#35;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;#45; (a)..aa&amp;amp;#39;&amp;amp;#39;&amp;amp;#39;’+&lt;br /&gt;
&lt;br /&gt;
斜_体で_はない&lt;br /&gt;
&lt;br /&gt;
==== リンクなど ====&lt;br /&gt;
&lt;br /&gt;
+ item!! [https://google.com/ li&amp;amp;#91;&amp;amp;#93;nk]  [https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AB%E3%83%A9%E3%83%BC_(%E6%95%B0%E5%AD%A6) li!&amp;amp;#35;$&amp;amp;#45;&amp;amp;#123;&amp;amp;#123;&amp;amp;#125;&amp;amp;#125;a|a|&amp;amp;#123;&amp;amp;#123;&amp;amp;#125;s&amp;amp;#42;_^””’s&amp;amp;#125;a&amp;amp;#61;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#126;&amp;amp;#91;&amp;amp;#91;&amp;amp;#91;&amp;amp;#93;&amp;amp;#93;n&amp;amp;#91;&amp;amp;#93;k2]&lt;br /&gt;
&lt;br /&gt;
! a | ‘’a’’ &amp;amp;#91;text&amp;amp;#93;(http&amp;amp;#58;//127.0.0.1)&lt;br /&gt;
&lt;br /&gt;
privateページリンク[[error_private_page|error_private_page]]&lt;br /&gt;
&lt;br /&gt;
自己リンク [[Notion2mdtest|Notion2mdtest]]&lt;br /&gt;
&lt;br /&gt;
ページ内へ [[Notion2mdtest#コード|コード]]&lt;br /&gt;
&lt;br /&gt;
google.com&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;google.com&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.google.com/ https&amp;amp;#58;//www.google.com/]&lt;br /&gt;
&lt;br /&gt;
[https://www.rodsbooks.com/refind/installing.html#winprob https&amp;amp;#58;//www.rodsbooks.com/refind/installing.html&amp;amp;#35;winprob]&lt;br /&gt;
&lt;br /&gt;
=== 数式 ===&lt;br /&gt;
&lt;br /&gt;
数式&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;d^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;数式&amp;lt;/em&amp;gt;&amp;lt;math display=&amp;quot;inline&amp;quot;&amp;gt;\sum_{n=1}^{10}{n}=55\$\$&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;&lt;br /&gt;
|x| = \begin{cases}a&#039;g\\aa&#039;\end{cases}\{aa\}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$not math$&lt;br /&gt;
&lt;br /&gt;
$$&amp;lt;br /&amp;gt;&lt;br /&gt;
not math&amp;lt;br /&amp;gt;&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
数式ではない$\sum_&amp;amp;#123;n&amp;amp;#61;1&amp;amp;#125;^&amp;amp;#123;10&amp;amp;#125;&amp;amp;#123;n&amp;amp;#125;&amp;amp;#61;55$です&lt;br /&gt;
&lt;br /&gt;
=== コード ===&lt;br /&gt;
&lt;br /&gt;
両端はtrimされる&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;code ```aaaa`````aaa`a```&lt;br /&gt;
```&lt;br /&gt;
```wsss&lt;br /&gt;
```&lt;br /&gt;
{{stub}}&lt;br /&gt;
{{UnderConstruction}}&lt;br /&gt;
----&lt;br /&gt;
~~~~&lt;br /&gt;
[[link|link]]&lt;br /&gt;
aaa&lt;br /&gt;
```aaa&lt;br /&gt;
```bold&lt;br /&gt;
italic&lt;br /&gt;
strike&lt;br /&gt;
unders&lt;br /&gt;
```&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
`not code`&lt;br /&gt;
&lt;br /&gt;
```&amp;lt;br /&amp;gt;&lt;br /&gt;
koremo not code&amp;lt;br /&amp;gt;&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;lt;details&amp;amp;gt;&amp;amp;lt;summary&amp;amp;gt;s1s&amp;amp;lt;/summary&amp;amp;gt;&amp;amp;lt;/details&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;details&amp;amp;gt;&amp;amp;lt;summary&amp;amp;gt;2ss&amp;amp;lt;/summary&amp;amp;gt;&amp;amp;lt;/details&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;lt;div&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;tilde&amp;amp;#126;&amp;amp;#126;tilde&amp;amp;#126;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt; &amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt; &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; &amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt; &amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt; &amp;lt;u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/u&amp;gt; &amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;code&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;df&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;df&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;code&amp;gt;ef&amp;lt;/code&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;d&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;d&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;s&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&amp;lt;/s&amp;gt;&amp;lt;u&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;em&amp;gt;&amp;lt;strong&amp;gt;vf&amp;lt;/strong&amp;gt;&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
空白入りの言語名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vb.net&amp;quot;&amp;gt;&amp;lt;tag&amp;gt;&amp;lt;/svg&amp;gt;&lt;br /&gt;
\\$\$%&amp;amp;@@`&amp;quot;&amp;quot;&amp;quot;&#039;&amp;quot;&amp;quot;&#039;&amp;quot;&lt;br /&gt;
# $ $\ ss&lt;br /&gt;
&amp;lt;details&amp;gt;&amp;lt;summary&amp;gt;2ss&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[text](link) {bra&#039;&#039;&#039;cks&#039;&#039;a&#039;et&#039;&#039;&#039;&#039;_a_} |bar|+-.!()#&lt;br /&gt;
+ # &lt;br /&gt;
- (a)..aa&#039;&#039;&#039;+&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
特殊記号のあるプログラム言語名&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;public static Type Max&amp;lt;Type&amp;gt;(Type a, Type b)&lt;br /&gt;
  where Type : IComparable&lt;br /&gt;
{&lt;br /&gt;
  return a.CompareTo(b) &amp;gt; 0 ? a : b;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== その他 ===&lt;br /&gt;
&lt;br /&gt;
水平線&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;引用&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
== 画像 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://ja.wikipedia.org/static/images/icons/wikipedia.png&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:sandbox]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=316</id>
		<title>Sandbox4moved3</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Sandbox4moved3&amp;diff=316"/>
		<updated>2025-04-02T07:15:34Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;11111111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;2222222222222&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaaaaa&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;bbbbbbbbbbb&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;iiiiiiii&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;IIIIIII&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;cccccc&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;dddddddddd&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;sssss&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;111111&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;22222&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;www3&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;33333&lt;br /&gt;
&amp;lt;ol style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;aaaaaaaa&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
[[Category:sandbox]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%EF%BC%88Chrome%EF%BC%89&amp;diff=315</id>
		<title>Webブラウザ（Chrome）</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Web%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%EF%BC%88Chrome%EF%BC%89&amp;diff=315"/>
		<updated>2025-04-02T07:15:27Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;この記事では[[利用者:Turgenev|利用者:Turgenev]]が主に使用しているGoogle Chromeを中心に、Webブラウザに関するトピックを扱う。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;pwa&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== PWA ==&lt;br /&gt;
&lt;br /&gt;
プログレッシブウェブアプリ（PWA）というのはWebアプリがプッシュ通知などの（本来は権限の問題で使うのが難しい）機能を使えるようにする仕組みである。Google Chromeでは、任意のページをPWAとして使用できる。このためには、メニューの「その他のツール」から「ショートカットを作成」を選べばよい。&lt;br /&gt;
&lt;br /&gt;
また、PWAとして使用される際の設定などを明示的にmanifestとして指定しているページもあり、例えばTwitterならソースを見ると&amp;lt;code&amp;gt;&amp;amp;lt;link rel&amp;amp;#61;&amp;amp;quot;manifest&amp;amp;quot; href&amp;amp;#61;&amp;amp;quot;/manifest.json&amp;amp;quot; crossOrigin&amp;amp;#61;&amp;amp;quot;use&amp;amp;#45;credentials&amp;amp;quot; /&amp;amp;gt;&amp;lt;/code&amp;gt;などとタグが設置されていることがわかる。&amp;lt;code&amp;gt;manifest.json&amp;lt;/code&amp;gt;の中身も見れる。このmanifest.jsonがある場合は（←多分）、Twitterのページを開くとアドレスバーに「アプリとしてインストール」的なボタンが表示される。これを押すと、先ほどの「ショートカットを作成」と（多分）全く同じ動作をする。&lt;br /&gt;
&lt;br /&gt;
* YouTubeでの表示例（出典&amp;amp;#58; [https://superuser.com/questions/1623874/what-is-install-youtube-button-on-chrome windows 10 &amp;amp;#45; What is install youtube button on chrome? &amp;amp;#45; Super User]）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://i.stack.imgur.com/4t8Cu.png&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;idの生成&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== IDの生成 ====&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
こうして生成されたショートカットを見ると、（例えばWindowsなら）&amp;lt;code&amp;gt;&amp;amp;quot;C&amp;amp;#58;\Program Files\Google\Chrome\Application\chrome_proxy.exe&amp;amp;quot;  &amp;amp;#45;&amp;amp;#45;profile&amp;amp;#45;directory&amp;amp;#61;Default &amp;amp;#45;&amp;amp;#45;app&amp;amp;#45;id&amp;amp;#61;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;lt;/code&amp;gt;のようなコマンドラインが設定されているのがわかるだろう。調べた結果、この&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;app&amp;amp;#45;id&amp;lt;/code&amp;gt;というのは、以下のようなプロセスで生成されるようである。&lt;br /&gt;
&lt;br /&gt;
# アプリのURLを決定する。この際、manifestが指定されていれば、そこにある&amp;lt;code&amp;gt;start_url&amp;lt;/code&amp;gt;が使われるようである（たとえばTwitterのを見ると、&amp;lt;code&amp;gt;&amp;amp;quot;start_url&amp;amp;quot;&amp;amp;#58;&amp;amp;quot;https&amp;amp;#58;//twitter.com/?utm_source&amp;amp;#61;homescreen&amp;amp;amp;utm_medium&amp;amp;#61;shortcut&amp;amp;quot;&amp;lt;/code&amp;gt;と書いてある）。また、トップページのときは末尾に&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;を付ける？（例&amp;amp;#58; &amp;lt;code&amp;gt;https&amp;amp;#58;//chat.openai.com/&amp;lt;/code&amp;gt;）これらに該当しない場合は普通にそのページのURLがそのまま使われる。&lt;br /&gt;
# URLにSHA&amp;amp;#45;256ハッシュを2度適用し、その前半部分（16進数で32桁）をa&amp;amp;#45;pの16文字で表現する。&lt;br /&gt;
&lt;br /&gt;
この2.の部分は[https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/web_applications/web_app_helpers_unittest.cc ソースコード]に書いてある[https://play.golang.org/p/VrIq_QKFjiV playground]で試すこともできる。pythonで書くと以下のようになる（URLはコマンドライン引数として渡すことを想定）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;import hashlib&lt;br /&gt;
&lt;br /&gt;
m = hashlib.sha256()&lt;br /&gt;
m.update(bytes(&amp;quot;https://chat.openai.com/&amp;quot;.encode(&#039;ascii&#039;)))&lt;br /&gt;
m1 = hashlib.sha256()&lt;br /&gt;
m1.update(m.digest())&lt;br /&gt;
&lt;br /&gt;
EXTID = &#039;&#039;.join([chr(int(i, base=16) + ord(&#039;a&#039;)) for i in m1.hexdigest()][:32])&lt;br /&gt;
print(EXTID)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 参考&amp;amp;#58; [https://stackoverflow.com/questions/26053434/how-is-the-chrome-extension-id-of-an-unpacked-extension-generated/26058672#26058672 How is the Chrome Extension ID of an unpacked extension generated? &amp;amp;#45; Stack Overflow]&lt;br /&gt;
&lt;br /&gt;
== フォント ==&lt;br /&gt;
&lt;br /&gt;
=== pdfビューアのフォント ===&lt;br /&gt;
&lt;br /&gt;
Chrome標準のpdfビューアは、フォントが埋め込まれていないpdfの表示に不適切なフォントを使用することがある。これを修正する方法を解説する。&lt;br /&gt;
&lt;br /&gt;
==== フォント選択のしくみ ====&lt;br /&gt;
&lt;br /&gt;
pdfのそれぞれの文字にはフォントが指定されているが、そのフォントがpdfに埋め込まれておらず、かつ閲覧するPC上にも存在しない場合、別のフォントで代用する必要がある。どのフォントで代用するかはソフトによって異なる。&lt;br /&gt;
&lt;br /&gt;
理想的には、元のフォントと同じカテゴリ（「明朝」や「ゴシック」くらいのくくりで指定できる仕様がある）から選ぶとか、名前が似ているものを選ぶというのが望ましいが、Chromium系はそうなっておらず、&amp;lt;strong&amp;gt;名前順で最初にあるものを選ぶ&amp;lt;/strong&amp;gt;ようである（正確には日本語フォントと認識されるフォントの中で最初のもの？）。無難な明朝やゴシックならまだいいが、「AR丸印篆B」なんかになってしまうと悲惨である。あるいは、自分はなったことがないが、そもそも日本語の文字が表示されないという場合もあるらしい。&lt;br /&gt;
&lt;br /&gt;
有名なAcrobat Readerは比較的ちゃんとやってくれる（PDF&amp;amp;#45;XChange Viewer、Foxit Readerあたりも問題なかった気がする）。あと同じブラウザでもFirefoxのほうが（pdfビューアーに限らず）フォントまわりはちゃんとしている印象。&lt;br /&gt;
&lt;br /&gt;
==== 解決策 ====&lt;br /&gt;
&lt;br /&gt;
解決策はいくつかあって、他サイトではデフォルトのpdfビューアーを使わないようにするものが多く紹介されている。必ずダウンロードする設定にしてAcrobat Readerで開くとか、pdfを閲覧できる他の拡張機能を入れるとかの類である。&lt;br /&gt;
&lt;br /&gt;
ただ毎回ダウンロードするのは不便だし、拡張機能はURLが拡張機能のやつになってしまって元のがコピーしづらい（また個人的に論文pdfには[[Zotero|Zotero]] の拡張機能を使うので支障があった）。&lt;br /&gt;
&lt;br /&gt;
そこで、ブラウザ側の設定はそのままで、&amp;lt;strong&amp;gt;名前順でもっと早いフォントを新たに追加する&amp;lt;/strong&amp;gt;という方法が考えられる。&lt;br /&gt;
&lt;br /&gt;
といっても巷にある名前順が早いフォントが好みのものかわからないので、既存のフォントの名前を変える方法を紹介する。&lt;br /&gt;
&lt;br /&gt;
==== フォント名の変更 ====&lt;br /&gt;
&lt;br /&gt;
[[フォント|フォント]]において、ttxを使ってフォント名を変更する方法を紹介している。&lt;br /&gt;
&lt;br /&gt;
==== インストール ====&lt;br /&gt;
&lt;br /&gt;
名前を変えたフォントができたらあとはインストールするだけだが、ここが実は重要で、普通のインストールではなく、「&amp;lt;strong&amp;gt;すべてのユーザーに対してインストール&amp;lt;/strong&amp;gt;」をする必要がある。言い換えれば、フォントファイルがC&amp;amp;#58;\Users\username\AppData\Local\Microsoft\Windows\FontsではなくC&amp;amp;#58;\Windows\Fontsに入っている必要がある。&lt;br /&gt;
&lt;br /&gt;
ダブルクリックで開く画面（「Windowsでコンピューターの世界が広がります。1234567890」のやつ）からは「すべてのユーザーに対してインストール」はできないので、右クリックメニューから選択すること。あるいはフォントファイルを直接C&amp;amp;#58;\Windows\Fontsにコピーしてもよい。&lt;br /&gt;
&lt;br /&gt;
==== 確認 ====&lt;br /&gt;
&lt;br /&gt;
これで、選んだフォントでpdfがみられるようになっているはずである。各自、問題のあったファイルで試してみればよい。&lt;br /&gt;
&lt;br /&gt;
==== 余談 ====&lt;br /&gt;
&lt;br /&gt;
先ほどURLが変わるので微妙と評した拡張機能であるが、フォント云々とは関係なく、全てのpdfファイル（強制ダウンロードのリンクになっているものも含めて）をダウンロードせず開けること自体はなかなか便利である。&lt;br /&gt;
&lt;br /&gt;
これをURLを変えずに実現できるものがないか探したところ、[https://chrome.google.com/webstore/detail/undisposition-racle-fork/bbppejejjfancffmhncgkhjdaikdgagc &amp;lt;strong&amp;gt;Undisposition &amp;amp;#91;Racle fork&amp;amp;#93;&amp;lt;/strong&amp;gt;]という拡張機能があった。Google Driveなどでファイルを全くダウンロードできなくなるという副作用が[https://github.com/Racle/undisposition/issues/2 報告されていた]が、最近のアップデートでホワイトリスト機能が追加された。&lt;br /&gt;
&lt;br /&gt;
ただ、動かないサイトもある気がするのと、拡張機能の性質上しょうがないとは思うのだが要求される権限が「すべてのウェブサイト上にある自分の全データの読み取りと変更」なので、効用の割にはリスクが…というのはあるかもしれない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;cssにおけるローカルフォントの指定&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== CSSにおけるローカルフォントの指定 ===&lt;br /&gt;
&lt;br /&gt;
{{Valuable}}&lt;br /&gt;
&lt;br /&gt;
こちらはよりadvancedな話題であるから簡潔に述べる。&lt;br /&gt;
&lt;br /&gt;
CSSでローカルのフォントを使わせたいときは&amp;lt;code&amp;gt;@font&amp;amp;#45;face&amp;lt;/code&amp;gt;の&amp;lt;code&amp;gt;src&amp;amp;#58; local()&amp;lt;/code&amp;gt;を使って指定する。&lt;br /&gt;
&lt;br /&gt;
まず、このときに使用する名前はnameテーブルの6番にあるPostScript名（これは先ほど&amp;lt;code&amp;gt;ttx &amp;amp;#45;t name fontfile.ttf&amp;lt;/code&amp;gt;で出力したxmlで見れる）を使わなければならないとされている。ただし手元で試した限り4番にあるような名前でも成功する場合があった。最も確実なのがPostScript名ということなのかもしれない。&lt;br /&gt;
&lt;br /&gt;
で、Windows版のChromium系で使う場合に重要なのが、フォントファイルが先ほどのように「&amp;lt;strong&amp;gt;すべてのユーザーに対してインストール&amp;lt;/strong&amp;gt;」されている必要があるということである。さらに、手元で試した限り、&amp;lt;strong&amp;gt;同じフォントが特定のユーザーに対してインストールされている&amp;lt;/strong&amp;gt;（C&amp;amp;#58;\Users\username\AppData\Local\Microsoft\Windows\Fontsにある）&amp;lt;strong&amp;gt;と正しく動かない&amp;lt;/strong&amp;gt;ようであるということがわかった。&lt;br /&gt;
&lt;br /&gt;
というわけで、Windows版のChromeでsrc&amp;amp;#58;local()が効かないという場合は、フォント名を確認した上で、該当のフォントがC&amp;amp;#58;\Windows\Fonts&amp;lt;strong&amp;gt;だけ&amp;lt;/strong&amp;gt;にインストールされていることを確認するのがよい。&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E3%83%91%E3%82%B9%E9%95%B7%E3%81%95%E5%88%B6%E9%99%90%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6&amp;diff=314</id>
		<title>Windowsのパス長さ制限に関して</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=Windows%E3%81%AE%E3%83%91%E3%82%B9%E9%95%B7%E3%81%95%E5%88%B6%E9%99%90%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6&amp;diff=314"/>
		<updated>2025-04-02T07:08:06Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Windowsが扱えるパスの長さは260文字（定数&amp;lt;code&amp;gt;MAX_PATH&amp;lt;/code&amp;gt;）に制限され、それ以上の長さのパスをもつファイル・フォルダの操作に支障が出ることがある。&lt;br /&gt;
&lt;br /&gt;
* これはあくまでWindowsの問題であってファイルシステム（NTFS）の制限ではないので、後述の通りエクスプローラ上でも例えばパス長さ260を超えるファイルを作ること自体は容易である。ネットワーク上のフォルダを閲覧する場合など、実際にWindows上で長さ260を超えるパスを扱う必要がある場面も多く、ダブルクリックで開く程度の操作はできることが多い。&lt;br /&gt;
&lt;br /&gt;
以下ではこの問題に関してさらに詳細な挙動を解説する。なお動作確認に使用したのは主にWindows10である。Windows11でも少し試したが、大幅な改善はなさそうである。&lt;br /&gt;
&lt;br /&gt;
関連する公式のドキュメントとしては以下が参考になる。&lt;br /&gt;
&lt;br /&gt;
[https://docs.microsoft.com/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#file-and-directory-names https&amp;amp;#58;//docs.microsoft.com/windows/win32/fileio/naming&amp;amp;#45;a&amp;amp;#45;file?redirectedfrom&amp;amp;#61;MSDN&amp;amp;#35;file&amp;amp;#45;and&amp;amp;#45;directory&amp;amp;#45;names]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;正確な数え方内訳&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== 正確な数え方・内訳 ==&lt;br /&gt;
&lt;br /&gt;
260の内訳は以下のようになっている。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;ドライブレター（1）＋コロン（1）＋パス本体（256）＋終端のヌル文字（1）&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
従って我々が普段「フルパス」として認識している部分の長さ上限は実際には&amp;lt;strong&amp;gt;259&amp;lt;/strong&amp;gt;ということになる。&lt;br /&gt;
&lt;br /&gt;
これに加えて、カレントディレクトリ（作業ディレクトリ）のパスの上限は&amp;lt;strong&amp;gt;258&amp;lt;/strong&amp;gt;のようである（コマンドプロンプトやPowerShellでcdしようとしてみた結果）。おそらくディレクトリ末尾の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を含めて259文字以下ということかと思われるが、確実な情報はあまりない。さらに、cmdでは、ちょうど258文字のフォルダにはcdできても中でdirできなかった。&lt;br /&gt;
&lt;br /&gt;
また、この260文字というのは&amp;lt;strong&amp;gt;UTF&amp;amp;#45;16&amp;lt;/strong&amp;gt;で数えた値である。従って「a」や「字」などのU+FFFFまでのUnicode文字は1文字、「𩸽」などのU+10000を超える文字はサロゲートペアで表現されるため2文字とカウントする。&lt;br /&gt;
&lt;br /&gt;
== 制限の解除 ==&lt;br /&gt;
&lt;br /&gt;
この制限は最近のWindowsならLongPathsEnabledというレジストリの値を1に設定することで解除できるとされている。例えばPowerShell上で以下を実行すればよい。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;Set-ItemProperty &amp;quot;Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem&amp;quot; -Name LongPathsEnabled -value 1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
また、現在の値を確認するには以下を実行する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;powershell&amp;quot;&amp;gt;(Get-Item -Path &amp;quot;Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem&amp;quot;).GetValue(&amp;quot;LongPathsEnabled&amp;quot;)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
しかし、制限を解除すれば全ての操作が支障なくできるというわけではない。例えば、Windows APIのマルチバイト文字方式の関数（末尾がAのもの）は長いパスに対応していない（末尾がWのワイド文字方式のものは対応している）らしく、これを使用しているアプリケーションはこの制限を解除しても正しく動かない。またエクスプローラ上での操作性もほとんど改善しない。&lt;br /&gt;
&lt;br /&gt;
== パスの形式について ==&lt;br /&gt;
&lt;br /&gt;
今後出てくる様々な挙動を把握するために、ファイルに短い別名を与える仕組みである「8.3形式」およびパス長さ制限の回避に有効な「”&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;”プレフィックス」について紹介する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;83形式短いファイル名&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.3形式(短いファイル名) ===&lt;br /&gt;
&lt;br /&gt;
古いWindowsのファイル名には「8文字以下の名前+ピリオド+3文字以下の拡張子」という長さ制限があった。また、空白を含む一部の記号も使用できない。この制限がなくなった（緩和された）現在でも、Windowsは制限を満たさないファイルに対してこの制限に基づく別名を自動生成する。これが「8.3形式」あるいは「短いファイル名」などと呼ばれるものである。例としては”Program Files”→”PROGRA&amp;amp;#126;1” などがある。8.3形式の名前はコマンドプロンプトのdir /xコマンドで表示できる。&lt;br /&gt;
&lt;br /&gt;
比較的新しいWindowsでは、&amp;lt;code&amp;gt;fsutil 8dot3name&amp;lt;/code&amp;gt;コマンドを使うことで、8.3形式の名前を生成するかどうかをシステム全体およびボリューム（Cドライブ、Dドライブ）ごとに設定できる。デフォルトではCドライブのみ有効になっているようである。&lt;br /&gt;
&lt;br /&gt;
この別名を通常の名前のかわりに使用することで、現実的に多くの場合は長さ制限を回避できるだろう（もちろん階層が深すぎて「短いパス」でも長さ制限を超えてしまう場合などはできない）。また、パスに含まれる空白による問題も回避できる。&lt;br /&gt;
&lt;br /&gt;
後述の通り一部アプリケーションはこれを積極的に使うことで長さ制限を回避しようとすることがある。この際は8.3形式を可能な限り多く使用したパス（&amp;lt;strong&amp;gt;可能な限り最も短いパス&amp;lt;/strong&amp;gt;）が用いられるようである。&lt;br /&gt;
&lt;br /&gt;
例えば8.3形式の名前がCでは有効、Dでは無効（つまりデフォルト設定）だったとする。Dドライブ直下に”longfoldername”という名前で”C&amp;amp;#58;”へのジャンクションを作り、それを経由してC&amp;amp;#58;\Program Filesにアクセスする場合は、”D&amp;amp;#58;\longfoldername\PROGRA&amp;amp;#126;1”が「可能な限りもっとも短いパス」ということになる。&lt;br /&gt;
&lt;br /&gt;
* 「可能な限り多く」ではなく、短い名前をもつフォルダのうち&amp;lt;strong&amp;gt;一部のみ&amp;lt;/strong&amp;gt;を8.3形式としたパスがexplorerのアドレスバーなどで使われることもたまにあるようだが、詳しい条件は不明である。&lt;br /&gt;
&lt;br /&gt;
8.3形式は基本的には普通のパスと同じ扱いであるため、多くのアプリケーションが対応しているが、PowerShellなどは強制的に長い名前に変換しようとするため支障が出ることもある（後述）。また、4文字以上の拡張子は3文字に短縮されてしまうため、例えばWordの.docxファイルが.docファイルと混同されるなどの問題が生じる。また他にもシェルの入力補完で表示されないなど、通常のパスと比べて不便であることには変わりない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;プレフィックス&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== “&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;”プレフィックス ===&lt;br /&gt;
&lt;br /&gt;
公式ドキュメントでも用語の定義がはっきりしないのでよくわからないが、パスの先頭に”&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;”（検索しやすさのために書いておくと、バックスラッシュ（&amp;amp;#61;円記号）2つ+クエスチョンマーク+バックスラッシュ1つ）というプレフィックスを付加すると”Win32 file namespace”というものにアクセスすることになるらしい。具体的にどうなるかというとWindows APIによるパスに対する各種のチェックが行われなくなり、結果として&amp;lt;strong&amp;gt;長さ制限を超えるパスを使える&amp;lt;/strong&amp;gt;ようになる。ただし対応状況はアプリケーションによってまちまちである。&lt;br /&gt;
&lt;br /&gt;
このパスはネットワーク上のファイルを指定するのに使われるUNCパス（UNCはUniversal Naming ConventionあるいはUniform Naming Conventionの略）の一種とも考えられる。UNCパスは「&amp;lt;code&amp;gt;\\コンピュータ名\パス本体&amp;lt;/code&amp;gt;」という形式だが、この「コンピュータ名」の部分に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が入っているというわけである。ちなみに、元々UNCパスだったものにこのプレフィックスを付加する場合は&amp;lt;code&amp;gt;\\?\UNC\コンピュータ名\パス本体&amp;lt;/code&amp;gt;とすれば良いらしい（エクスプローラーでそのように表示されている）。&lt;br /&gt;
&lt;br /&gt;
なお、クエスチョンマークの代わりにピリオドを使用した&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;というプレフィックスもあり、これだと”Win32 file namespace”ではなく”Win32 device namespace”というものにアクセスすることになるらしいが、詳細は不明。長さ制限を回避するには使えないようである。&lt;br /&gt;
&lt;br /&gt;
以降では便宜的に「“&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;”プレフィックス」を指して単に「プレフィックス」と呼ぶ。&lt;br /&gt;
&lt;br /&gt;
ちなみに今回の話題とは無関係だが、&amp;lt;code&amp;gt;con&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;nul&amp;lt;/code&amp;gt;などWindows上で許容されない名前のファイルが削除できない際に、コマンドで&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;を付けたパスを指定すると削除できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;explorerや各シェルアプリケーションにおける挙動の変化&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Explorerや各シェル、アプリケーションにおける挙動の変化 ==&lt;br /&gt;
&lt;br /&gt;
ここから具体的な挙動の変化を見る。特に記載がないものは、レジストリ値を変更して制限を解除しても変わりがないということである。&lt;br /&gt;
&lt;br /&gt;
以下で「PowerShell」と呼んでいるのはバージョン5であって、6以降（実行ファイル名がpwsh.exeになって以降）では異なるようである。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;83形式プレフィックス付きパス等を扱えないアプリケーション&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 8.3形式・プレフィックス付きパス等を扱えないアプリケーション ===&lt;br /&gt;
&lt;br /&gt;
アプリケーションによって細かい挙動は様々だが、プレフィックス付きのものや8.3形式の名前が含まれるパスに関して不具合が出ることがある。はっきりエラーメッセージが出ることもあれば、何も起こらないこともあるし、空白の（ファイルを開いていない状態の）ウインドウが表示される場合もある。いくつか例を挙げておく。&lt;br /&gt;
&lt;br /&gt;
* Windows Media Player…プレフィックス付きのものや長さ制限を超えるパスを引数に渡すと起動しない（何も起こらず終了する）。&lt;br /&gt;
* ペイント…プレフィックス自体は扱えるが長さ制限を超えるとプレフィックス付きであっても扱えない（引数として渡すと何も起こらず終了する）。&lt;br /&gt;
* Word…プレフィックス付きパスを渡すと、起動はするが新規作成の画面になる。また長さ制限を超えるパス（プレフィックス付き含む）を渡すと「パス名が長すぎる」というようなメッセージを表示した上で新規作成の画面になる。また、”.docx”は拡張子が4文字以上であるため、短いパスとして渡されると不自然な動作になることがある（”.doc”、つまりWord 97&amp;amp;#45;2003文書との混同が生じる）。&lt;br /&gt;
* Visual Studio…8.3形式を用いて短くした.slnや.vcxprojを渡しても、元の（8.3形式を使わない）パスが制限を超えていると「パス名が長すぎる」というようなエラーが表示され開けない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;長さ制限を超えるパスをカレントディレクトリとして実行できないwindowsネイティブアプリケーション&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 長さ制限を超えるパスをカレントディレクトリとして実行できないWindowsネイティブアプリケーション（？） ===&lt;br /&gt;
&lt;br /&gt;
おそらくアプリケーション側の都合で、長さ制限を超えるパスをカレントディレクトリとしての起動に対応していないことがある。具体的には、Git Bashで、長い名前をもつフォルダを開いているとき、mspaintやcmdの実行に失敗する。次のようなメッセージが出る。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;latex&amp;quot;&amp;gt;Error: Current working directory has a path longer than allowed for a&lt;br /&gt;
Win32 working directory.&lt;br /&gt;
Can&#039;t start native Windows application from here.&lt;br /&gt;
&lt;br /&gt;
bash: /c/Windows/system32/mspaint: File name too long&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
しかし、同じ状況でgrep.exeの実行は成功する。従ってアプリケーションによって対応状況に差があるものと推測される。ただしこのエラーメッセージはGit Bashによるものであり、またGit Bash以外で違いを確認できていない（例えばcmdやPowerShellではmspaintもgrepも&amp;lt;strong&amp;gt;シェル側の都合で&amp;lt;/strong&amp;gt;失敗する）ので、例えば&amp;lt;strong&amp;gt;Git Bashが必要以上に多くのプログラムを勝手に”native Windows application”に分類している可能性&amp;lt;/strong&amp;gt;などは残る。またgrep.exeのようなGit Bash付属の実行ファイル以外で起動できるものは確認していないので、判定条件がよくわからない。&lt;br /&gt;
&lt;br /&gt;
カレントディレクトリを8.3形式によって短くできれば起動できる。&lt;br /&gt;
&lt;br /&gt;
=== explorer ===&lt;br /&gt;
&lt;br /&gt;
まず、以下の挙動については全てのフォルダで同様。8.3形式で短くできるものも含まれる。&lt;br /&gt;
&lt;br /&gt;
* 長さ制限を超えるファイルのリネームができない（元々超えている場合は短くすることもできない）&lt;br /&gt;
** 超えていない場合、制限いっぱいになるとそれ以上入力できなくなる&lt;br /&gt;
* 中にあるファイルのパス長が制限を超えるようにフォルダをリネーム・移動することは可能&lt;br /&gt;
** これにより長さ制限を超えるパスをもつファイル・フォルダをエクスプローラ上で容易に作れる。逆に、長すぎてリネームできないファイルなども、外側のフォルダをいったん短い名前に変える・短い名前の場所に移動することで操作できるようになる&lt;br /&gt;
* 長さ制限を超えてもフォルダを開くことは可能。&lt;br /&gt;
&lt;br /&gt;
さて、explorerは、制限を超える長いパスに対しては概ね次のような原則で対処しようとするようである。&lt;br /&gt;
&lt;br /&gt;
# 8.3形式の名前を使用して「可能な限り最も短いパス」を得て、これを使う。&lt;br /&gt;
# 8.3形式の名前がない、あるいはそれを使っても制限を超過するなどの場合は、パス先頭に”&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;”プレフィックスを付加する。&lt;br /&gt;
&lt;br /&gt;
例えばexplorerのアドレスバーを見ると、このように動作していることがわかるだろう。あるいは、そのフォルダおけるexplorerの挙動はアドレスバーを見れば大体予測できるということにもなる。ファイルに関して調べたければ「パスのコピー」を使うとよい。なお、手動でプレフィックスや8.3形式の名前をエクスプローラのアドレスバーに入力して移動した際は、通常のパスに変換される（それが長さ制限を超えていれば改めて上記の対処が行われる）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;ただし上記1の部分では、（末尾の&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;を含めない）パス長さが&amp;lt;strong&amp;gt;260文字以上&amp;lt;/strong&amp;gt;になったときのみ8.3形式が適用される。しかし、実際にはカレントディレクトリのパス長さ上限は&amp;lt;strong&amp;gt;258文字&amp;lt;/strong&amp;gt;である。よって、&amp;lt;strong&amp;gt;ちょうど259文字&amp;lt;/strong&amp;gt;の長さのパスでは、アドレスバーには通常のパスが表示されるにもかかわらずアドレスバーにcmdと打っても正しく起動しないという、258文字以下または260文字以上のフォルダでは見られない挙動をする。&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;1とは違って、2の部分では、8.3形式を使ったとしてもパス長さが&amp;lt;strong&amp;gt;259文字以上&amp;lt;/strong&amp;gt;になると&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;が付加されるのでこのような問題は起こらない。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;strong&amp;gt;1のとき&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
ダブルクリックでファイルを開くことができるほか、右クリックメニューの「送る」「Codeで開く」（※VS Codeを適切な設定でインストールすると表示される）なども正常動作する。なお「PowerShell ウインドウをここで開く」は、動作するが、PowerShellは強制的に通常の（長い）名前を使おうとするため、カレントディレクトリとしては通常の名前が表示される（この先の挙動はPowerShellの項目を参照）。また、PowerShellを使用するよう設定したWindows Terminalをここで開くと、制限を解除した場合は通常形式のパスをカレントディレクトリとして正しく起動するが、解除しない場合はカレントディレクトリを&amp;lt;code&amp;gt;C&amp;amp;#58;\WINDOWS\System32\WindowsPowerShell\v1.0&amp;lt;/code&amp;gt;として起動する。&lt;br /&gt;
&lt;br /&gt;
ファイルの新規作成は可能だが、フォルダを作成しようとするとエラーが出る。ファイルやフォルダを「ごみ箱に移動」できる。&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;strong&amp;gt;2のとき&amp;lt;/strong&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
2に当てはまるフォルダでは、「Codeで開く」など外部プログラムを起動するような右クリックメニューの多くが動作しない（Explorer.EXEによる”ディレクトリ名が無効です。”とのダイアログが出る）。「開く」も動作せずファイルをダブルクリックで開くこともできない（例えば.txtがメモ帳に関連付けられた状態で開いてみるとよい）（※Windows11ではメモ帳の動作が改善しているのでCOM実装に変更されたようだが、一般のプログラムではうまくいかない。ただしエラーダイアログは出なくなり、無言で起動しない）。ただしCOMを用いて実装されているメニュー（レジストリにコマンドラインではなくUUIDが書かれているようなもの）は正常に動作するようである（例えば「映画 &amp;amp;amp; テレビ」「フォト」のようないわゆる「アプリ」で開く場合）。&lt;br /&gt;
&lt;br /&gt;
また、以下はCOMが用いられているか不明（未調査）だが一定のまともな挙動を示すためその可能性が考えられる。&lt;br /&gt;
&lt;br /&gt;
* 「PowerShell ウインドウをここで開く」…正常に動作する。&lt;br /&gt;
* 「プログラムから開く」…「開く」とは異なり、（アプリケーション側が対応していれば）正常に動作する。&lt;br /&gt;
* 「送る」…Explorer.EXEのエラーは表示されない。ただし、特殊な方法（これもCOM？）で実装されている「ドキュメント」「デスクトップ (ショートカットを作成)」「圧縮 (zip 形式) フォルダー」メニューなどを除けば、選択しても何も起こらない。また、zipのメニューに関しても、最終的にzip作成には失敗する。なお、この「送る」に関しては、（2に当てはまるフォルダ内でなくとも）2に当てはまるファイルが一つでも含まれていると同様に動かないようである。&lt;br /&gt;
&lt;br /&gt;
また、「新規作成」メニューにはフォルダの作成のみ表示されるが、なぜか”管理者マーク”が付いており、押しても何も起こらない。従ってファイルもフォルダも作れない。「ごみ箱に移動」は動作せず、delキーを押しただけで「完全に削除しますか？」と聞かれる（完全に削除することは可能）。&lt;br /&gt;
&lt;br /&gt;
=== コマンドプロンプト ===&lt;br /&gt;
&lt;br /&gt;
制限を解除した場合に限り長いパスを扱える（cdやdirが動作する）。また8.3形式の名前も普通に使える。&lt;br /&gt;
&lt;br /&gt;
プレフィックスは、全く解釈できないわけではない（例えばrdコマンドの引数に使うことはできる）が、カレントディレクトリとしては許容されないようで、指定してcdしようとすると「CMD では UNC パスは現在のディレクトリとしてサポートされません。」と言われる。&lt;br /&gt;
&lt;br /&gt;
外部プログラムを実行する際は、（制限が解除されていても）カレントディレクトリのパスが長いと判定したら「可能な限り最も短いパス」を代わりに使うようで、（それで制限以下の長さにできるフォルダであれば）正しく起動できる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;powershell&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== PowerShell ===&lt;br /&gt;
&lt;br /&gt;
* ここに書いているのは主にPowershell 5.0あたりの話で、最近のPowerShell（PowerShell Coreと呼ばれたり、実行ファイル名がpwsh.exeだったり）では色々と改善が見られる。&lt;br /&gt;
&lt;br /&gt;
制限を解除した場合に限り長いパスを扱える点はcmdと同じである。しかし前述の通り、カレントディレクトリに8.3形式が使われるのを許容しないようで、強制的に長い名前に変換するため、しばしば奇妙な挙動を引き起こす。&lt;br /&gt;
&lt;br /&gt;
例えば、カレントディレクトリのパスが200文字だったとして、そこに名前が100文字のフォルダがあったとする。いずれも実体はCドライブにあって8.3形式の名前が有効とする。このとき、パス長さ制限が解除されていなくても、8.3形式の名前を使えばcd自体はできる。しかしcdが&amp;lt;strong&amp;gt;成功すると同時に&amp;lt;/strong&amp;gt;カレントディレクトリは長い名前に変換されるため、カレントディレクトリは300文字程度になり制限を超えてしまい、そこでのdirコマンドなどの実行は失敗するようになってしまう。&lt;br /&gt;
&lt;br /&gt;
また、長さ制限を超えるパスがカレントディレクトリであるときに外部プログラムを実行すると、制限が解除されていない場合は「可能な限り最も短いパス」を使おうとするが、&amp;lt;strong&amp;gt;解除されている場合は長いパスをそのまま使おうとする&amp;lt;/strong&amp;gt;（cmdとの違い）。結果として実行に失敗する。つまり、制限を&amp;lt;strong&amp;gt;解除&amp;lt;/strong&amp;gt;した結果としてむしろ実行が&amp;lt;strong&amp;gt;失敗するようになる&amp;lt;/strong&amp;gt;という状況が発生している。&lt;br /&gt;
&lt;br /&gt;
プレフィックスには対応していて基本的な操作ができる。カレントディレクトリに設定すると&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\?\C&amp;amp;#58;\Users&amp;lt;/code&amp;gt;のように表示される。&lt;br /&gt;
&lt;br /&gt;
またカレントディレクトリがプレフィックス付きであるときに外部プログラムを実行するときは、不要な&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;を除去してくれるようで、正しく起動できる。これは&amp;lt;code&amp;gt;\\?\C&amp;amp;#58;\Windows&amp;lt;/code&amp;gt;のようなフォルダで正しく起動できるということであって、そもそも&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けないと扱えないような長いパスでの実行はいずれにしても失敗する。&lt;br /&gt;
&lt;br /&gt;
また、（制限を解除していない状態だとしても）この際に「最も短いパス」を使用することまではしてくれないようで、Cドライブ上の長いパスに&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けたものをカレントディレクトリとしてnotepadを実行してみたが失敗した。&lt;br /&gt;
&lt;br /&gt;
また、なぜかCドライブ直下を対象にした&amp;lt;code&amp;gt;cd \\?\C&amp;amp;#58;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cd \\.\C&amp;amp;#58;&amp;lt;/code&amp;gt;はうまくいかない（&amp;lt;code&amp;gt;cd \\?\C&amp;amp;#58;\Users&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;cd \\.\C&amp;amp;#58;\Users&amp;lt;/code&amp;gt;は成功する）。&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;に関しては一旦&amp;lt;code&amp;gt;cd \\.\C&amp;amp;#58;\Users&amp;lt;/code&amp;gt;などしてから&amp;lt;code&amp;gt;cd ..&amp;lt;/code&amp;gt;をするとCドライブにいけるがこのときはなぜか&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;が消えて&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;C&amp;amp;#58;&amp;lt;/code&amp;gt;という表示になる。&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;の場合はこれもできない。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow:auto;width: 100%; max-width: 1200px; white-space:nowrap; border:1px solid; padding-left: 10px; padding-right: 10px;&amp;quot; class=&amp;quot;mw-collapsible&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;要らないかも&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
また、プレフィックス付きパスにいるときにcdで相対パスを使用する際は8.3形式も使えるが（強制的に長い名前に変換されるのは同じ）、&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;と8.3形式を組み合わせた絶対パスを用いると失敗する場合もある。具体的には、Cドライブ直下のフォルダ（たとえば&amp;lt;code&amp;gt;cd \\?\C&amp;amp;#58;\PROGRA&amp;amp;#126;1&amp;lt;/code&amp;gt;など）は成功したが、他ではうまくいかない。なお、&amp;lt;code&amp;gt;cd \\?\C&amp;amp;#58;\PROGRA&amp;amp;#126;1&amp;lt;/code&amp;gt;を実行した際はなぜか通常のパスへの変換が行われず、カレントディレクトリが&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\.\C&amp;amp;#58;\PROGRA&amp;amp;#126;1&amp;lt;/code&amp;gt;となる。詳細不明。&lt;br /&gt;
&lt;br /&gt;
また&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;のかわりに&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;を用いるとCドライブ直下以外でもcdに成功したが、前述の通り&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;にはパス長さ制限を回避する効果がないようなので実用性は不明である。またCドライブ直下のフォルダのみ8.3形式が許容されるようで、&amp;lt;code&amp;gt;cd \\.\C&amp;amp;#58;\PROGRA&amp;amp;#126;1\INTERN&amp;amp;#126;1&amp;lt;/code&amp;gt;とするとカレントディレクトリは&amp;lt;code&amp;gt;Microsoft.PowerShell.Core\FileSystem&amp;amp;#58;&amp;amp;#58;\\.\C&amp;amp;#58;\PROGRA&amp;amp;#126;1\Internet Explorer&amp;lt;/code&amp;gt;になる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;git-bash&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Git Bash ===&lt;br /&gt;
&lt;br /&gt;
git bashはUnix由来のシェルであるためか、それ自体で長さ制限を超えるパスを扱う能力を持っているようである。従って制限を解除しなくても長いパスを扱える。また8.3形式の名前も使える。&lt;br /&gt;
&lt;br /&gt;
「可能な限り最も短いパス」を得ようとするような動作はしないため、長いパスをもつカレントディレクトリでの外部プログラム実行は失敗する（前述の通り、Git Bash内蔵のgrep.exeなどは例外）。&lt;br /&gt;
&lt;br /&gt;
Git Bashでは、&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;\\.\&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;//./&amp;lt;/code&amp;gt;は使うとエラーになり、&amp;lt;code&amp;gt;//?/&amp;lt;/code&amp;gt;を付けた場合はcdには成功するが&amp;lt;code&amp;gt;//?/&amp;lt;/code&amp;gt;が除去される。&lt;br /&gt;
&lt;br /&gt;
ただし、逆にWindowsにない制限として、Unixではそれぞれの&amp;lt;strong&amp;gt;ファイル名の長さ上限が255バイト&amp;lt;/strong&amp;gt;という制限がある（Windowsと違って&amp;lt;strong&amp;gt;パス長さ&amp;lt;/strong&amp;gt;の制限は4096なので、長さ200バイトの名前のフォルダの中に長さ200バイトの名前のフォルダを作るにあたっては不自由がない）。また、エンコードはUTF&amp;amp;#45;8を基準に計算されるので、3バイトで表現される通常の日本語の文字（ひらがなや漢字）だと85文字、U+10000を超えるような文字（𩸽など）だと4バイト分なので63文字しか入らない。Windows上ではこれらを超える長さのフォルダを作れるが、Git Bashではそこにcdできないということになる。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;webdav&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== WebDAV ===&lt;br /&gt;
&lt;br /&gt;
Windowsでは、&amp;lt;code&amp;gt;host&amp;amp;#58;port&amp;lt;/code&amp;gt;において稼働しているWebDAVサーバーの&amp;lt;code&amp;gt;my/folder&amp;lt;/code&amp;gt;というフォルダに、&amp;lt;code&amp;gt;\\host@port\my\folder&amp;lt;/code&amp;gt;あるいは&amp;lt;code&amp;gt;\\host@port\DavWWWRoot\my\folder&amp;lt;/code&amp;gt;というパスでアクセスできる。ただし前者は&amp;lt;strong&amp;gt;トップディレクトリに関しては機能しない&amp;lt;/strong&amp;gt;（アクセスできませんと言われる）ので注意。とはいえ後者はexplorerのアドレスバーが&amp;lt;code&amp;gt;http&amp;amp;#58;//host&amp;amp;#58;port/my/folder&amp;lt;/code&amp;gt;というHTTP形式の表示になってしまうのが扱いづらい。&lt;br /&gt;
&lt;br /&gt;
そして、WebDAVに関しても（詳細は調べていないが）260文字程度以上の長さのフォルダにはアクセスできない。しかも、&amp;lt;code&amp;gt;\\?\UNC&amp;lt;/code&amp;gt;や（ネットワークドライブを割り当てたとして）&amp;lt;code&amp;gt;\\?\&amp;lt;/code&amp;gt;を付けてもアクセスできず、どうやっても表示する方法はわからなかった。また、260文字程度の長さになるファイルも表示されなくなるなどした。&lt;br /&gt;
&lt;br /&gt;
長いパスのファイルを含むWebDAVサーバーをまともに使うのであれば、WinFSPなどでマウントした方が良さそうである。&lt;br /&gt;
&lt;br /&gt;
== 結論 ==&lt;br /&gt;
&lt;br /&gt;
こうしてみると長さ制限を解除しても大した改善はないというのが実情である。&lt;br /&gt;
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
	<entry>
		<id>https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%95%E3%82%8C%E3%81%9FNotion%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%88%E3%82%8BMediaWiki&amp;diff=313</id>
		<title>フィルターされたNotionページによるMediaWiki</title>
		<link rel="alternate" type="text/html" href="https://turgenev.cloudfree.jp/mw-new/mw143/index.php?title=%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%95%E3%82%8C%E3%81%9FNotion%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AB%E3%82%88%E3%82%8BMediaWiki&amp;diff=313"/>
		<updated>2025-04-02T07:04:00Z</updated>

		<summary type="html">&lt;p&gt;Turgenev: Notion-MW&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;「[[Notion|Notion]]のページから下書きを除去した上で[[MediaWiki|MediaWiki]]フォーマットに変換してアップロードする」というこのサイトの動作機構に関して説明する。&lt;br /&gt;
&lt;br /&gt;
== 概要 ==&lt;br /&gt;
&lt;br /&gt;
Notionのページを見出しによって定まる木構造データとみなす。各見出しは無色（デフォルト）である場合と、黄色背景である場合があるとする。この木構造データに対し、「無色の頂点を全て切り落とす」という変換をする。すなわち、自らを包含する見出しが全て黄色であるコンテンツだけを残す。&lt;br /&gt;
&lt;br /&gt;
記事データにこのような変換を施すことで、同じページ内でも場所ごとに公開/非公開を簡便に切り替えられるようにするというのが基本的なアイデアである。&lt;br /&gt;
&lt;br /&gt;
* 例外的に、最初の見出しより前に書いてあるテキストは、必ず出力させる。つまり記事の冒頭に仮想的な「レベル0」の見出しがあると考えればよい。&lt;br /&gt;
* Notionではブロックを選択してショートカットキー「Ctrl+Shift+H」を押すことで直近に適用されたものと同じ色を適用することができるので、複数種類の色を使い分けているのでなければキー一発で公開/非公開を切り替えられる。&lt;br /&gt;
&lt;br /&gt;
さらに、このコンテンツをMediaWikiで公開することで、変更履歴を誰でも見ることができるようになる。これによりどのタイミングでどの箇所が修正されたかというメタコンテンツを「〇月〇日追記」のような形でコンテンツと混在させる必要がなくなる。&lt;br /&gt;
&lt;br /&gt;
また、その他にも頻繁に使われるメタ情報はMediaWikiのテンプレートとして挿入する。例えば、&lt;br /&gt;
&lt;br /&gt;
* ある見出しに属する（公開の）内容が完全に空（ほかの見出しすら含まれない）だった場合は、「作業のため一時的に非公開となっている可能性があります。&amp;amp;#91;履歴&amp;amp;#93;もご確認ください。」と表示するUnderConstruction‏‎テンプレートを挿入する。これにより、既に公開した内容を大幅変更のためなどで一時的に非公開にしたい場合は、該当の見出しの直後に同じレベルの無色の見出し（空でもよい）を挿入すればよいということになる。ただし、あまり使われていない。&lt;br /&gt;
* 内容は存在するものの完成度が低く、今後加筆予定であることを表すStubテンプレート。&lt;br /&gt;
* 執筆時点で古くなっている情報を表すOutdatedテンプレート。&lt;br /&gt;
* 他サイトにあまり書かれておらず貴重と思われる情報を表すValuableテンプレート。&lt;br /&gt;
&lt;br /&gt;
== データベース部分の設計 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;res-img&amp;quot;&amp;gt;https://turgenev.cloudfree.jp/mw1/imgs/notion-mw-db.jpg&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
このような感じで、「使うNotionページへのリンク」「スクリプトによる変換&amp;amp;amp;更新の対象にするかどうか」（←これは今はもう使われていない）「MediaWikiでのID」「MediaWikiでのタイトル」「MediaWikiでのカテゴリー」「サイトの更新日時（＝スクリプトによってMediaWiki側での編集が完了したタイミング）」をデータベースとして保持している。&lt;br /&gt;
&lt;br /&gt;
ページの新規作成時は「MediaWikiでのID」に&amp;lt;code&amp;gt;&amp;amp;#45;1&amp;lt;/code&amp;gt;を使おうと思ったが、なぜかここが&amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt;と&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;に分かれたrich_textの配列としてデータが返ってくることがあって困ったので&amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt;だけにするように変更した。&lt;br /&gt;
&lt;br /&gt;
Notion側でもページの最終更新日時が取れるので、それをこの表の更新日時と比べて、反映されていない更新があったら適用するという実装にしている。（ただし変換スクリプト自体を変更したときなどは全ページ生成し直す）&lt;br /&gt;
&lt;br /&gt;
== サイトマップの生成 ==&lt;br /&gt;
&lt;br /&gt;
上記でsandboxタグが入っているもの以外が検索サイトにインデックスしてほしいものたちである。そこで、編集完了後に、表の更新日時を使ってxmlサイトマップをスクリプトから生成する。&lt;br /&gt;
&lt;br /&gt;
== 変換コードの概説 ==&lt;br /&gt;
&lt;br /&gt;
大まかな流れは以下の通り。&lt;br /&gt;
&lt;br /&gt;
# 上記データベースの内容をNotion APIから取得する。以下、各行ごとに処理。&lt;br /&gt;
# ページの内容を取得し、黄色い見出しだけ残す変換を行う。Notionのブロックのリストができる&lt;br /&gt;
# notion&amp;amp;#45;to&amp;amp;#45;mdのblocksToMarkdownでマークダウン形式に変換する。&lt;br /&gt;
# いくつか前処理を行う。&lt;br /&gt;
# pandocを用いてMediaWikiに変換する。&lt;br /&gt;
# いくつか後処理（整形）を行う&lt;br /&gt;
# 完成した記事データをMediaWiki APIで投稿する。&lt;br /&gt;
&lt;br /&gt;
その他、ページのリネーム、新規作成時のIDの反映（&amp;lt;code&amp;gt;&amp;amp;#45;&amp;lt;/code&amp;gt;を数字に変える）、既存の記事を新規作成しようとした場合のエラーなど、前後に多少の処理がある。&lt;br /&gt;
&lt;br /&gt;
特筆すべき部分のみ以下で説明する。（おおむね処理の進行順）&lt;br /&gt;
&lt;br /&gt;
=== toggle ===&lt;br /&gt;
&lt;br /&gt;
detail&amp;amp;#45;summaryタグではなくMediaWikiの標準の折りたたみ形式であるmw&amp;amp;#45;collapsibleタグに変更。notion&amp;amp;#45;to&amp;amp;#45;md側を変えるのではなくpandocで変換した後のmediawikiでdetailsタグを置換している。&lt;br /&gt;
&lt;br /&gt;
さらに、summary部分の文字列の先頭に&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;が付いていたら折りたたみ状態に変える。これも置換でできる。&lt;br /&gt;
&lt;br /&gt;
* 完全な仕様としては例えばこんな感じ？（未実装）&lt;br /&gt;
** 先頭が&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;でない→折りたたまない&lt;br /&gt;
** 先頭が&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;&lt;br /&gt;
*** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;の次が&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;??&amp;lt;/code&amp;gt;を削除し、折りたたみ&lt;br /&gt;
*** &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;の次が&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;→&amp;lt;code&amp;gt;?!&amp;lt;/code&amp;gt;を削除し、折りたたまない&lt;br /&gt;
*** その他→&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt;だけを削除し、折りたたむ&lt;br /&gt;
&lt;br /&gt;
=== pandocの実行 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;cp.spawn(&amp;quot;pandoc&amp;quot;, [&amp;quot;-f&amp;quot;,&amp;quot;gfm&amp;quot;,&amp;quot;-t&amp;quot;, &amp;quot;mediawiki&amp;quot;, &amp;quot;--shift-heading-level-by=1&amp;quot;]);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;gfm&amp;lt;/code&amp;gt;（Github Flavored Markdown）から&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt;に変換する。&amp;lt;code&amp;gt;&amp;amp;#45;&amp;amp;#45;shift&amp;amp;#45;heading&amp;amp;#45;level&amp;amp;#45;by&amp;amp;#61;1&amp;lt;/code&amp;gt;は、[https://www.mediawiki.org/wiki/Help:Formatting/ja Help&amp;amp;#58;書式整形 &amp;amp;#45; MediaWiki]にもある通り、MediaWikiの記事内ではレベル1の見出しは非推奨だからである。&lt;br /&gt;
&lt;br /&gt;
=== 画像 ===&lt;br /&gt;
&lt;br /&gt;
キャプションが未対応（[https://github.com/souvikinator/notion-to-md/issues/63 https://github.com/souvikinator/notion-to-md/issues/63]）なので←に従ってsetCustomTransformerをする。&lt;br /&gt;
&lt;br /&gt;
[https://zenn.dev/st43/articles/8e2f9c48761e59 Notion API（v0.4.4）で画像を扱う]のようにNotionの内部画像の扱いは面倒なので当サイトではすべて外部ストレージ（もっと言えばMediaWiki内部）にアップロードしている。書式も適宜変換する。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;カテゴリ情報seo情報&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== カテゴリ情報、seo情報 ===&lt;br /&gt;
&lt;br /&gt;
データベースにあるタイトルとかtagsデータから生成する。seoについては[[MediaWiki|MediaWiki]] も参照。&lt;br /&gt;
&lt;br /&gt;
=== 各種の整形処理 ===&lt;br /&gt;
&lt;br /&gt;
一部コンテンツはnotion&amp;amp;#45;to&amp;amp;#45;mdで生成されるマークダウンそのままだと不都合があるので、専用のコードを入れて変換している。場合によってはnotion&amp;amp;#45;to&amp;amp;#45;md本体側にも変更を入れている（一旦特殊なエスケープシーケンスに変換しておいてpandocに触られるのを回避し、MediaWikiが返ってきてから自前で編集するようにしている箇所もある）。&lt;br /&gt;
&lt;br /&gt;
具体的には以下の通り。&lt;br /&gt;
&lt;br /&gt;
* 特殊文字の処理&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;amp;#42;&amp;lt;/code&amp;gt;などがマークダウンにおける特殊文字と解釈されてしまうのを防ぐためエスケープ。また、&amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#125;&amp;lt;/code&amp;gt;や&amp;lt;code&amp;gt;&amp;amp;#126;&amp;lt;/code&amp;gt;などはMediaWiki上の特殊文字であり、これもやはりエスケープする。&lt;br /&gt;
* ページ間リンク&lt;br /&gt;
** Notionでのページ間リンクをMediaWikiでのページ間リンクに変換するため、先ほどのデータベース表に従って&amp;lt;code&amp;gt;&amp;amp;#91;ページタイトル&amp;amp;#93;(/ページタイトル)&amp;lt;/code&amp;gt;という形式に変換する（するとpandocが自動で&amp;lt;code&amp;gt;&amp;amp;#91;&amp;amp;#91;ページタイトル|ページタイトル&amp;amp;#93;&amp;amp;#93;&amp;lt;/code&amp;gt;に変換してくれる）&lt;br /&gt;
&lt;br /&gt;
=== テンプレート挿入 ===&lt;br /&gt;
&lt;br /&gt;
「!s」だけの行があったら&amp;amp;#123;&amp;amp;#123;Stub&amp;amp;#125;&amp;amp;#125;テンプレートに変換する、というような実装にしている。&lt;br /&gt;
&lt;br /&gt;
== オリジナルのnotion&amp;amp;#45;to&amp;amp;#45;mdへの変更 ==&lt;br /&gt;
&lt;br /&gt;
上記のような良い感じのMediaWikiに変換する目的と、単純にできたばかりでバグが多いため、色々変えている。&lt;br /&gt;
&lt;br /&gt;
=== リポジトリ ===&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ge9/notion-to-md-mediawiki Githubリポジトリ]を作成したので、最新情報はそちらから。&lt;br /&gt;
&lt;br /&gt;
=== 数式関連 ===&lt;br /&gt;
&lt;br /&gt;
以前は変えていたが[https://github.com/souvikinator/notion-to-md/commit/fdd96ca0362663c914cd5fde62baef520dae6763 https://github.com/souvikinator/notion-to-md/commit/fdd96ca0362663c914cd5fde62baef520dae6763]で改善されたため不要&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;mdts内&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;md.ts&amp;lt;/code&amp;gt;内 ===&lt;br /&gt;
&lt;br /&gt;
==== 書式 ====&lt;br /&gt;
&lt;br /&gt;
太字、斜体、取り消し線、コード（&amp;lt;code&amp;gt;`&amp;lt;/code&amp;gt;）をそれぞれhtmlタグのstrong, em, s, codeに変更。&amp;lt;code&amp;gt;```&amp;lt;/code&amp;gt;は変えていない（markdownにおける&amp;amp;lt;pre&amp;amp;gt;の動作が怪しかったため）。&lt;br /&gt;
&lt;br /&gt;
==== ハイパーリンク ====&lt;br /&gt;
&lt;br /&gt;
pandocでの変換においてハイパーリンクの後にスペースなどを開けずに文字が続くとバグることがあるので、他で使わない固定文字列のセパレータを挿入し、変換後に消す。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;codeblock&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== codeBlock ====&lt;br /&gt;
&lt;br /&gt;
コードにおいて、言語がpythonなどの良く知られたものに設定されていると、pandocによって&amp;lt;strong&amp;gt;syntaxhighlight&amp;lt;/strong&amp;gt;タグに変えられてしまう。今回はSyntaxHightlight拡張機能が無効のMediaWikiを使っているので、言語にダミー文字列を付加する（付加ではなくダミー文字列だけにしても変わらないが、情報を落とすのは勿体ない気がしたので）。またpandoc側の問題で&amp;lt;code&amp;gt;visual basic&amp;lt;/code&amp;gt;のように言語名にスペースが入っていると&amp;lt;code&amp;gt;visual&amp;lt;/code&amp;gt;だけになってしまうようなので、スペースをアンダースコアに置換。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;language = &amp;quot;dummy_str_&amp;quot;+language?.replace(&amp;quot; &amp;quot;, &amp;quot;_&amp;quot;);//for MediaWiki without SyntaxHightlight extension&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;notion&amp;amp;#45;to&amp;amp;#45;mdts内&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;notion&amp;amp;#45;to&amp;amp;#45;md.ts&amp;lt;/code&amp;gt;内 ===&lt;br /&gt;
&lt;br /&gt;
==== 特殊文字エスケープ ====&lt;br /&gt;
&lt;br /&gt;
大きく分けて、notion&amp;amp;#45;to&amp;amp;#45;mdの欠点を補うための弱いエスケープ（&amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;の付加）と、pandocでの変換を回避するための強いエスケープ（数値に変換して他で使わないセパレータで囲う）がある。&lt;br /&gt;
&lt;br /&gt;
解説が面倒なのでコードだけとりあえず。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;//`のみcodeに変え、```は```のままという仕様の場合&lt;br /&gt;
          if (content.type === &amp;quot;text&amp;quot;){&lt;br /&gt;
            if (type == &amp;quot;code&amp;quot;){&lt;br /&gt;
              //```の内部では&amp;lt;&amp;gt;は無効なので本来は不要だが、detailsまわりが修正されるまで、&amp;lt;&amp;gt;を最強エスケープの対象としておく。&lt;br /&gt;
              //無事修正されたので、対象外に&lt;br /&gt;
              //plain_text =  plain_text.replace(/[&amp;lt;&amp;gt;]/g, (c) =&amp;gt;&amp;quot;m_esc_&amp;quot; + c.charCodeAt(0)+&amp;quot;_m&amp;quot;)&lt;br /&gt;
              //バッククォートはmarkdownの```の中でも有害になる珍しい文字であるが、外側と対処法が異なる。&lt;br /&gt;
              //markdownでコード内に`を書くには、両側をそれより多い`で囲うしかなく（\`や&amp;amp;#96;ではそれがそのまま表示されてしまう）、その実装が面倒である。&lt;br /&gt;
              //そこで、最強エスケープをかけて、MediaWikiに変換してから元に戻す。ちなみにMediaWikiでは`は特殊文字ではないのでエスケープ文字ではなくベタ書きに戻す。&lt;br /&gt;
              plain_text =  plain_text.replace(/`/g, (c) =&amp;gt; &amp;quot;m_esc_&amp;quot; + c.charCodeAt(0)+&amp;quot;_m&amp;quot;)&lt;br /&gt;
              &lt;br /&gt;
            }else{//テキストエリア&lt;br /&gt;
              //以下は、MediaWikiの特殊文字であるにもかかわらずpandocがそのままべた書きしてしまう文字。最強エスケープが必要。&lt;br /&gt;
              //これらはMarkdownの```およびMediaWikiのpreの内側では無害である。（外側では特殊文字であるものとそうでないものがある。）&lt;br /&gt;
              plain_text = plain_text.replace(/[=;:#*&#039;{}~\-\[\]]/g, (c) =&amp;gt; &amp;quot;m_esc_&amp;quot; + c.charCodeAt(0)+&amp;quot;_m&amp;quot;)&lt;br /&gt;
              &lt;br /&gt;
              //これらは、Markdownのテキストエリアでは特殊文字だが、MediaWikiの特殊文字ではないあるいはpandocがちゃんと扱えるもの。&lt;br /&gt;
              //（ただし、&amp;quot;.&amp;quot;（ピリオド）のみ、「リンクテキストもURLになっているリンク及びcode内に書かれた（リンクでない）URLがpandocの変換でおかしくなるのを防ぐ」という目的で入れている。）&lt;br /&gt;
              //この変換は先ほどの最強エスケープより後でなければいけない。（#が最強エスケープされるのを防ぐため）（もちろん同時でもいい）&lt;br /&gt;
              //スラッシュでのエスケープだと`&amp;lt;`でバグったことがあった（おそらくpandocのせい）ので、&amp;amp;#xx;を使用&lt;br /&gt;
              plain_text = plain_text.replace(/[`$+&amp;amp;&amp;lt;&amp;gt;\\.]/g, (c) =&amp;gt; &amp;quot;&amp;amp;#&amp;quot; + c.charCodeAt(0)+&amp;quot;;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
              //2つ以上の連続する空白文字は（そのように表示したい特別な理由があると考えて）&amp;amp;nbsp;に変換。これは&amp;amp;のエスケープより後である必要がある。&lt;br /&gt;
              plain_text = plain_text.replace(/ {2,}/g, (c) =&amp;gt; c.split(&#039;&#039;).map(function() { return &#039;&amp;amp;nbsp;&#039;; }).join(&#039;&#039;))&lt;br /&gt;
&lt;br /&gt;
              //notion-to-mdがブロック内改行に対応していないので対応。nbspへの変換より後に行う。&lt;br /&gt;
              plain_text = plain_text.replace(/\n/g, &amp;quot;  \n&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            //また、&amp;quot;も、mediawikiでの特殊文字ではないが、pandocでは&amp;amp;quot;に変換される。&lt;br /&gt;
            //ベタ書きでも表示には影響ないが、span id=&amp;quot;&amp;quot;の中身に生のダブルクォーテーションが入ってしまう副作用があるし、その他問題が起きる可能性がある。&lt;br /&gt;
            //下記のように最強エスケープすればそのまま書けるが、&amp;amp;quot;を&amp;quot;にしてデータ量を削減するより安全を取ったほうが良さそうである。&lt;br /&gt;
            //ちなみに1文字減らすために最強エスケープから&amp;amp;#34;に戻す方法もあるが、&amp;amp;quot;のほうが自動でspan id=&amp;quot;&amp;quot;の中身から除去されるようなのでそのほうが良さそう。&lt;br /&gt;
            //plain_text = plain_text.replace(/[&amp;quot;]/g, (c) =&amp;gt; &amp;quot;m_esc_&amp;quot; + c.charCodeAt(0)+&amp;quot;_m&amp;quot;)&lt;br /&gt;
          }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== ブロック内改行 ====&lt;br /&gt;
&lt;br /&gt;
NotionではShift+Enterによりブロック内での改行が可能であるが、notion&amp;amp;#45;to&amp;amp;#45;mdはこれに対応していないので、Markdownの文法に従って行末に半角スペースを2つ追加する。&lt;br /&gt;
&lt;br /&gt;
また、改行を連続して2つ入れると（末尾に空白2つがあっても）Markdownの改段落扱いになり、意図した表示にならないため、避ける。&lt;br /&gt;
&lt;br /&gt;
==== コードブロックへのキャプション ====&lt;br /&gt;
&lt;br /&gt;
notion&amp;amp;#45;to&amp;amp;#45;mdでは未対応である。とりあえず独自でつけている。&lt;br /&gt;
&lt;br /&gt;
==== ページ間リンク ====&lt;br /&gt;
&lt;br /&gt;
ページ間のメンションであれば、MediaWiki上での記事リンクにする（前述）。そのためのマーカーを付加しておく。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;取り消し線下線の部分の除去&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
==== 取り消し線&amp;amp;amp;下線の部分の除去 ====&lt;br /&gt;
&lt;br /&gt;
取り消し線と下線が両方指定されているテキストは除去する。これは見出しごとではなく特定の文言だけ非公開にしたい場合のための措置だが、怖いのであまり使っていない。&lt;br /&gt;
[[Category:IT]]{{#seo:|title={{FULLPAGENAME}} - Turgenev&#039;s Wiki}}&lt;/div&gt;</summary>
		<author><name>Turgenev</name></author>
	</entry>
</feed>