« 2008年12月 | トップページ | 2009年2月 »

2009年1月28日 (水)

コマンドプロンプトやバッチファイルで使えるNOPコマンドは?

CMD.EXEの内部コマンドの
CALL
TITLE
が、引数なしで、NOPになります。

例えば、空のファイルを作成するには、
CALL > 空のファイル
TITLE > 空のファイル

また、
IF NOT 条件 コマンド
は、
IF 条件 (CALL) ELSE コマンド
IF 条件 (TITLE) ELSE コマンド
と書けます。

CALLはERRORLEVELを設定しますが、TITLEは変えません。
「CALL」 ERRORLEVEL=1
「CALL 」ERRORLEVEL=0
空白があるかどうかでERRORLEVELが変わります。

2009年1月26日 (月)

バッチファイルでコンソールウィンドウのタイトルを取得する。

TITLEコマンドでコンソールウィンドウのタイトルを変更することはできても、元のタイトルを調べることはできません。:-(
そこで、tasklist.exeを使ってコンソールウィンドウのタイトルを調べます。

GetTitle.CMD

@echo off
setlocal enabledelayedexpansion
set LF=^

set TASKLIST=
for /f "delims=" %%i in ('tasklist /v /fo csv /nh') do set TASKLIST=!TASKLIST!!LF!%%i
for /f "tokens=2 delims=," %%i in ('title @@@^&tasklist /v /fo csv /nh /fi "windowtitle eq @@@"') do set pid=%%i
for /f "delims=" %%i in ("!TASKLIST!") do call :sub %%i
goto :eof
:sub
if %2==%PID% echo %9
goto :eof

2009年1月25日 (日)

バッチファイルでプロセスIDを取得する。

tasklist.exeを使って、コンソールウィンドウの所有プロセスのプロセスIDを調べます。

GetPID.CMD

@echo off
for /f "tokens=2 delims=," %%i in ('title @@@^&tasklist /v /fo csv /nh /fi "windowtitle eq @@@"') do echo %%~i

厳密には、コンソールウィンドウの所有プロセスは、そのバッチファイルを実行中のシェルプロセスとは限りません。その親や御先祖かも知れません。

コンソールウィンドウのタイトルを一時的に変えて、そのタイトルのウィンドウの所有プロセスのプロセスIDを調べます。
サブシェルでタイトルを変えた場合は、元のタイトルに戻ります。

2009年1月18日 (日)

バッチファイルで、dllのアイコンをインデックスで一覧表示する。

例えば、shell32.dllのアイコンをインデックスで一覧表示するには、空のフォルダで、以下のバッチファイルを実行します。

hoge.cmd

for /l %%n in (-338,1,237) do (
echo [InternetShortcut]
echo IconFile=C:\WINDOWS\system32\shell32.dll
echo IconIndex=%%n
) > shell32.%%n.url

2009年1月13日 (火)

ホットキーが設定されてるショートカットを表示する。

ホットキーが有効なのは、デスクトップとスタートメニューにあるショートカットなので、そこを探します。

Hotkeys.vbs

Option Explicit
Dim fso
Dim wShell
Dim Shell

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
Set Shell=CreateObject("Shell.Application")

Files fso.GetFolder(wShell.SpecialFolders.Item("Desktop"))
Files fso.GetFolder(wShell.SpecialFolders.Item("AllUsersDesktop"))
SubFolders fso.GetFolder(wShell.SpecialFolders.Item("StartMenu"))
SubFolders fso.GetFolder(wShell.SpecialFolders.Item("AllUsersStartMenu"))

Sub Files(Folder)
Dim File
Dim Link
Dim FolderItem

For Each File In Folder.Files
  Select Case fso.GetExtensionName(File.Name)
  Case "lnk"
    Set Link=wShell.CreateShortcut(File.Path)
    If Link.HotKey<>"" Then WScript.Echo Join(Array(_
      "FullName" & vbTab & Link.FullName,_
      "TargetPath" & vbTab & Link.TargetPath,_
      "Arguments" & vbTab & Link.Arguments,_
      "WorkingDirectory" & vbTab & Link.WorkingDirectory,_
      "WindowStyle" & vbTab & Link.WindowStyle,_
      "Hotkey" & vbTab & Link.Hotkey,_
      "IconLocation" & vbTab & Link.IconLocation,_
      "Description" & vbTab & Link.Description),vbLf)
  Case "url"
    Set FolderItem=Shell.NameSpace(Folder.Path).Items().Item(File.Name)
    Set Link=FolderItem.GetLink
    WScript.Echo Join(Array(_
      "FullName" & vbTab & FolderItem.Path,_
      "Path" & vbTab & Link.Path,_
      "WorkingDirectory" & vbTab & Link.WorkingDirectory,_
      "ShowCommand" & vbTab & Link.ShowCommand,_
      "Hotkey" & vbTab & Link.Hotkey,_
      "IconLocation" & vbTab & GetIconLocation(FolderItem.Path),_
      "IconIndex" & vbTab & Link.GetIconLocation(""),_
      "Description" & vbTab & Link.Description),vbLf)
  End Select
Next
End Sub

Sub SubFolders(Folder)
Dim SubFolder
Files Folder
For Each SubFolder In Folder.SubFolders
  If SubFolder.Attributes And 2 = 0 Then Files SubFolder
Next
End Sub

Function GetIconLocation(Path)
Dim File
Dim Line
Set File=fso.OpenTextFile(Path)
Do While Not File.AtEndOfStream
  Line=Trim(File.ReadLine)
  If InStr(UCase(Line),"ICONFILE=") Then
    GetIconLocation=Trim(Mid(Line,10))
    Exit Function
  End If
Loop
End Function

2009年1月 3日 (土)

cmd.exeでUnicode

バッチファイルはUnicode系にできませんが、CMD.EXEでUnicodeが使えない訳ではありません。

ファイルからUnicode系のコードページで読み込めないだけで、引数、環境変数、ファイル名からUnicode文字を取り込むことはできます。

例えば、ショートカットのリンク先や「ファイル名を指定して実行」に、

cmd /u /c echo 야후 >야후.txt

と入れて、実行できます。

あるいは、
---
CreateObject("WScript.Shell").Run "cmd /u /c echo 야후 >야후.txt"
---
というVBSファイルをUnicodeで保存して、実行できます。

« 2008年12月 | トップページ | 2009年2月 »