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

2010年2月28日 (日)

キーを指定してレジストリエディタを開く。

バッチファイルで、引数に指定します。

regopen.cmd [キー]

if "%~1"=="" (
reg.exe query "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey"
) else (
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit" /v "LastKey" /t REG_SZ /d %1
regedt32.exe
)

スクリプトで、InputBoxにキーを入れます。

regopen.vbs

Set wShell=CreateObject("WScript.Shell")
s=wShell.RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey")
s=InputBox("例えば、HKEY_CLASSES_ROOT\VBSFile","開くキーを入力してください",s)
If s="" Then WScript.Quit
wShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey",s,"REG_SZ"
wShell.Run "regedt32.exe"

2010年2月27日 (土)

レジストリエディタでキーを指定して移動する。

準備は、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Favorites
を開いて、お気に入りに「Favorites」を追加し、もう1回追加して名前を例えば「Go」に変えます。

キーを指定して移動するには、
お気に入りから「Favorites」へ行き、「Go」にキーを設定します。
お気に入りから「Go」に行きます。

2010年2月26日 (金)

IEの「このページの検索...」は検索語を入力途中に検索するのが鬱陶しい。

それは、CTRL+Fのテキストボックスに直接入れるからです。

検索バー(CTRL+E)のテキストボックスに入れて、そこから「このページの検索...」すれば大丈夫です。

2010年2月25日 (木)

お気に入りのショートカットをページ末尾に位置付けるように書き換える。

既定のアンカがあればよいのですが、ないので、ページ末尾付近のアンカをURLに追加します。

例えば、某掲示板の場合、URLに[/l50]#subimtを追加します。

#submit.vbs

set wshell=createobject("wscript.shell")
for each file in wscript.arguments
  set url=wshell.createshortcut(file)
  if right(url.targetpath,7)<>"#submit" then
    if right(url.targetpath,4)<>"/l50" then
      url.targetpath=url.targetpath & "/l50"
    end if
    url.targetpath=url.targetpath & "#submit"
    url.save
  end if
next

これを「お気に入り」フォルダに置いて、「お気に入りセンタ」上で、某掲示板のショートカットをドロップします。

このとき、ほかのフォルダで作成したファイルを「お気に入り」フォルダに「移動」すること!
「コピー」や「リンクの作成」だと整合性レベル=低になって面倒です。

2010年2月24日 (水)

IEの 「お気に入り」の 「リンク」は非表示にする。

IEの 「お気に入り」の 「リンク」を開いて、「コマンド ウィンドウをここで開く」

attrib . +h

エクスプローラの「タスクバー」の「ツールバー」の 「リンク」はそのまま使えます。

お気に入りのリンク フォルダを非表示にする方法

2010年2月23日 (火)

PowerShellスクリプトをGUIアプリ化してコンソールを非表示にするとエラーメッセージを見えない。

そこで、エラーメッセージをMessageBoxに出します。

trap{
  if($host.ui.rawui.buffersize.width -lt 150){
    $buffersize=$host.ui.rawui.buffersize
    $buffersize.width=150
    $host.ui.rawui.buffersize=$buffersize
  }
  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  [void][System.Windows.Forms.MessageBox]::Show($($_|out-string))
  break
}
aaa

2010年2月22日 (月)

代替ストリームだけを一覧する。

dir /rで代替ストリームも一覧できますが、代替ストリームだけを一覧するには?

enum_streams.cmd

@ECHO OFF
FOR /F "tokens=1* delims= " %%1 IN ('dir /r %* ^|find ":$DATA"') DO ECHO %%1 %%2

2010年2月21日 (日)

代替ストリームを除去する。

例えば、NTFSからFATやZIPにコピーすれば、代替ストリームが消えますが、単に代替ストリームを除去するには?

スクリプトで、

remove-streams.vbs ファイル...

const adTypeBinary = 1
const adSaveCreateOverWrite = 2
for each file in wscript.arguments
  set stream=createobject("adodb.stream")
  stream.type=adTypeBinary
  stream.open
  stream.loadfromfile file
  stream.savetofile file, adSaveCreateOverWrite
  stream.close
next

バッチファイルで、ただし、(シフトJIS)テキストファイル限定

remove-streams.cmd ファイル...

for %%I in (%*) do for /f "delims=" %%J in ('type  %%I ^& type nul ^>%%I') do (echo;%%J) >>%%I

インターネットショートカットも(シフトJIS)テキストファイルなので使えます。

2010年2月20日 (土)

ショートカットをこのフォルダに作成する。

SHIFT+CTRLを押しながらコピーすれば、ショートカットが作れますが、面倒です。
また、CopyHere()メソッドやMoveHere()メソッドはあっても、LinkHere()がない。そこで、

LinkHere.vbs [/] パス...

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
If WScript.Arguments.Named.Exists("") Then
  Target=wShell.CurrentDirectory
Else
  Target=fso.GetParentFolderName(WScript.ScriptFullName)
End If
For Each Item In WScript.Arguments.UnNamed
  Set Link=wShell.CreateShortcut(fso.BuildPath(Target,fso.GetFileName(Item) & ".lnk"))
  Link.TargetPath=Item
  Link.Save
Next

引数のパスに対するショートカットをこのフォルダに作成します。
作成先フォルダは、引数に/があれば、カレントディレクトリ、なければスクリプトと同じフォルダです。

スクリプトを「送る」フォルダに置けば、ショートカットをSendToフォルダに送れます。

スクリプトを作成先フォルダに置いて、スクリプトのショートカットを「送る」フォルダに置けば、ショートカットを作成先フォルダに送れます。

スクリプトのアプリのショートカットに作業フォルダを設定して「送る」フォルダに置けば、ショートカットを作業フォルダに送れます。
ただし、このときのリンク先は、以下のようにします。
wscript.exe "フルパス\LinkHere.vbs" /
ここで、もし、スクリプトのショートカットの場合は、
ドロップで作業フォルダが無効になる。
引数が置換される。
なので、スクリプトのアプリのショートカットにします。その場合は、
ドロップで作業フォルダを有効になる。
引数が置換でなく追加される。

2010年2月19日 (金)

「送る」メニューに「SendToフォルダにショートカットを送る」を作る。

「送る」にSendToフォルダのショートカット「SendToフォルダ.lnk」を作れば、SHIFT+CTRLを押しながら「SendToフォルダ」に送れば、ショートカットが送れますが、面倒です。

そこで、SendToフォルダに「SendToフォルダ(&N).lnk」と「SendToフォルダにショートカット.vbs」を作ります。

CreateObject("WScript.Shell").SendKeys "+{f10}n+^n"

ここで、アクセスキーが重複しないよう、SendToフォルダにNで始まるものがないようにします。

ほかのフォルダにショートカットを送る場合も同様にできます。

2010年2月18日 (木)

「送る」メニューにもアクセスキーが付けられる。

SendToフォルダ(shell:sendto)のファイル名中の文字に&を付ければよいようです。&がなければ先頭文字です。

例えば「圧縮 (zip 形式) フォルダ」なら「圧縮 (&zip 形式) フォルダ」や「圧縮 (zip 形式) フォルダ(&Z)」あるいは「Z 圧縮 (zip 形式) フォルダ」みたいにします。

2010年2月17日 (水)

バッチファイルやスクリプトから簡単に出せる処理中メッセージ

mshta.exeのワンライナースクリプトで。

mshta "about:実行中...<hta:application /><script>resizeTo(130,90);close(new ActiveXObject('scripting.filesystemobject').GetStandardStream(0).ReadAll())</script>"

標準入力を閉じると、ウィンドウも閉じます。

バッチファイルなら、

(
処理
) | mshta "about:実行中...<hta:application /><script>resizeTo(130,90);close(new ActiveXObject('scripting.filesystemobject').GetStandardStream(0).ReadAll())</script>"

スクリプトなら、

set executing=createobject("wscript.shell").exec("mshta ""about:実行中...<hta:application /><script>resizeTo(130,90);close(new ActiveXObject('scripting.filesystemobject').GetStandardStream(0).ReadAll())</script>""")
処理
executing.stdin.close

スクリプトが終了しても自動で閉じます。:-)

2010年2月16日 (火)

out-ie.ps1 PowerShellからHTMLをIEに流し込む。

PowerShellには、ConvertTo-Htmlコマンドレットがあって、HTMLが生成できますが、それをIEに流し込んで表示するコマンドレットは標準にはありません。
代わりに、out-ie.ps1が紹介されてますが、環境によって動いたり、動かなかったりします。
そこで、汎用に動くようにします。

out-ie.ps1

$ie=new-object -com InternetExplorer.Application
$ie.toolbar=$false
$ie.visible=$true
$ie.navigate("about:blank")
while($ie.busy -or ($ie.readystate -ne 4)){sleep 1}
$html=$input|out-string
try{
  $ie.document.write($html)
}catch{
  $ie.document.IHTMLDocument2_write($html)
}

2010年2月15日 (月)

view-csv.ps1 CSVファイルを表示する。

もし、Excelがあれば、Excelに関連付けされて、見れますが、もっと簡単に見る方法はないものか?

csvview.htaを使う方法もありますが、もし、PowerShellが入っていれば、簡単にGUI表示できます。

Get-Content CSVファイル | CovertFrom-CSV | Out-GridView

ただし、難点は、PowerShellコンソールが開くことと、PowerShellコンソールを閉じるとGUIも閉じることです。

例えば、

view-csv.ps1 CSVファイル...

foreach($arg in $args){
  get-content $arg|convertfrom-csv|out-gridview
}

PowerShellコンソールで、

PS > .\view-csv.ps1 a.csv

はよいけれど、これにCSVファイルをドロップしたり、コマンドプロンプトで、

> view-csv.ps1 a.csv

は、グリッドビューが開いて、すぐ閉じてしまいます。:-(

そこで、もし、GUIから起動されたら、コンソールを非表示にして、グリッドビューが閉じるのを待ち合わせします。
また、もし、コンソールから関連付けで起動されたときも、グリッドビューが閉じるのを待ち合わせします。

view-csv.ps1

$gui=[system.environment]::commandline -like "*$($myinvocation.mycommand.path)*"
if($gui -and ([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle -ne 0)){
  powershell -windowstyle hidden -command exit
}
foreach($arg in $args){
  get-content $arg|convertfrom-csv|out-gridview
}
if($gui){
  while([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle -ne 0){
    start-sleep 1
  }
}

これならおk。

2010年2月14日 (日)

Import-CSVコマンドレットには、-Encodingパラメタがなく、文字化けする。

シフトJISのCSVファイルをImport-CSVすると、文字化けします。

なぜか、Import-CSVコマンドレットには、-Encodingパラメタがありません。

なので、

Import-CSV CSVファイル

の代わりに、

Get-Content CSVファイル | CovertFrom-CSV

を使います。

Get-Contentコマンドレットには-Encodingパラメタがありますし、また、文字コードを自動認識するようです。

2010年2月13日 (土)

ショートカットや関連付けで非表示、最小化、最大化するラッパを作る。

ショートカットで最小化や最大化はできますが、非表示ができません。
関連付けでは、そもそもウィンドウの大きさがありません。

vbc /t:winexe HideRun.vb

Module Module1
Function Main() As Integer
Dim CommandLine As String = System.Environment.CommandLine
Dim FileName As String = ""
Dim n As Integer
For n = 1 To 2
  Dim Quoted As Boolean = False
  Dim k As Integer
  For k=0 To CommandLine.Length-1
    If CommandLine.Chars(k) = """" Then
      Quoted = Not Quoted
    ElseIf Not Quoted AndAlso CommandLine.Chars(k) = " " Then
      Exit For
    End If
  Next
  FileName = CommandLine.Substring(0,k).Replace("""","")
  CommandLine = CommandLine.Remove(0,k).Trim()
Next
Dim oProcess As New System.Diagnostics.Process()
oProcess.StartInfo.FileName = FileName
oProcess.StartInfo.Arguments = CommandLine
oProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden
'oProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized
'oProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Maximized
Try
  oProcess.Start()
Catch
  MsgBox("Source" & vbTab & vbTab & Err.Source & vbLf & "Number" & vbTab & vbTab & Err.Number & vbLf & "Description" & vbTab & Err.Description & vbLf & "DLL Error" & vbTab & Err.LastDLLError)
  Return 255
End Try
End Function
End Module

ショートカットのリンク先や関連付けのcommandキー値の先頭に入れます。
HideRun.exe ~

同様に、MinRun、MaxRunも作ります。

2010年2月12日 (金)

ps1ファイルでConsole-Window Hybrid Applicationを作る。

コンソールから起動されたらコンソールアプリで、GUIから起動されたらウィンドウアプリに変身する。

ps1ファイルでConsole Application戦略の例。

hybrid.ps1

if(([system.environment]::commandline -like "*$($myinvocation.mycommand.path)*") -and ([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle -ne 0)){
  powershell -windowstyle hidden -command exit
  [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
  [System.Windows.Forms.MessageBox]::Show("from gui")
}else{
  write-host "from console"
}

2010年2月11日 (木)

VB.NETで、Console-Window Hybrid Applicationを作る。

コンソールから起動されたらコンソールアプリで、GUIから起動されたらウィンドウアプリに変身する。

VB.NETで、Console Application戦略の例。

vbc hybrid.vb

Module Module1
Declare Function GetConsoleWindow Lib "kernel32" () As Integer
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef ProcessId As Integer) As Integer
Declare Function ShowWindow Lib "user32" (ByVal hWnd As Integer, ByVal nCmdShow As Short) As Integer
Const SW_HIDE As Short = 0s

Sub Main()
Dim hwnd As Integer = GetConsoleWindow()
Dim pid As Integer
GetWindowThreadProcessId(hwnd, pid)
If System.Diagnostics.Process.GetCurrentProcess().Id=pid Then
  ShowWindow(hwnd, SW_HIDE)
  System.Windows.Forms.MessageBox.Show("from gui")
Else
  System.Console.Writeline("from console")
End If
End Sub
End Module

2010年2月10日 (水)

Console-Window Hybrid Applicationを作る。

コンソールから起動されたらコンソールアプリで、GUIから起動されたらウィンドウアプリに変身する。

Window Application戦略(非推奨)

ウィンドウアプリで作って、コンソールから起動されたら変身する。

AttachConsole()できれば、コンソールから起動された。

GetStdHandle(STD_INPUT_HANDLE)

System.Console.In.GetType().ToString()
で区別する方法はリダイレクトに対応できないので非推奨。

ただし、コマンドプロンプトから起動したときに、終了を待ち合わせすることなくプロンプトに復帰して、バックグラウンド実行される。

アプリ | more
start /wait アプリ
で待ち合わせることもできるが面倒臭い。

なので、結局、この戦略は非推奨。

Console Application戦略(推奨)

コンソールアプリで作って、GUIから起動されたら変身する。

hwnd=GetConsoleWindow()
GetWindowThreadProcessID(hwnd,pid)
PIDが現PIDと一致すれば、GUIから起動された。
ShowWindow(hwnd,SW_HIDE)

System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle=0ならコンソールから起動された。
でも簡易判定できるが、GUIから非表示で起動されたときに誤判定される。

ShowWindow(hwnd,SW_HIDE)でなく、FreeConsole()するやり方も考えられるが、それなら、
FreeConsole()
AttachConsole()できれば、コンソールから起動された。
ただし、コンソールからstartで起動されたときに誤判定(?)される。

いずれにせよ、GUIから起動されたときに一瞬コンソールが表示される。
これを避けるには、ショートカットなら最小化にしておくとよいでしょう。
関連付けなどでは、HideRun.exeのような非表示ラッパを作ってやればよいでしょう。
HideRun.exe アプリ

2010年2月 9日 (火)

SHIFTキー抜きの「完全に削除」を作る。

SHIFT+DELや右クリック、SHIFT+削除で「完全に削除」できますが、SHIFTキーが面倒です。

そこで、SendToフォルダに「完全に削除.vbs」を作ります。これを「送る」メニューから使います。

CreateObject("WScript.Shell").SendKeys "+{del}"

2010年2月 8日 (月)

SHIFTキー抜きの「パスとしてコピー」を作る。

Vistaには、SHIFT+右クリックで「パスとしてコピー」がありますが、SHIFTキーが面倒です。

そこで、SendToフォルダに「パスとしてコピー.vbs」を作ります。これを「送る」メニューから使います。

CreateObject("WScript.Shell").SendKeys "+{f10}a"

また、ディレクトリ背景に関連付ければ、「ファイル」メニューや「ディレクトリ背景」メニューから選択できます。
HKCR\directory\background\shell\CopyAsPath\command
wscript.exe フルパス\パスとしてコピー.vbs

2010年2月 7日 (日)

clip.exeで「パスとしてコピー」を作る。

Vistaには、SHIFT+右クリックで「パスとしてコピー」がありますが、SHIFTキーが面倒です。

Vistaには、clip.exeがあるので、それでSendToフォルダにショートカット「パスとしてコピー.lnk」を作ります。

リンク先:
cmd.exe /c for /l %n in (1,1,2) do if %n==2 ((for %q in (%x%) do @echo %q)|clip.exe) else set x=

ウィンドウの大きさ: 最小化

clip.exeがなく、PowerShell 2.0がある場合は、

cmd.exe /c for /l %n in (1,1,2) do if %n==2 ((for %q in (%x%) do @echo %q)|powershell -Sta "Add-Type -AssemblyName System.Windows.Forms;[Windows.Forms.Clipboard]::SetText($input)") else set x=

2010年2月 6日 (土)

アドレスバーのないIEを起動する。

アドレスバーのないIE.vbs [URL]

Set ie=CreateObject("InternetExplorer.Application")
ie.AddressBar=False
ie.Visible=True
If WScript.Arguments.Count Then
  ie.Navigate WScript.Arguments.Item(0)
Else
  ie.GoHome
End If

ただし、タブ表示とは相容れないようです。

2010年2月 5日 (金)

IEのアドレスバーの表示/非表示を切り替える。

メニューから変更できなくなったので。

アドレスバー非表示.vbs

Set Shell=CreateObject("Shell.Application")
For Each ie In Shell.Windows()
  If InStr(LCase(ie.FullName),"iexplore.exe")=0 Then
  ElseIf ie.AddressBar Then
    ie.Visible=False
    ie.AddressBar=False
    ie.Visible=True
  End If
Next

アドレスバー再表示.vbs

Set Shell=CreateObject("Shell.Application")
For Each ie In Shell.Windows()
  If InStr(LCase(ie.FullName),"iexplore.exe")=0 Then
  ElseIf ie.AddressBar=False Then
    ie.Visible=False
    ie.AddressBar=True
    ie.Visible=True
  End If
Next

これらはお気に入りバーに入れて起動するとよいでしょう。

2010年2月 3日 (水)

IEのアクティブタブで開く。新しいタブで開く。新しいウィンドウで開く。

以前のIEでは、DDEのWWW_OpenURLでアクティブウィンドウなどに開けましたが、IE8では、インターネットオプション/全般/タブ/設定によって動作が変わります。

そこで、設定に影響されないで開く方法。

アクティブタブで開く.vbs URL

Set Shell=CreateObject("Shell.Application")
For k=Shell.Windows().Count-1 To 0 Step -1
  Set ie=Shell.Windows().Item(k)
  If LCase(Right(ie.FullName,13))="\iexplore.exe" Then
    StatusText=CStr(Now)
    ie.StatusText=StatusText
    If ie.StatusText=StatusText Then Exit For
  End If
Next
If IsEmpty(ie) Then
  Set ie=CreateObject("InternetExplorer.Application")
  ie.Visible=True
End If
ie.Navigate WScript.Arguments.Item(0)

新しいタブで開く.vbs URL

Set Shell=CreateObject("Shell.Application")
For k=Shell.Windows().Count-1 To 0 Step -1
  Set ie=Shell.Windows().Item(k)
  If LCase(Right(ie.FullName,13))="\iexplore.exe" Then Exit For
Next
If IsEmpty(ie) Then
  Set ie=CreateObject("InternetExplorer.Application")
  ie.Visible=True
End If
ie.Navigate2 WScript.Arguments.Item(0),&H800

※Navigateでは駄目なので、Navigate2を使用する。

新しいウィンドウで開く.vbs URL

Set ie=CreateObject("InternetExplorer.Application")
ie.Visible=True
ie.Navigate WScript.Arguments.Item(0)

2010年2月 2日 (火)

フォルダを別ウィンドウで開く。

右クリックの、エクスプローラ、開く、のうち、下の方で開くと、別ウィンドウで開かれます。

ナビゲーションペインで、フォルダを開いているとエクスプローラ/開くの順、でなければ開く/エクスプローラの順です。

シフト+ダブルクリック は非推奨。ナビゲーションペインだと使えないし。

2010年2月 1日 (月)

文字コードで文字を入力する。

文字コードによる文字の入力方法には、いろいろあるようで、例えば、

33440 (シフトJIS 10進数)
82a0 (シフトJIS 16進数4桁)
3042 (Unicode 16進数4桁)
の場合、

IMEを使わない方法
ALT+33440 (Numpadキーで)

IMEを使う方法
82a0{F5} (波下線状態で)
~~~~
3042{F5} または 変換 文字コード変換...
~~~~
JISコード16進数4桁やJIS句点コード5桁も可能らしいが、調べるのが面倒です。

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