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        
無料ブログはココログ

« 2010年3月 | トップページ | 2010年5月 »

2010年4月30日 (金)

ファイル名を小文字にリネームする。

dir /L でファイル名が小文字で表示されるので、これを利用します。

LRename ファイル...

@echo off
for %%1 in (%*) do for /f "delims=" %%2 in ('dir /b /l %%1') do ren %%1 "%%2"

2010年4月29日 (木)

バッチファイルで大文字、小文字に変換する。

SETコマンドで置換します。

小文字に変換する。

LCase.cmd 文字列

@echo off
set env=%*
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do call set env=%%env:%%i=%%i%%
echo %env%

大文字に変換する。

UCase.cmd 文字列

@echo off
set env=%*
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do call set env=%%env:%%i=%%i%%
echo %env%

2010年4月28日 (水)

ごみ箱のドライブ別の総ファイルサイズを表示する。

ごみ箱(ドライブ別)サイズ.vbs

Set dic=CreateObject("Scripting.Dictionary")
Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.Namespace(10)
For Each FolderItem In Folder.Items()
  drive=fso.GetDriveName(FolderItem.Path)
  If Not dic.Exists(drive) Then dic.Add drive,Array(0,0)
  Size=FolderItem.Size
  If Size=0 Then
     If fso.FolderExists(FolderItem.Path) Then
        Size=fso.GetFolder(FolderItem.Path).Size
     End If
  End If
  Item=dic.Item(drive)
  Item(0)=Item(0)+1
  Item(1)=Item(1)+Size
  dic.Item(drive)=Item
Next
For Each drive In dic
  Item=dic.Item(drive)
  dic.Item(drive)=drive & " " & Item(0) & " 個の項目 "& FormatNumber(Item(1),0,,,True) & " バイト"
Next
MsgBox Join(dic.Items(),vbCrLf),,"ごみ箱(ドライブ別)"

2010年4月27日 (火)

ごみ箱の総ファイルサイズを表示する。

あれ、普通には出てこないようですね。一応、ごみ箱フォルダで「すべて選択」すれば出てきますが。。。

ごみ箱サイズ.vbs

Set fso=CreateObject("Scripting.FileSystemObject")
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.Namespace(10)
For Each FolderItem In Folder.Items()
  If FolderItem.Size Then
    Size=Size+FolderItem.Size
  Else
     If fso.FolderExists(FolderItem.Path) Then
        Size=Size+fso.GetFolder(FolderItem.Path).Size
     End If
  End If
Next
MsgBox Folder.Items().Count & " 個の項目 "& FormatNumber(Size,0,,,True) & " バイト",,"ごみ箱"

2010年4月26日 (月)

スクリプトでクリップボードにテキストを設定する。

スクリプトからクリップボードを使うときは、IEを利用するのが普通ですが、clipboardDataを使う方法はインターネットゾーン(about:blank)のセキュリティレベルに依存します。
ExecWBを使う方法は、インターネットゾーンのセキュリティレベルに依存しませんが、innerTextにテキストを代入すると、

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
  WScript.Sleep 100
Loop
ie.Document.body.innerText="a b"
ie.ExecWB 17,0
ie.ExecWB 12,0
ie.Quit

この方法はタブが空白に変換されます。そこで、textareaを使って、

Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
  WScript.Sleep 100
Loop
ie.Document.body.innerHTML="<textarea id=txt></textarea>"
ie.Document.all.txt.value="a b"
ie.ExecWB 17,0
ie.ExecWB 12,0
ie.Quit

とすれば、タブが保存されます。

2010年4月25日 (日)

スクリプトでクリップボードからテキストを取り出す。

スクリプトからクリップボードを使うときは、IEを利用するのが普通ですが、クリップボードからテキストを取り出すだけなら、

MsgBox GetObject("\","htmlfile").parentWindow.clipboardData.getData("text")

IEを使うより、軽くて簡単です。:-)

ただ、クリップボードにテキストを設定するのには使えません。:-(

ここで、もしCreateObject("htmlfile")を使うと、インターネットゾーンのセキュリティレベルに依存します。
GetObject("\","htmlfile")ならコンピュータゾーンのセキュリティレベルになります。

2010年4月23日 (金)

エクスプローラの「お気に入りリンク」からアプリを起動すると、2回、重複して起動される。(障害)

「お気に入りリンク」に「メモ帳」のショートカットを入れて、エクスプローラの「お気に入りリンク」から起動すると、「メモ帳」が二つ開きます。

なので、エクスプローラの「お気に入りリンク」は昔のエクスプローラの「リンクバー」代わりには使えません。

しかし、スクリプトで重複起動を抑止すれば、昔のエクスプローラの「リンクバー」代わりに使えるようになります。

先頭の4行を追加します。

GetCurrentShell.vbs

On Error Resume Next
Set Lock=CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.ScriptFullName & ":Zone.Identifier",8,True)
If Err Then WScript.Quit
On Error GoTo 0
Set wShell=CreateObject("WScript.Shell")
wShell.SendKeys "^{tab}"
For Each ie In CreateObject("Shell.Application").Windows()
  If InStr(LCase(ie.FullName),"explorer.exe") Then
    wShell.SendKeys "^{tab}"
    If ie.StatusText="" Then Exit For
  End If
Next
If IsEmpty(ie) Then
  MsgBox "Not Found"
Else
  MsgBox ie.LocationURL
End If

「お気に入りリンク」に入れて、エクスプローラの「お気に入りリンク」から起動します。

2010年4月22日 (木)

Vista以降で、アクティブなシェルを捕捉する。(その2)

GetCurrentShell.vbs

Set wShell=CreateObject("WScript.Shell")
wShell.SendKeys "^{tab}"
For Each ie In CreateObject("Shell.Application").Windows()
  If InStr(LCase(ie.FullName),"explorer.exe") Then
    wShell.SendKeys "^{tab}"
    If ie.StatusText="" Then Exit For
  End If
Next
If IsEmpty(ie) Then
  MsgBox "Not Found"
Else
  MsgBox ie.LocationURL
End If

SendKeys "^{tab}^{tab}"でフォルダペインにフォーカスを移動します。
このとき、StatusTextは、""です。通常は、"~個の項目"、"~個の項目を選択"、"1 個選択"、などです。これを判定します。

「お気に入りリンク」に入れて、エクスプローラの「お気に入りリンク」から起動します。ただ、問題が。。。

2010年4月21日 (水)

IE7/IE8で、現在または最後にアクティブなIEを捕捉する。(その2)

WSHから現在または最後にアクティブなIEを捕捉します。

GetCurrentIE.vbs

Set wShell=CreateObject("WScript.Shell")
If wShell.AppActivate(" - Windows Internet Explorer") Then
  wShell.SendKeys "^{f6}"
  For Each ie In CreateObject("Shell.Application").Windows()
    If ie.ReadyState=4 Then If TypeName(ie.Document)="HTMLDocument" Then If ie.Document.hasFocus() Then Exit For
  Next
End If
If IsEmpty(ie) Then
  MsgBox "Not Found"
Else
  MsgBox ie.LocationURL
End If

AppActivate(" - Windows Internet Explorer")で、現在または最後にアクティブなIEをアクティブにし、SendKeys "^{f6}"で、HTMLDocumentのペインにフォーカスを移動します。これを判定します。

2010年4月20日 (火)

Vista IEで、「Web ページ、HTML のみ (*.htm;*.html)」で「名前を付けて保存」する。

IEで「Web ページ、HTML のみ (*.htm;*.html)」で保存しようとしても、デフォルトが、IE7/IE8は「Web アーカイブ、単一のファイル (*.mht)」、IE6は「Web ページ、完全 (*.htm;*.html)」なので、これをいちいち変更しなければなりません。面倒臭。
IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更しましたが、Vistaで「保護モード:有効」のページからのコンテキストメニュー拡張でActiveXObjectが使えなくなったため、再度、WSH起動に変更します。

IEの「お気に入りセンタ」か「お気に入りバー」から起動します。

Web ページ、HTML のみ.vbs

Set ies=CreateObject("Shell.Application").Windows()
For Each ie In ies
  If ie.ReadyState=4 Then If TypeName(ie.Document)="HTMLDocument" Then If ie.Document.hasFocus() Then Exit For
Next
If IsEmpty(ie) Then
  For Each ie In ies
    If ie.ReadyState<>4 Then
    ElseIf TypeName(ie.Document)="HTMLDocument" Then
      ie.Document.focus
      If ie.Document.hasFocus() Then Exit For
    End If
  Next
End If
If IsEmpty(ie) Then
  MsgBox "Not Found"
  WScript.Quit
End If
Set fso=CreateObject("Scripting.FileSystemObject")
title=ie.Document.title
If title="" Then
  title=fso.GetFileName(ie.Document.location.pathname)
End If
Select Case fso.GetExtensionName(title)
Case "htm","html"
Case Else
  title=title & ".htm"
End Select
title=Replace(title,"/","-")
title=Replace(title,":","")
title=Replace(title,"\","")
title=Replace(title,"*","")
title=Replace(title,"?","")
title=Replace(title,"<","")
title=Replace(title,">","")
title=Replace(title,"|","")
title=Replace(title,"""","")
title=Replace(fso.GetBaseName(title),".","_") & "." & fso.GetExtensionName(title)
ie.Document.execCommand "saveas",True,title

※ スクリプトファイル(またはそのショートカット)は他で作って、「お気に入り」か「お気に入りバー」に「移動」で入れること。

※ ウィンドウのフォアグラウンドロックを利用しているので、フォアグラウンドロックを無効(タイムアウト値を0)にしていると使えません。

2010年4月19日 (月)

Vista IEで、「Web ページ、完全 (*.htm;*.html)」で「名前を付けて保存」する。

IE7以降で「Web ページ、完全 (*.htm;*.html)」で保存しようとしても、デフォルトが「Web アーカイブ、単一のファイル (*.mht)」なので、これをいちいち変更しなければなりません。面倒臭。
IE7でShell.Windows().Item()が使えなくなったので、コンテキストメニュー拡張に変更しましたが、Vistaで「保護モード:有効」のページからのコンテキストメニュー拡張でActiveXObjectが使えなくなったため、再度、WSH起動に変更します。

IEの「お気に入りセンタ」か「お気に入りバー」から起動します。

Web ページ、完全.vbs

Set ies=CreateObject("Shell.Application").Windows()
For Each ie In ies
  If ie.ReadyState=4 Then If TypeName(ie.Document)="HTMLDocument" Then If ie.Document.hasFocus() Then Exit For
Next
If IsEmpty(ie) Then
  For Each ie In ies
    If ie.ReadyState<>4 Then
    ElseIf TypeName(ie.Document)="HTMLDocument" Then
      ie.Document.focus
      If ie.Document.hasFocus() Then Exit For
    End If
  Next
End If
If IsEmpty(ie) Then
  MsgBox "Not Found"
  WScript.Quit
End If
Set fso=CreateObject("Scripting.FileSystemObject")
title=ie.Document.title
If title="" Then
  title=fso.GetFileName(ie.Document.location.pathname)
End If
Select Case fso.GetExtensionName(title)
Case "htm","html"
Case Else
  title2=ie.Document.title
  ie.Document.title=title & ".htm"
End Select
ie.ExecWB 4,1
If Not IsEmpty(title2) Then ie.Document.title=title2

※ スクリプトファイル(またはそのショートカット)は他で作って、「お気に入り」か「お気に入りバー」に「移動」で入れること。

※ ウィンドウのフォアグラウンドロックを利用しているので、フォアグラウンドロックを無効(タイムアウト値を0)にしていると使えません。

2010年4月17日 (土)

Vista IEの「保護モード:有効」のページでは、MenuExtからActiveXObjectが使えない?

IE7で、CreateObject("Shell.Application").Windows().Item()でアクティブなIEが捕捉できなくなって、代わりに、MenuExtで、ShellWindowsの中からアクティブなIEを探すように変えたのに、Vista IEの「保護モード:有効」のページでは、MenuExtからShellWindowsが使えなくなりました。
「保護モード:無効」のページでは使えますが。。。

今度はどうすりゃいいんだ?ということで、また、WSHでCreateObject("Shell.Application").Windows()の中から、アクティブなIEを探すように変えます。
なんか、スクリプトの行く先々で妨害工作を受けているような。。。

2010年4月16日 (金)

IEの「名前を付けて保存」のデフォルトはタイトル末尾で変わる。

タイトル末尾が
.
.h
.ht
.htm
.html
だと完全。
.m
.mh
.mht
だとアーカイブ。
.t
.tx
.txt
だとテキスト。
上記に該当しなければデフォルト、アーカイブ。

タイトルがないときはURLのpathname。

2010年4月15日 (木)

dirコマンドですべての属性を表示するには?

例えば、
dir /ah で隠し属性があるもの
dir /a-h で隠し属性がないもの
隠し属性があるもの、ないもの両方出すには?
dir /a
dirのデフォルトは/a-h-sだから無条件を明示しないと。

2010年4月14日 (水)

Vistaで、IEのキャッシュフォルダ(Temporary Internet Files)の「整合性レベル:中」の実フォルダの場所が変わった?

この前まで、

「整合性レベル:中」は、
shell:cache\Content.IE5
"C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5"

「整合性レベル:低」は、
shell:cache\Low\Content.IE5
"C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5"

と思っていたら、この前から、

「整合性レベル:中」は、
"%temp%\Temporary Internet Files\Content.IE5"
"C:\Users\%username%\AppData\Local\Temp\Temporary Internet Files\Content.IE5"

に変わったみたい。IE7とIE8の違い?

2010年4月13日 (火)

Vistaで、IEのキャッシュフォルダ(Temporary Internet Files)で「保護モード:有効」のコンテンツを見る。

explorer.exeを「整合性レベル:低」で起動すれば、ちゃんと見えます。

バッチファイルで、

LowCache.cmd

@echo off
copy %comspec% "%temp%\Low\lowcmd.exe"
"%temp%\Low\lowcmd.exe" /c start explorer.exe /separate,shell:cache
del "%temp%\Low\lowcmd.exe"

ショートカットでは、

LowCache.lnk
リンク先:
cmd.exe /c copy %comspec% "%temp%\Low\lowcmd.exe" & "%temp%\Low\lowcmd.exe" /c start explorer.exe /separate,shell:cache & del "%temp%\Low\lowcmd.exe"

2010年4月12日 (月)

Run Applications at a Low Integrity Level (その4)

COPYを使って、バッチファイルだけで、コマンドプロンプトを「整合性レベル:低」で実行します。

LowCMD.cmd

@echo off
copy %comspec% "%temp%\Low\lowcmd.exe"
"%temp%\Low\lowcmd.exe" /c cmd
del "%temp%\Low\lowcmd.exe"

ショートカットでも、

LowCMD.lnk
リンク先:
cmd.exe /c copy %comspec% "%temp%\Low\lowcmd.exe" & "%temp%\Low\lowcmd.exe" /c cmd & del "%temp%\Low\lowcmd.exe"

このとき、警告ダイアログは出ません。

2010年4月11日 (日)

Run Applications at a Low Integrity Level (その3)

IEを利用してバッチファイルで、コマンドを「整合性レベル:低」で実行します。

StartLow.cmd [コマンド]

@echo off
set cmdline=%*
(if defined cmdline (echo;%*) else echo cmd) >"%temp%\Low\low.cmd"
start iexplore "%temp%\Low\low.cmd"

コマンドを省略すると、コマンドプロンプト。

このとき、「ファイルのダウンロード - セキュリティの警告」ダイアログが出ます。

2010年4月10日 (土)

icaclsの出力を整形する。

icaclsの出力は変。改行文字がLFのみ。

ファイル名 属性1
    属性2
    ...
みたいに、1行目はファイル名と属性1が空白1つで続いているので、見分け難い。

属性2以降のインデントはファイル名の長さによって変化してばらばら。

これを、バッチファイルでwrapして、
ファイル名
 属性1
 属性2
 ...
のように整形します。

icaclst.cmd ファイルやフォルダ...(ワイルドカード使用可)

@echo off
setlocal enabledelayedexpansion
for %%1 in (%*) do (
echo %%~nx1
for /f "delims=" %%i in ('icacls.exe "%%~1"') do (
set x=%%i
set x=!x:%%~nx1=!
if "!x:~0,1!"==" " for /f "tokens=*" %%j in ("!x!") do echo; %%j
)
echo;
)

2010年4月 9日 (金)

整合性レベルを表示する。(その2)

コンソールでicaclsを使う場合も表示が煩瑣なので、バッチファイルでwrapして整合性レベルだけを表示します。

IL.cmd ファイルやフォルダ...(ワイルドカード使用可)

@echo off
for %%1 in (%*) do (
set x=
for /f "delims=" %%i in ('icacls.exe "%%~1"') do (
for /f "tokens=1,3 delims=\: " %%j in ("%%i") do (
if "%%j"=="Mandatory" (
set x=%%k       
call echo;%%x:~0,6%% %%~nx1
)
)
)
if not defined x echo;       %%~nx1
)

2010年4月 8日 (木)

整合性レベルを表示する。

いちいちコンソールでicacls使うのも面倒なので、VBScriptでwrapします。

IL.vbs ファイルやフォルダ...

set wshell=createobject("wscript.shell")
for each path in wscript.arguments
  MsgBox path,,Array("IL Medium","IL Low","IL High")(wshell.run("cmd.exe /c for /f ""delims="" %i in ('icacls.exe """ & path & """') do for /f ""tokens=1,3 delims=\: "" %j in (""%i"") do if ""%j""==""Mandatory"" if %k==Low (exit 1) else if %k==High exit 2",0,true))
next

ファイルをやフォルダをドロップするか、SendToフォルダに置いて送ります。

2010年4月 7日 (水)

IEの「保護モード:有効」のキャッシュフォルダだけを見る。

explorer.exeを普通に起動すると、IEの「保護モード:無効」のキャッシュフォルダだけが見えます。

explorer.exeを「整合性レベル:低」で起動すると、IEの「保護モード:有効」のキャッシュフォルダだけが見れますが、それにはいろいろと準備が必要です。

IE8でインターネットゾーンを開いて、「ファイル」「開く」「参照」で「shell:cache」を見ると、IEの「保護モード:有効」のキャッシュフォルダだけが準備なしで見れます。※ IE9では使えない。

あるいは、以下のhtmファイルを開き、「参照」ボタンを押して、「shell:cache」を開きます。
low.htm
<!-- saved from url=(0014)about:internet -->
<input type=file>

もし、スクリプト有効 かつ 保護モード有効のセキュリティゾーンがあれば、そのサイトを開いて、アドレスバーに
javascript:"<input type=file>"
と入れても同じです。

ここで関連付けの操作を行うと「Internet Explorer セキュリティ」ダイアログが出ます。

2010年4月 6日 (火)

IEからMicrosoft Office Document image Writerに印刷出力したTIFファイルが見つからない。

再度印刷すると、同じ場所に存在するのに、エクスプローラなどで見ると見つからない。

結局、原因は、インターネットゾーンの「保護モード:有効」のWebページだったので、TIFファイルがVirtualizedフォルダに作成されてました。

デスクトップなら、
C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Virtualized\C\Users\%username%\Desktop

Virtualizedフォルダへのショートカットを作っておくと便利かもです。
リンク先:
"C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Virtualized\C\Users\%username%\Desktop"

Virtualizedフォルダを統合して見るには、IEでインターネットゾーンを開いて、「ファイル」「開く」「参照」で見るとよいでしょう。
ファイル名に*を入れるか、種類ですべてのファイルを選択します。

あるいは、以下のhtmファイルを開き、「参照」ボタンを押します。
low.htm
<!-- saved from url=(0014)about:internet -->
<input type=file>

Virtualizedフォルダのパスは以下のように短縮できます。

shell:cache\Virtualized\「元のパスからドライブの:を抜く」

参照先 「保護モードの Internet Explorer の理解と機能」
http://msdn.microsoft.com/ja-jp/library/bb250462(v=vs.85).aspx

2010年4月 5日 (月)

IEから印刷出力したXPSファイルがXPS Viewerで表示できない。

IEからMicrosoft XPS Document Writerに印刷出力したXPSファイルがXPS Viewerで表示できない。

i 使用していたアプリケーションでエラーが発生しました
  次の操作を試してください。
  アプリケーションを再起動してください。
  下の [詳細情報] リンクをクリックして、このエラーの詳細を表示します。

原因が分からず、Microsoft XPS Essentials Packをダウンロードしてインストールしました。
XPS Viewer EPからは表示できます。

結局、原因は、「保護モード:有効」のWebページだったので、XPSファイルが「整合性レベル:低」になったからのようです。これを開くとインターネットゾーンになります。ここでインターネットゾーンのセキュリティレベルが高だとエラーになります。
なので、icaclsでXPSファイルの整合性レベルを変えてもいいですが、面倒なのでコピーして、元ファイルを削除するとよいでしょう。

※ 普通はインターネットゾーンのセキュリティレベルがデフォルトの中高なので問題にならないのでしょう。

2010年4月 4日 (日)

Webページが「完全」や「アーカイブ」で保存できないとき

Web ページの保存
! この Web ページは、正しく保存されない可能性があります。保存する場合、ファイルに目的の情報が含まれていることを確認してください。
  ページを保存しますか?

Webページによりけりと思いますが、以下の方法で保存できることがあります。

そのまま「HTMLのみ」で保存して、それを開き、もし同じように表示されたら、それを「完全」や「アーカイブ」で保存する。


もし、「HTMLのみ」のように表示されたら、<base href="そのURL">を<head></head>の中に追加してみます。
それを開いて、もし同じように表示されたら、それを「完全」や「アーカイブ」で保存します。

2010年4月 1日 (木)

NSCを使ってデスクトップ左端にツールバーを作る。

ToolBar.hta

<html>
<head>
<hta:application showintaskbar=no caption=no scroll=no contextmenu=no innerborder=no />
<script language="VBScript">
moveto 0,0
resizeto 34,54
sub toolbar(title,path)
set w=showmodelessdialog("about:<" & "object id=NSC classid=clsid:55136805-B2DE-11D1-B9F2-00A0C98BC547 width=""100%"" height=""100%""><" & "/object><" & "script language=vbscript>sub NSC_doubleclick:NSC.SelectedItem.InvokeVerb Empty:end sub<" & "/script>",,"dialogtop:0;dialogleft:0;dialogwidth:250px;dialogheight:" & (screen.availheight-35) & "px;resizable:yes;")
w.NSC.SetRoot path
w.document.title=title
end sub
</script>
</head>
<body style="margin:0;">
<button title="終了" onclick="close" style="background-color:lightgrey;">×</button>
<button title="Quick Launch" onclick='toolbar Me.title,"shell:quick launch"' style="background-color:lightgrey;">&gt;&gt;</button>
</body>
</html>

ダブルクリックで関連付けのデフォルト動詞で起動します。
フォルダとタイトルを適宜変更します。
ボタンを追加するときは、resizeToも合わせて変更して。

« 2010年3月 | トップページ | 2010年5月 »