PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法 で、C# のコードを使って PowerShell 内で『ファイルを開くダイアログ』を使用しました。 ここでは、その結果のパスを VBScript に渡す方法として、TEMP フォルダに適当なファイルを作成して引き渡します。呼び出しはもちろん VBScript から行います。この呼び出しは同期処理なので、特に問題なく順番に実行されます。 方法として、PowerShell の標準出力を VBScript で取り込む方法もあるのですが、その場合は VBScrip からの呼び出しが非同期となってしまうので、ユーザ側の操作が少し煩雑になるのでテキストファイル渡しとしました。 さらにもう一つ、InternetExplorer.Application オブジェクトを使用してクリップボード経由で取り込む方法もありますが、IE11 はさすがにいつどうなるか解らないので避けたいところです。( htmlfile オブジェクトでもできるはずですが、やはりテキストファイル経由が確実と思われます ) Windows7 の PowerShell で -Sta 引数を使う PowerShell スクリプトの呼び出しは、セキュリティ上の問題で設定が必要なので、PowerShell の引数で一時的に実行可能にするのですが、Windows7 で -Sta を指定しないと動作しないので注意です。(Windows10 は動いています。Windows7 : バージョン2 / Windows10 : バージョン5 ) get_ps_tempfile.vbs
Set WshShell = WScript.CreateObject("WScript.Shell")
Set Fso = CreateObject( "Scripting.FileSystemObject" )
' 同期処理で実行( コマンドプロンプトは開かない )
Call WshShell.Run( "powershell -NoProfile -ExecutionPolicy Unrestricted .\open_file_dialog_cs.ps1", 0, True )
' Windows7 では、powershell -Sta -NoProfile -ExecutionPolicy Unrestricted .\open_file_dialog_cs.ps1
strPath = WshShell.ExpandEnvironmentStrings("%temp%")
' PowerShell 内の C# が出力したパスを取得
Set objHandle = Fso.OpenTextFile( strPath & "\_param.txt", 1 )
strParam = objHandle.ReadAll
objHandle.Close
if strParam = "キャンセルされました" then
MsgBox "ここで処理を中断"
else
' 取得したパス
MsgBox strParam
end if
PowerShell 独特の世界をいまさら覚える時間もったいないので、C# で書いたほうがいろいろ手っ取り早いと思います。(取り回しは、VBScript だけでなんとかなりそうな気もしてます) open_file_dialog_tempfile_cs.ps1
$code = @"
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
public class MyClass {
public static string Open() {
OpenFileDialog obj = new OpenFileDialog();
obj.Filter = "Excel|*.xlsx|旧 Excel|*.xls|全て|*.*";
obj.InitialDirectory = @"C:\";
if (obj.ShowDialog() == DialogResult.OK) {
return obj.FileName;
}
else {
return "キャンセルされました";
}
}
public static void Put(string param) {
string path = Environment.GetEnvironmentVariable("temp");
if (path == null) {
path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
path = string.Format(@"{0}\_param.txt", path);
// SHIFT_JIS で書き込み
Encoding Enc = Encoding.GetEncoding(932);
using (StreamWriter WriteFile = new StreamWriter( path, false, Enc )) {
WriteFile.Write(param);
WriteFile.Close();
}
}
}
"@
Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")
$param = [MyClass]::Open()
[MyClass]::Put($param)
|
|
【VBScriptの最新記事】
- 指定した位置でレジストリエディタを開く為の VBScript をダウンロードします
- VBScript(WSH) と PHP(7.3) で氏名をランダムに作成
- VBScript : XCOPYで新しいファイルのみバックアップする為のスクリプトを作成するスクリプト
- VBScript : XMLファイルのテキストノードの値の更新
- HTA : 指定したキーでレジストリエディタを開く
- WSH(VBScript) : 指定したキーでレジストリエディタを開く
- VBScript : WEB上のHTMLを使用して、InternetExplorer.Application でパスワード入力を実装する
- VBS : 正規表現で、URL リストの中のドメイン部分のみを取り出す
- 文字列を指定してその名前の変数でオブジェクトを作成する : WEB に VBScript ライブラリ
- 実行中のスクリプトのタイプを知る : WEB に VBScript ライブラリ
- VBS : FileZilla用誰にでも使える拡張子ランチャー






