2022年5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« 2007年6月 | トップページ | 2007年8月 »

2007年7月31日 (火)

PowerShellの.PS1ファイルをウィンドウ アプリっぽく実行する。

WSHホストには、コンソール バージョンとウィンドウ バージョンがありますが、
PowerShellには、バッチファイルと同じで、コンソール バージョンしかありません。
そこで、.PS1ファイルをウィンドウ アプリっぽく実行します。

WPowerShell.WSF PS1ファイル [引数...]

<package>
<job>
<script language=vbscript>
Dim Args
Dim Arg
Args=Array("CScript.exe //job:exec",""""&WScript.ScriptFullName&"""")
For Each Arg In WScript.Arguments
  ReDim Preserve Args(UBound(Args)+1)
  Args(UBound(Args))=""""&Arg&""""
Next
WScript.Quit CreateObject("WScript.Shell").Run(Join(Args),7,True)
</script>
</job>
<job id=exec>
<script language=vbscript>
Dim oExec
Dim Args
Dim Arg
Dim k
Dim StdErr
Dim StdOut
Args=Array("powershell.exe -NonInteractive -command ""&")
For k=0 To WScript.Arguments.Count()-1
  Arg=WScript.Arguments.Item(k)
  If k=0 Then If InStr(Arg,"\")=0 Then Arg=".\"&Arg
  ReDim Preserve Args(UBound(Args)+1)
  If InStr(Arg," ") Then
    Args(UBound(Args))="'"&Arg&"'"
  Else
    Args(UBound(Args))=Arg
  End If
Next
Args=Join(Args)&""""
Set oExec=CreateObject("WScript.Shell").Exec(Args)
oExec.StdIn.Close
StdErr=oExec.StdErr.ReadAll()
StdOut=oExec.StdOut.ReadAll()
If StdErr<>"" Then MsgBox Join(Array(Args,Empty,StdErr),vbLf),vbCritical,WScript.ScriptName&" - StdErr"
If StdOut<>"" Then MsgBox Join(Array(Args,Empty,StdOut),vbLf),vbInformation,WScript.ScriptName&" - StdOut"
WScript.Quit oExec.ExitCode
</script>
</job>
</package>

一応、標準出力と標準エラーは、もしあれば、MsgBoxでウィンドウ表示しますが、
量が多いと、Exec()のパイプが詰まってハングアップしたり、
MsgBox()で表示しきれないので、あまり出さないようにしてください。

コンソールウィンドウは非表示でもよいのですが、念のため、非アクティブな
最小化ウィンドウにしています。Run(,7,)をRun(,0,)に変えれば、非表示です。

これを.PS1ファイルの関連付けに指定するときは、
WScript.exe "フルパス\WPowerShell.WSF" "%1" %*
のようにします。

2007年7月30日 (月)

PowerShellの.PS1ファイルを起動する。

もし、引数が不要なら、PS1ファイルをPowerShell.exeの標準入力に流し込んでも実行できます。
この場合は、セキュリティ設定がRestrictedでもOKです。

powershell.exe -command - <PS1ファイル

ただし、複文が複数行に跨ると駄目です。文末に;を入れて一行で完結すれば通ります。
if()
{


}
else
{


}

if(){~;~;}else{~;~;}

或いは、もっと簡単に、後ろに空行があるとよいようです。

なので、

(MORE PS1ファイル & ECHO;) | powershell.exe -command -

でよいでしょう。

2007年7月29日 (日)

PowerShellの.PS1ファイルを起動するバッチファイル(その2)

PS1ファイルのコマンドラインをPowerShell.exeの標準入力に与えても起動できます。

PS2.CMD PS1ファイル [引数...]

ECHO ^^^& %*|powershell.exe -command -

この場合の空白区切りのエスケープには、"も使えます。なので変換は不要です。

ここでは、PS1ファイル名の変換はしてないので、\を含むパス名を指定する必要があります。

2007年7月28日 (土)

PowerShellの.PS1ファイルを起動するバッチファイル(その1)

PowerShell外のコマンドラインで.PS1ファイルを起動するのは、
シンタクスが一般の慣行と異なるため、少々厄介です。
特に、引数に長いファイル名を指定する場合が困ります。
そこで、バッチファイルで普通のシンタクスから変換して起動します。

PS1.CMD PS1ファイル [引数...]

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET ARGS=%*
SET ARG1=%~1
IF "%ARG1:\=%"=="%ARG1%" SET ARGS=!ARGS:*%1="%~f1"!
ECHO ON
PowerShell.exe -command "& %ARGS:"='%"

PowerShell.exeのコマンドラインで空白区切りのエスケープは'です。
"は無視されるようです。なので、"を'に変換してます。

またPS1ファイル名はパス名の\を含む必要があります。
なので、\を含まないときはフルパスに変換してます。

2007年7月27日 (金)

PowerShellの.PS1ファイルの関連付け(その3)

究極の関連付けです。一行バッチを関連付けに組み込みます。
これでドロップもバッチリうまく行きます。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1]
"EditFlags"=dword:00020000

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\DefaultIcon]
@="%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe,0"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="CMD.EXE /S /K \"ECHO ^^^& \"%1\" %*|powershell -command -\""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

処理結果が確認できるようPowerShellウィンドウを開いたままにしてます。
閉じるなら、/Kを/Cに変えます。

しかし、標準入力が取れないので、その4へ。

2007年7月26日 (木)

PowerShellの.PS1ファイルの関連付け(その2)

こちらは、ドロップしたファイルが短いファイル名になりますが、
9個以上も可能。7個以下でも空の引数が付きません。

ただし、コマンドラインから"長いファイル名"を与えるとバラバラになります。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1]
"EditFlags"=dword:00020000

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\DefaultIcon]
@="%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe,0"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="\"C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe\" -noexit -command \"& '%1' %* \""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{86C86720-42A0-1069-A2E8-08002B30309D}"

短いファイル名になるのは、たぶん、EXE用のドロップハンドラが
ファイルの先頭を読んで、COMファイルと誤解するのでしょう。

2007年7月25日 (水)

PowerShellの.PS1ファイルの関連付け

PowerShellの.PS1ファイルの関連付けは、貧弱です。
標準では、実行もされず、ましてやファイルのドロップもできません。
そこで、起動とドロップの関連付けです。それがなかなか曲者です。

一応、ドロップにも対応してますが、最大8個までです。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1]
"EditFlags"=dword:00020000

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\DefaultIcon]
@="%SystemRoot%\\system32\\WindowsPowerShell\\v1.0\\powershell.exe,0"

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]
@="\"C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\powershell.exe\" -noexit -command \"& '%1' '%2' '%3' '%4' '%5' '%6' '%7' '%8' '%9' \""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx]

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler]
@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"

ウィンドウを開いたままにしてます。閉じるなら-noexitを外します。

空白区切りのエスケープは'です。"は無視されるようです。

引数が7個以下の場合、空の引数が渡るので注意!

ちゃんとやるのは、関連付けだけでは無理そう。
シンタクスを変換するバッチかスクリプトが必要です。

2007年7月24日 (火)

PowerShellで画面全体やアクティブウィンドウのスナップショットを取得する。

WScript.ShellやVBAのSendKeys()では、日本語やPrintScreenキーを送ることができません。

しかし、VBのSendKeys()や.NETのSystem.Windows.Forms.SendKeys.SendWait()では、可能です。

なので、PowerShellでも可能です。

アクティブウィンドウのスナップショットを取得します。

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[Windows.Forms.SendKeys]::SendWait("%{PRTSC}")

または、

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[Windows.Forms.SendKeys]::SendWait("{PRTSC}")

画面全体のスナップショットを取得します。

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[Windows.Forms.SendKeys]::SendWait("^{PRTSC}")

または、

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[Windows.Forms.SendKeys]::SendWait("+{PRTSC}")

これらを非アクティブな最小化ウィンドウか非表示で実行するとよいでしょう。

2007年7月23日 (月)

画面全体やアクティブウィンドウのスナップショットを取得する。

WScript.ShellのSendKeys()では、PrintScreenキーを送ることができません。

Excelには、DLL関数を呼び出すCALLマクロと、
マクロを呼び出すExecuteExcel4Macroメソッドがあります。
これを利用して、スクリプトからWin32APIのkeybd_event()を呼び出します。

画面全体のスナップショットを取得します。

PrintScreen.VBS

Set Excel=CreateObject("Excel.Application")
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",44,121,1,0)"
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",44,121,3,0)"

アクティブウィンドウのスナップショットを取得します。

AltPrintScreen.VBS

Set Excel=CreateObject("Excel.Application")
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",164,86,1,0)"
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",44,121,1,0)"
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",44,121,3,0)"
Excel.ExecuteExcel4Macro "CALL(""user32"",""keybd_event"",""JJJJJ"",164,86,3,0)"

2007年7月21日 (土)

CD/DVDとリムーバブルドライブの自動再生の有効/無効を切り替える。

ToggleAutoPlay.VBS

Set Excel=CreateObject("Excel.Application")
Set wShell=CreateObject("WScript.Shell")
Key="HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoDriveTypeAutoRun"
Value=wShell.RegRead(Key)
Select Case LCase(Value)
Case &H91 wShell.RegWrite Key,&HB5,"REG_DWORD"
Case &HB5 wShell.RegWrite Key,&H91,"REG_DWORD"
Case Else
  MsgBox "Unexpected value - &H" & Hex(Value),vbCritical,Key
  WScript.Quit
End Select

Excel.ExecuteExcel4Macro "CALL(""user32"",""SendMessageA"",""JJJJJ"",65535,26,0,0)"

Select Case LCase(Value)
Case &H91 wShell.PopUp "自動再生を「無効」 に変更しました。",2,WScript.ScriptName,vbCritical
Case &HB5 wShell.PopUp "自動再生を「有効」 に変更しました。",2,WScript.ScriptName,vbExclamation
End Select

2007年7月20日 (金)

スクリプトから設定変更をブロードキャストする。

通常、設定変更は、スクリプトからレジストリを書き換えても、
それだけだと、起動済みの実行中アプリには反映されません。
Win32APIで、WM_WININICHANGE/WM_SETTINGCHANGEメッセージを
HWND_BROADCASTで飛ばす必要があります。
しかし、これを、スクリプトから直接やるのは困難です。

でも、もし、Excelがあれば、

Set Excel=CreateObject("Excel.Application")
Excel.ExecuteExcel4Macro "CALL(""user32"",""SendMessageA"",""JJJJJ"",65535,26,0,0)"

2007年7月19日 (木)

DVD-VRモードのDVD-RAMやDVD-RWで「ビデオ ファイル」のautoplayを有効にする。

DVD-VideoモードのDVD-RWは、\VIDEO_TS\VIDEO_TS.IFOの存在で、
「DVD ムービー」と認識されますが、
DVD-VRモードのDVD-RAMやDVD-RWは、無粋にフォルダが開くだけ。

拡張子.ifoに、PerceivedType=videoを指定すると、再起動後、
「ビデオ ファイル」と認識されるようになります。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.ifo]
"PerceivedType"="video"

2007年7月18日 (水)

しつこいAdobe Readerを終了する。(その2)

Excelでなく、関連付けのDDE機能を利用します。

まず、Adobe Reader終了専用の拡張子.AcroExitを作ります。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.AcroExit]
"NeverShowExt"=""

[HKEY_CLASSES_ROOT\.AcroExit\DefaultIcon]
@="\"C:\\Program Files\\Adobe\\Reader 8.0\\Reader\\AcroRd32.exe\",0"

[HKEY_CLASSES_ROOT\.AcroExit\Shell]

[HKEY_CLASSES_ROOT\.AcroExit\Shell\Open]

[HKEY_CLASSES_ROOT\.AcroExit\Shell\Open\command]
@="\"C:\\Program Files\\Adobe\\Reader 8.0\\Reader\\AcroRd32.exe\" -Embedding"

[HKEY_CLASSES_ROOT\.AcroExit\Shell\Open\ddeexec]
@="[AppExit()]"

[HKEY_CLASSES_ROOT\.AcroExit\Shell\Open\ddeexec\application]
@="acroview"

[HKEY_CLASSES_ROOT\.AcroExit\Shell\Open\ddeexec\topic]
@="control"

ファイルパスはバージョンにより異なるので適宜変更してください。

Adobe Reader終了.AcroExitという名前のファイルを作成します。

このファイルを起動すると、Adobe Readerが終了します。

2007年7月17日 (火)

Excel 2007のヘルプのショートカット

Excelを起動しないで、ヘルプだけを見るには

Microsoft Office Excel ヘルプ

"C:\Program Files\Microsoft Office\Office12\CLVIEW.EXE" "EXCEL" "Microsoft Office Excel"

Microsoft Visual Basic ヘルプ

"C:\Program Files\Microsoft Office\Office12\CLVIEW.EXE" "EXCEL.DEV" "Microsoft Office Excel"

後者は、前者で、検索ボタン横のドロップダウンリストでオフライン開発者用ヘルプを選択しても同じです。

なぜか最初に空白ページが表示されます。:-(
最初にホームを表示するには?
なので、ホームのボタンを押してください。:-p

2007年7月15日 (日)

しつこいAdobe Readerを終了する。

表示されてるAdobe Readerは、xボタン、ALT+F4、ALT+FX、CTRL+Qなど。

非表示のAdobe Readerは、Adobe Readerを起動すれば、表示されるので、
それを終了します。

スクリプトでは、もし、表示されているなら、SendKeysで。
もし、AppActivateで、ファイルを開いているか、空っぽかの区別をするなら、
If wShell.AppActivate("Adobe Reade") Then 空っぽ。
If wShell.AppActivate("- Adobe Reader") Then 開いてる。
前者は前方一致、後者は後方一致を利用します。

非表示の場合は? 過激にWMIのTerminate()で強制終了?

もし、Excelが入ってれば、

Adobe Readerを終了する.VBS

Set Application=CreateObject("Excel.Application")
Application.DisplayAlerts=False
channelNumber=Application.DDEInitiate("Acroview","Control")
Application.DisplayAlerts=True
If TypeName(channelNumber)="Error" Then WScript.Quit
Application.DDEExecute channelNumber,"[AppExit()]"
Application.DDETerminate channelNumber

2007年7月14日 (土)

ディレクトリやイメージファイルにスライドショーを関連付ける。

[HKEY_CLASSES_ROOT\Directory\shell\SlideShow\Droptarget]
"Clsid"="{00E7B358-F65B-4dcf-83DF-CD026B94BFD4}"

[HKEY_CLASSES_ROOT\SystemFileAssociations\image\shell\Slideshow\Droptarget]
"Clsid"="{00E7B358-F65B-4dcf-83DF-CD026B94BFD4}"

2007年7月13日 (金)

ツールバーを利用して、デスクトップにメモを置く。

メモ用紙の代わりにツールバーを利用して、デスクトップにメモを置きます。

以下のメモファイルを作成します。

メモ.MHT

MIME-Version: 1.0
Content-Type: text/plain

メモの内容(テキスト)

「ツールバー」-「新規ツールバー」で「フォルダ」名に、
mhtml:ファイルのフルパス
を入れます。

ツールバーを好きな場所にドラッグ&ドロップします。

テキストでなく、HTMLの場合は、

メモ.MHT

MIME-Version: 1.0
Content-Type: text/html

<html><body><table border>
<tr><td>メモの内容(HTML)</td></tr>
</table></body></html>

イメージファイルの場合は、IEで開いて、Webアーカイブ形式に保存し直します。
あるいは、例えば、jpegファイルなら、

HOGE.TXT

MIME-Version: 1.0
Content-Type: image/jpeg
(改行)

を作って、

COPY /B HOGE.TXT + HOGE.JPG HOGE.MHT

でも、作れます。

2007年7月12日 (木)

WinDiff.exeをソースレビューで使うには、差分リストに加工する。

WinDiff.exeをソースレビューで使うには、差分リストに加工する。

一人で使う分には、WinDiff.exeのウィンドウ表示画面でよいけれど、
グループでソースレビューするときや、
他人にソースレビューを依頼するときには、
紙に出して、朱筆をいれたり、付箋紙を貼ったりして、
紙ベースでやりたいものです。

そういうときは、WinDiff.exeの出力を、
差分リストのHTMLに加工して、それを印刷して使うとよいでしょう。

WinDiff.VBS
WinDiff出力から左右2列並べ変更箇所枠囲み差分リストのHTMLを作るVBScript
http://www.vector.co.jp/soft/winnt/prog/se368994.html

差分リストはこんな感じ

C:\left.txt C:\right.txt
1 共通1 1 共通1
2 左のみ
3 共通2 2 共通2
4 相違左 3 相違右
5 共通3 4 共通3
5 右のみ
6 共通4 6 共通4

2007年7月11日 (水)

WinDiff.exeをコマンドラインで使おう。

WinDiff.exeはコマンドラインで使えない、と思ってませんか?

詳しくは、WinDiff -?を見て貰うとして、使えますよ。

ただし、Windowsアプリなので、コンソール出力ができないみたいですが、
それは、テンポラリファイルを介せば済む話です。

具体的には、

WinDiff.exe 左ファイル 右ファイル -filrx 出力ファイル

面倒ならバッチファイルを作ればよいのです。

WinDiff.CMD 左ファイル 右ファイル

WinDiff.exe %1 %2 -filrx $$$
MORE $$$
DEL $$$

2007年7月10日 (火)

IEの「ファイル」-「オフライン作業」メニュー項目を出す。

IEの「ファイル」メニューに「オフライン作業」項目があるかどうかは、
起動時に指定するURLプロトコルに依存します。

http://などのインターネットなページでは、「オフライン作業」が出ます。

file://などのローカルなページでは、「オフライン作業」が出ません。

ホームページをローカルなファイルにして、
なおかつ、「オフライン作業」を出すには、
起動用のIEのショートカットで、
"C:\Program Files\Internet Explorer\iexplore.exe" about:home
と指定します。

about:homeのインターネットショートカットでも同じです。

また、空白ページを表示しても、同様です。

"C:\Program Files\Internet Explorer\iexplore.exe" about:blank

ページを表示しなくても、「オフライン作業」が出ます。

"C:\Program Files\Internet Explorer\iexplore.exe" -nohome

ところで、about:~はIEの履歴に残らないようです。

2007年7月 9日 (月)

NOPアプリは?

メインフレームには、KDJBR14やIEFBR14というNOPプログラムがあったけど。。。

コンソールアプリなら、CMD.EXE /C EXIT で代替。

Windowアプリは? WScript.exe //B

なら、コンソールアプリも、CScript.exe //B

コマンドライン「~~~」を残したまま、無効(NOP)にするなら、

CMD.EXE /C REM ~~~
WScript.exe //B // - ~~~
CScript.exe //B // - ~~~

2007年7月 8日 (日)

WSHスクリプトからHTAを操作する。

WSHなどのスクリプトからIEを起こして、操作することが出来ますが、
HTAの場合は、そういうことが出来ません。そこをなんとかして、
HTAのWindowオブジェクトをWSHなどのスクリプトから操作します。
WSHからIEを駆動するときは、セキュリティゾーンの束縛を受けますが、
HTAなら自由にオブジェクトを組み込めます。

HTAオブジェクト作成関数

Function CreateHtaObject()
Dim wShell
Dim Shell
Dim ie
Dim window

Set wShell=CreateObject("WScript.Shell")
wShell.Run "MSHTA.EXE ""javascript:void(new ActiveXObject('InternetExplorer.Application').PutProperty('"&WScript.ScriptName&"',window));"""
Set Shell=CreateObject("Shell.Application")
Do
  For Each ie In Shell.Windows()
    If Not IsEmpty(ie.GetProperty(WScript.ScriptName)) Then
      Set window=ie.GetProperty(WScript.ScriptName)
      If TypeName(window)="HTMLWindow2" Then
        Set CreateHtaObject=window
        ie.Quit
        Exit Do
      Else
        MsgBox TypeName(window)
      End If
    End If
  Next
  WScript.Sleep 100
Loop
End Function

その使用例

Option Explicit
Dim hta

Set hta=CreateHtaObject()

hta.document.title=WScript.ScriptName
hta.alert hta.location
Do While TypeName(hta)="HTMLWindow2"
  WScript.Sleep 100
Loop
MsgBox "HTA Ended."
WScript.Quit

2007年7月 7日 (土)

CDやDVDドライブを開く、閉じる。(その2)

Shell.Applicationを使います。

For Each FolderItem In CreateObject("Shell.Application").NameSpace(17).Items()
  If FolderItem.ExtendedProperty("Type")="CD ドライブ" Then FolderItem.InvokeVerb "取り出し(&J)"
Next

メディアの排出だけに限定するなら、

For Each FolderItem In CreateObject("Shell.Application").NameSpace(17).Items()
  If FolderItem.ExtendedProperty("Type")="CD ドライブ" Then If FolderItem.ExtendedProperty("FileSystem")<>"" Then FolderItem.InvokeVerb "取り出し(&J)"
Next

2007年7月 6日 (金)

CDやDVDドライブを開く、閉じる。

Set WMP=CreateObject("WMPlayer.OCX")
For k=1 To WMP.cdromCollection.count
  WMP.cdromCollection.Item(k-1).eject
Next

もし、そのハードがソフトで閉じる機能を持っていれば、
eject()が「開く」、「閉じる」のトグルになります。

もし、WSHが終了しない場合、WMPの修正が出ているようなので、
Windows Updateで直ります。

2007年7月 5日 (木)

VBAからAdobe ReaderでPDFファイルを印刷する。(その2)

Adobe Reader 6.0 ~ 8.1

Sub PdfPrint(File)
Dim fso
Dim wShell
Dim Path
Dim oExec
Set fso = CreateObject("Scripting.FileSystemObject")
Set wShell = CreateObject("WScript.Shell")
Path = wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path = Replace(Path, """", "")
Path = wShell.ExpandEnvironmentStrings(Path)
File = fso.GetFile(File).Path
Set oExec = wShell.Exec("""" & Path & """ /n /p /h """ & File & """")
Do While oExec.Status = 0
  If wShell.AppActivate(oExec.ProcessID) Then wShell.SendKeys "^q"
  Application.Wait Now + TimeSerial(0, 0, 1)
Loop
End Sub

2007年7月 4日 (水)

コマンドラインでPDFファイルを印刷する。(その3)

/tでなく、/pを使うスクリプト。

Adobe Reader 6.0 ~ 8.1 用

PDF印刷.VBS PDFファイル...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path=Replace(Path,"""","")
Path=wShell.ExpandEnvironmentStrings(Path)
For Each File In WScript.Arguments
  File=fso.GetFile(File).Path
  Set oExec=wShell.Exec(""""&Path&""" /n /p /h """&File&"""")
  Do While oExec.Status=0
    If wShell.AppActivate(oExec.ProcessID) Then wShell.SendKeys "^q"
    WScript.Sleep 1000
  Loop
Next

アプリを終了させるために、SendKeysを使用します。

2007年7月 3日 (火)

コマンドラインでPDFファイルを印刷する。(その2)

/cjsオプションが7.0で追加されたものの、8.1で廃止されたので、スクリプト。

Adobe Reader 6.0 ~ 8.1 用

PDF印刷.VBS PDFファイル...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path=Replace(Path,"""","")
Path=wShell.ExpandEnvironmentStrings(Path)
Printer=Split(wShell.RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"),",")(0)
Set pExec=wShell.Exec(""""&Path&""" /n /h""")
Do While Not wShell.AppActivate(pExec.ProcessID)
  WScript.Sleep 100
Loop
For Each File In WScript.Arguments
  File=fso.GetFile(File).Path
  Set oExec=wShell.Exec(""""&Path&""" /n /t """&File&""" """&Printer&"""")
  Do While oExec.Status=0
    WScript.Sleep 100
  Loop
Next
If pExec.Status=0 Then pExec.Terminate

Adobe Reader 7.0 ~ 8.1 用

PDF印刷.VBS PDFファイル...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path=Replace(Path,"""","")
Path=wShell.ExpandEnvironmentStrings(Path)
Set pExec=wShell.Exec(""""&Path&""" /n /h""")
Do While Not wShell.AppActivate(pExec.ProcessID)
  WScript.Sleep 100
Loop
For Each File In WScript.Arguments
  File=fso.GetFile(File).Path
  Set oExec=wShell.Exec(""""&Path&""" /n /t """&File&"""")
  Do While oExec.Status=0
    WScript.Sleep 100
  Loop
Next
If pExec.Status=0 Then pExec.Terminate

/tオプションは、他にAdobe Readerがないと、終了せずに残ります。
そこで、最初にダミーのAdobe Readerを起動し、最後に終了します。
GetObjectよりは速いでしょう。

2007年7月 2日 (月)

コマンドラインでPDFファイルを印刷する。

/cjsオプションが7.0で追加されたものの、8.1で廃止されたので、スクリプト。

Adobe Reader 6.0 - 8.1 用

PDF印刷.VBS PDFファイル...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path=Replace(Path,"""","")
Path=wShell.ExpandEnvironmentStrings(Path)
Printer=Split(wShell.RegRead("HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device"),",")(0)
Set PDF=CreateObject("AcroExch.Document")
For Each File In WScript.Arguments
  File=fso.GetFile(File).Path
'  Set PDF=GetObject(File)
  wShell.Run """"&Path&""" /n /t """&File&""" """&Printer&"""",,True
Next

Adobe Reader 7.0 - 8.1 用

PDF印刷.VBS PDFファイル...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Path=wShell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\acrord32.exe\")
Path=Replace(Path,"""","")
Path=wShell.ExpandEnvironmentStrings(Path)
Set PDF=CreateObject("AcroExch.Document")
For Each File In WScript.Arguments
  File=fso.GetFile(File).Path
'  Set PDF=GetObject(File)
  wShell.Run """"&Path&""" /n /t """&File&"""",,True
Next

/tオプションは、他にAdobe Readerがないと、終了せずに残ります。
CreateObject("AcroExch.Document")や、GetObject(File)で、
Adobe Readerが起動し、参照の解放で終了することを利用します。
もし、CreateObjectが使えないときは、GetObjectに変えてください。
GetObjectだと、ちょっと遅いかも。

2007年7月 1日 (日)

Adobe Reader 8.1の起動オプション(その2)

Adobe Readerには、起動オプションがありますが、その説明がありません。:-(

以下のファイルをメモ帳で開いて検索すると、
AcroRd32.dll
以下のような文字列が見つかります。これが起動オプションです。
\select SOFTWARE\Adobe\Acrobat Reader\8.0\Language  Acrobat Viewer  / u     / a     / w     / e o   / n     / s     / o     / l     / h     / t     / p     / b    


Adobe Reader 8.1のコマンドライン

START ACRORD32.EXE オプション ファイル...

オプション
/n New Instance 新規プロセス
/s Suppress Splash Window 起動ウィンドウ抑止
/o ? 不明
/h Hide Window 最小化ウィンドウ(印刷設定画面非表示)
/t PrintTo 指定プリンタへ印刷 (6.0:プリンタ必須;7.0:プリンタ省略可)
/p Print デフォルトプリンタへ印刷
7.0で追加
/l Cool 非表示
/u Url Protocol 不明 acrobat:で使われる?
/a引数 Arguments オープンパラメタ(page=nなど)
/eo ? 不明 CreateObjectで/o /eo /lが使われる。
8.1で追加
/b Browser ? IE表示で/o /eo /l /b /w hwmdが使われる。
/w hwnd Window handle IEのhwndを10進数で指定

使用例、コマンドラインでPDFファイルを印刷する。
START ACRORD32.EXE /p ファイル...       印刷設定画面表示
START ACRORD32.EXE /p /h ファイル...   印刷設定画面非表示
START ACRORD32.EXE /n /t "ファイル"  印刷設定画面非表示 (7.0~)
START ACRORD32.EXE /n /t "ファイル" "プリンタ名" 印刷設定画面非表示
いずれの場合も印刷後、アプリが残るので、別途終了(CTRL+Q)が必要です。

/n /tは、印刷後にほかになければ開いたまま残ります。
8.0以前では、/nがなくても、新規に起こして、印刷後にほかにあれば消えました。
8.1では、/tオプションのデフォルト動作が/nから変更されたようです。

/pの複数ファイル指定が、8.1では可能です。以前は駄目だったような。

« 2007年6月 | トップページ | 2007年8月 »