(2023/10/11 ページ構成を手直し)
PowerShellスクリプト(ps1)に対して、ファイルをドラッグ&ドロップしてもファイルを認識して実行してくれない。
また、そもそもPowerShellスクリプトを実行しようとしても、下記のエラーで実行ができない。
1 | PS C:\Users\osakanataro\Documents\powershell> .\powershelltest.ps1 |
2 | スクリプトの実行がシステムで無効になっているため、ファイル C:\Users\osakanataro\Documents\powershell\powershelltest.ps1 を読み込めません。詳細については、「 get-help about_signing」と入力してヘルプを参照してください。 |
3 | 発生場所 行:1 文字:25 |
4 | + .\powershelltest.ps1 <<<< |
5 | + CategoryInfo : NotSpecified: (:) []、PSSecurityException |
6 | + FullyQualifiedErrorId : RuntimeException |
7 |
8 | PS C:\Users\osakanataro\Documents\powershell> |
回避方法として、バッチファイルの中からPowerShellを起動する、というものが知られている。
具体的には以下の様なバッチファイルを作って、バッチファイルをクリックする、というものになる。
1 | @echo off |
2 | rem PowerShellスクリプトの実行が禁止されている場合に |
3 | rem このバッチファイルを管理者権限で動作させると |
4 | rem PowerShellスクリプトが実行できます。 |
5 |
6 | powershell -sta -ExecutionPolicy Unrestricted -File %0\..\powershelltest.ps1 %* |
この場合、PowerShellスクリプトのファイルと、バッチファイルの2つを同時に配布しなければならない、という問題がある。
これを解消するために、バッチファイルの中にPowerShellスクリプトの記述も含めてしまおう、という技がある。
1 | @echo off |
2 | powershell -sta -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 2})-join\"`n\");&$s" %*&goto:eof |
3 | # こんな感じで書く |
4 | $PSVersionTable |
5 | などPowerShellスクリプトの内容を記載 |
やってることは、バッチファイルからPowerShellを起動したら、そのPowerShellは、いま起動に使ったバッチファイルの2行目の次からスクリプトを読み出しを開始しバッチファイルの最後まで読み込んだあと、PowerShellスクリプトとして実行を開始する、というもの
これによって、バッチファイル1個だけでPowerShellを実行できるようになる。
ただ、この技を使うとLinux/MacOSXなどの他OSのPowerShell環境で動作させにくくなる、という弊害もあるので、Windows環境のみで使う場合にとどめておくと良い。
別解として下記もあると教えていただきました。
1 | @ set args=%* |
2 | @ powershell "iex( (@('','','')+(cat '%~f0'|select -skip 3))-join[char]10)" |
3 | @ exit /b %ERRORLEVEL% |
ここから下は以前の記述
回避方法は下記の2つを行う、ということ
・バッチファイル経由でPowerShellを起動する
・うまく行かない場合は、管理者権限でバッチファイルを起動する
今回使用したバッチファイルは下記の内容とした
1 | @ echo off |
2 | rem PowerShellスクリプトの実行が禁止されている場合に |
3 | rem このバッチファイルを管理者権限で動作させると |
4 | rem PowerShellスクリプトが実行できます。 |
5 |
6 | powershell -sta -ExecutionPolicy Unrestricted -File %0\..\powershelltest.ps1 %* |
なお、powershell起動時に「-sta」オプションをつけているのは、powershellからフォームダイアログを開こうとすると、下記のエラーがでてしまうことを回避するためです。

なお、詳細を開くと下記の情報が出力されている
1 | Just-In-Time (JIT) デバッグを呼び出すための詳細については、 |
2 | ダイアログ ボックスではなく、このメッセージの最後を参照してください。 |
3 |
4 | ************** 例外テキスト ************** |
5 | System.InvalidOperationException: DragDrop 登録は成功しませんでした。 ---> System.Threading.ThreadStateException: OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。Main 関数に STAThreadAttribute が設定されていることを確認してください。 |
6 | 場所 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept) |
7 | --- 内部例外スタック トレースの終わり --- |
8 | 場所 System.Windows.Forms.Control.SetAcceptDrops(Boolean accept) |
9 | 場所 System.Windows.Forms.Control.OnHandleCreated(EventArgs e) |
10 | 場所 System.Windows.Forms.ListBox.OnHandleCreated(EventArgs e) |
11 | 場所 System.Windows.Forms.Control.WmCreate(Message& m) |
12 | 場所 System.Windows.Forms.Control.WndProc(Message& m) |
13 | 場所 System.Windows.Forms.ListBox.WndProc(Message& m) |
14 | 場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) |
15 | 場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) |
16 |
17 |
18 | ************** 読み込まれたアセンブリ ************** |
19 | mscorlib |
20 | アセンブリ バージョン: 2.0.0.0 |
21 | Win32 バージョン: 2.0.50727.5485 (Win7SP1GDR.050727-5400) |
23 | ---------------------------------------- |
24 | Microsoft.PowerShell.ConsoleHost |
25 | アセンブリ バージョン: 1.0.0.0 |
26 | Win32 バージョン: 6.1.7600.16385 |
28 | ---------------------------------------- |
29 | System |
30 | アセンブリ バージョン: 2.0.0.0 |
31 | Win32 バージョン: 2.0.50727.8686 (QFE.050727-8600) |
33 | ---------------------------------------- |
34 | System.Management.Automation |
35 | アセンブリ バージョン: 1.0.0.0 |
36 | Win32 バージョン: 6.1.7601.17514 |
38 | ---------------------------------------- |
39 | Microsoft.PowerShell.Commands.Diagnostics |
40 | アセンブリ バージョン: 1.0.0.0 |
41 | Win32 バージョン: 6.1.7601.17514 |
43 | ---------------------------------------- |
44 | System.Core |
45 | アセンブリ バージョン: 3.5.0.0 |
46 | Win32 バージョン: 3.5.30729.5420 built by: Win7SP1 |
47 | コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll |
48 | ---------------------------------------- |
49 | System.Configuration.Install |
50 | アセンブリ バージョン: 2.0.0.0 |
51 | Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400) |
53 | ---------------------------------------- |
54 | Microsoft.WSMan.Management |
55 | アセンブリ バージョン: 1.0.0.0 |
56 | Win32 バージョン: 6.1.7601.17514 |
58 | ---------------------------------------- |
59 | System.Transactions |
60 | アセンブリ バージョン: 2.0.0.0 |
61 | Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400) |
63 | ---------------------------------------- |
64 | Microsoft.PowerShell.Commands.Utility |
65 | アセンブリ バージョン: 1.0.0.0 |
66 | Win32 バージョン: 6.1.7601.17514 |
68 | ---------------------------------------- |
69 | Microsoft.PowerShell.Commands.Management |
70 | アセンブリ バージョン: 1.0.0.0 |
71 | Win32 バージョン: 6.1.7601.17514 |
73 | ---------------------------------------- |
74 | Microsoft.PowerShell.Security |
75 | アセンブリ バージョン: 1.0.0.0 |
76 | Win32 バージョン: 6.1.7601.17514 |
78 | ---------------------------------------- |
79 | Microsoft.PowerShell.ConsoleHost.resources |
80 | アセンブリ バージョン: 1.0.0.0 |
81 | Win32 バージョン: 6.1.7600.16385 |
83 | ---------------------------------------- |
84 | System.Xml |
85 | アセンブリ バージョン: 2.0.0.0 |
86 | Win32 バージョン: 2.0.50727.5494 (Win7SP1GDR.050727-5400) |
88 | ---------------------------------------- |
89 | System.Management |
90 | アセンブリ バージョン: 2.0.0.0 |
91 | Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400) |
93 | ---------------------------------------- |
94 | System.DirectoryServices |
95 | アセンブリ バージョン: 2.0.0.0 |
96 | Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400) |
98 | ---------------------------------------- |
99 | System.Management.Automation.resources |
100 | アセンブリ バージョン: 1.0.0.0 |
101 | Win32 バージョン: 6.1.7600.16385 |
103 | ---------------------------------------- |
104 | Microsoft.WSMan.Management.resources |
105 | アセンブリ バージョン: 1.0.0.0 |
106 | Win32 バージョン: 6.1.7601.17514 |
108 | ---------------------------------------- |
109 | mscorlib.resources |
110 | アセンブリ バージョン: 2.0.0.0 |
111 | Win32 バージョン: 2.0.50727.5485 (Win7SP1GDR.050727-5400) |
113 | ---------------------------------------- |
114 | Microsoft.PowerShell.Security.resources |
115 | アセンブリ バージョン: 1.0.0.0 |
116 | Win32 バージョン: 6.1.7601.17514 |
118 | ---------------------------------------- |
119 | System.Data |
120 | アセンブリ バージョン: 2.0.0.0 |
121 | Win32 バージョン: 2.0.50727.8692 (QFE.050727-8600) |
122 | コードベース: file:///C:/Windows/assembly/GAC_64/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll |
123 | ---------------------------------------- |
124 | System.Windows.Forms |
125 | アセンブリ バージョン: 2.0.0.0 |
126 | Win32 バージョン: 2.0.50727.5491 (Win7SP1GDR.050727-5400) |
127 | コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll |
128 | ---------------------------------------- |
129 | System.Drawing |
130 | アセンブリ バージョン: 2.0.0.0 |
131 | Win32 バージョン: 2.0.50727.5495 (Win7SP1GDR.050727-5400) |
132 | コードベース: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll |
133 | ---------------------------------------- |
134 | Accessibility |
135 | アセンブリ バージョン: 2.0.0.0 |
136 | Win32 バージョン: 2.0.50727.5483 (Win7SP1GDR.050727-5400) |
137 | コードベース: file:///C:/Windows/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll |
138 | ---------------------------------------- |
139 | System.Windows.Forms.resources |
140 | アセンブリ バージョン: 2.0.0.0 |
141 | Win32 バージョン: 2.0.50727.5420 (Win7SP1.050727-5400) |
143 | ---------------------------------------- |
144 |
145 | ************** JIT デバッグ ************** |
146 | Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、 |
147 | またはコンピュータ (machine.config) の構成ファイルの jitDebugging |
148 | 値を system.windows.forms セクションで設定しなければなりません。 |
149 | アプリケーションはまた、デバッグを有効にしてコンパイルされなければ |
150 | なりません。 |
151 |
152 | 例: |
153 |
154 | <configuration> |
155 | <system.windows.forms jitDebugging="true" /> |
156 | </configuration> |
157 |
158 | JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、 |
159 | ハンドルされていない例外はすべてコンピュータに登録された |
160 | JIT デバッガに設定されなければなりません。 |
2021/05/12追記
これをさらにすすめて、バッチファイル内にPowerShellスクリプトを書いてしまう、という技もあることを知った。
1 | powershell -sta -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 1})-join\"`n\");&$s" %*&goto:eof |
2 | # こんな感じで書く |
3 | $PSVersionTable |
4 | ~ |
注意点として、powershellを起動するより前に日本語を書いてはいけない、ということ
これはDOSプロンプトとPowerShellとで日本語の取り扱いが異なるため発生しているので、DOS側では日本語を取り扱わず、PowerShellが起動した後には使う、というようにしなければならない
また、@echo offを入れたい、という場合は下記の様にreadcount の後の数字を増やして対応する。(指定行数より後をPowerShellスクリプトとして読み込み、という命令)
1 | @echo off |
2 | powershell -sta -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\"|?{$_.readcount -gt 2})-join\"`n\");&$s" %*&goto:eof |
3 | # こんな感じで書く |
4 | $PSVersionTable |
5 | ~ |