シャットダウンダイアログを開く( VBscript, Jscript, C#, C# in PowerShell, PowerShell, PHP, Python, Ruby )

ALT + F4



デスクトップをクリックまたは、デスクトップだけを表示してこのショートカットで開きます。Windows のアプリケーションは通常このショートカットで終了します。(タイトルバーの左上のアイコンをクリックするとメニューが表示されてその中にあります)



VBScript
set objShell = CreateObject("shell.application")
call objShell.ShutdownWindows()

Shell.ShutdownWindows method

Jscript
var objShell = new ActiveXObject("shell.application");
objShell.ShutdownWindows();


C# : VisualStudio
using System;

namespace ShutdownDialog
{
	class Program
	{
		static void Main(string[] args)
		{
			dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("shell.application"));
			shell.ShutdownWindows();

		}
	}
}


PowerShell 内で C#
$code = @"
using System;
public class MyClass {
	public static void Main() {

		dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("shell.application"));
		shell.ShutdownWindows();

	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("Microsoft.CSharp")

[MyClass]::Main()


PowerShell のみ
$shell = New-Object -ComObject Shell.Application
$shell.ShutdownWindows()


PHP
<?php
$shell = new COM( "shell.application" );
$shell->ShutdownWindows();
?>


Python
import win32com.client
shell = win32com.client.Dispatch("shell.application")
shell.ShutdownWindows()

pywin32 が必要なので、こちらを参照してください

Ruby
require 'win32ole'
shell = WIN32OLE.new('shell.application')
shell.ShutdownWindows()






C# を PowerShell で実行 : メッセージボックスの応答結果をファイルに書き込む ( バッチファイルで利用可能 )

まずは動作確認の為、VisualStudio でコードを完成させます。
using System;
using System.IO;
using System.Windows.Forms;

namespace MessageBoxConsole
{
	class Program
	{
		static void Main(string[] args)
		{
			// テンポラリフォルダのパスを取得
			string path = Environment.GetEnvironmentVariable("temp");

			// 書き込むファイルのフルパスを編集する
			string writePath = $@"{path}\_check_result";

			// MessageBox を表示する( System.Windows.Forms の参照が必要です )
			// ※ OK か Cancel のボタンが表示されます
			DialogResult check = MessageBox.Show("実行しますか?", "確認", MessageBoxButtons.OKCancel);
			using (StreamWriter sw = new StreamWriter(writePath, false))
			{
				// OK ならば、ファイルに 1 を書き込みます
				if (check == DialogResult.OK)
				{
					sw.Write("1");
				}
				// CANCEL ならば、ファイルに 0 を書き込みます
				else
				{
					sw.Write("0");
				}

				// ファイルを閉じます
				sw.Close();

			}
		}
	}
}

▼ System.Windows.Forms の参照


次に PowerShell のスクリプトを作成して C# のコードを実行させます。その為に、PowerShell でスクリプトの実行を許可する手順 で設定を済ませておきます。

msgbox.ps1
$code = @"
using System;
using System.IO;
using System.Windows.Forms;
public class MyClass {
	public static void Main() {

		// テンポラリフォルダのパスを取得
		string path = Environment.GetEnvironmentVariable("temp");

		// 書き込むファイルのフルパスを編集する
		string writePath = string.Format( @"{0}\_check_result", path );

		// MessageBox を表示する( System.Windows.Forms の参照が必要です )
		// ※ OK か Cancel のボタンが表示されます
		DialogResult check = MessageBox.Show("実行しますか?", "確認", MessageBoxButtons.OKCancel);
		using (StreamWriter sw = new StreamWriter(writePath, false))
		{
			// OK ならば、ファイルに 1 を書き込みます
			if (check == DialogResult.OK)
			{
				sw.Write("1");
			}
			// CANCEL ならば、ファイルに 0 を書き込みます
			else
			{
				sw.Write("0");
			}

			// ファイルを閉じます
			sw.Close();

		}

	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::Main()


テキストファイルに結果を出力しているので、以下のようなバッチファイルで利用する事ができます
echo off

echo 処理を開始しました

powershell .\msgbox.ps1

FOR /F %%i IN (%temp%\_check_result) DO (
	if "%%i"=="1" goto :ok
	if "%%i"=="0" goto :cancel
)

:ok
echo OK を選択しました
goto :end

:cancel
echo Cancel を選択しました
goto :end


:end





PowerShell でスクリプトの実行を許可する手順

まず、PowerShell のスクリプトを作成して以下の内容を書き込みます

open-cur.ps1

$PSVersionTable
start .

start は、Start-Process のエイリアスで、この記述ではカレントフォルダをエクスプローラで開きます ( $PSVersionTable はバージョンの表示です )

スクリプトを保存したフォルダをエクスプローラで選択し、SHIFTキーを押しながら右クリックして『PowerShell ウインドウをここに開く』を選択します。

初期状態ではスクリプトの実行が許可されていないので、.\open-cur と入力してエラーが出る事を確認してから、ウインドウキー + I で設定ウインドウを開いて『更新とセキュリティ』を選択します。左サイドの内容の一覧から『開発者向け』を選んでかせ右サイドを一番したまでスクロールします。

PowerShell のスクリプトの実行が許可されていない場合は、チェックボックスが青色になっているのでその下の『適用』ボタンをクリックしてチェックボックスが灰色になれば設定は完了です。

.\open-cur と再度入力して結果を確認します

設定を元に戻すには

管理者権限で PowerShell のウインドウを開く必要があるので、CTRL + SHIFT で現在開いている PowerShell のウインドウのタスクバーのアイコンをクリックします。そして、以下のコマンドを入力してください

Set-ExecutionPolicy Restricted -Scope CurrentUser -Force

設定を変更せずにスクリプトを実行するには

以下の内容を書き込んだバッチファイルを作成して、バッチファイルにスクリプトの名前部分を渡して実行できます

@powershell -NoProfile -ExecutionPolicy Unrestricted "./%1.ps1"

PowerShell ウインドウでは、ps.bat スクリプト名
コマンドプロンプトでは ps スクリプト名

で実行できます

スタートメニューの PowerShell をコマンドプロンプトに変更して、エクスプローラの右クリックからもコマンドプロンプトを実行できるようにする

タスクバーを右クリックして、『タスクバーの設定』を選択



コマンドプロンプトを PowerShell に置き換えるを オフにする



PowerShell は、エクスプローラでフォルダを SHIFT キーを押しながら右クリックして表示されるメニューであるので問題ありません。

エクスプローラを右クリックしてコマンドプロンプトを開きたい場合は、以下のレジストリをインポートします(右端のダウンロードアイコンでダウンロード / 拡張子 .reg )
Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\Folder\shell\cmd]
@="コマンドプロンプト(&Q)"
 
[HKEY_CLASSES_ROOT\Folder\shell\cmd\command]
@="cmd.exe /s /k pushd \"%V\""


▼ 削除は以下です
Windows Registry Editor Version 5.00
 
[-HKEY_CLASSES_ROOT\Folder\shell\cmd]