2013年3月11日月曜日

FOR 変数参照の置換(%~) の可能性を探る旅

ファイルの取扱いで痒いところに手が届かないイメージのあるDOSですが、for /? のHelpを見ると、それなりに使えるオプションが揃っています。
今回は、FOR 変数参照の置換(%~) の可能性を探る旅と称して、「DOS for文のツアー」を準備してみました。



旅準備:

test用のフォルダとファイルを準備します。 手作りでもいいですが、せっかくなので下の8行をコピーしてDOS窓にペーストして実行してみます。

if not exist C:\temp\for (mkdir C:\temp\for)
fsutil file createnew C:\temp\for\0kb.txt 0
fsutil file createnew C:\temp\for\1kb.txt 1024
fsutil file createnew C:\temp\for\10kb.txt 1024
if not exist C:\temp\for\sub (mkdir C:\temp\for\sub)
fsutil file createnew C:\temp\for\sub\0kb.txt 0
fsutil file createnew C:\temp\for\sub\5kb.txt 5120
fsutil file createnew C:\temp\for\sub\50kb.txt 51200


DOS窓からtreeで表示すると下記のような構成のフォルダになります
> tree /F /A C:\temp\for

C:\TEMP\FOR
|   0kb.txt
|   10kb.txt
|   1kb.txt
|
\---sub
        0kb.txt
        50kb.txt
        5kb.txt


test用のフォルダの準備ができたら、そのDOSをそのまま使っても結構なのでecho offします(for文の標準出力がうっとうしいので)
echo off


そして以下のfor文を実行してみましょう

for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %I)

こんな結果が出たら旅の準備は完了です
C:\temp\for\0kb.txt
C:\temp\for\10kb.txt
C:\temp\for\1kb.txt
C:\temp\for\sub
C:\temp\for\sub\0kb.txt
C:\temp\for\sub\50kb.txt
C:\temp\for\sub\5kb.txt


いざ旅へ!:

さて、ここから旅の始まりです。「FOR 変数参照の置換オプション」を試してみましょう
はてさて、それぞれどんな結果になるでしょうか?
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~fI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~sI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~aI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~tI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~zI)

for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~ftzaI)


更なる旅へ!:

さて(うまく結果が出たとして)、今回の「DOS for文ツアー」はここで終わりです
これまでを通して「FOR 変数参照の置換オプション」というツールを手に入れられたのではないでしょうか? (ついでにfsutilやtreeなどにも触れました。)

 個人的には ~z のファイルのサイズを返すオプションが目玉だと思います。空ファイル(0kb)を判別する必要がある時などに重宝します。

そして、ここからが旅の本番です、行く先々で待ち受けているであろう「DOS故の痒いところ」は、もしかすると「FOR 変数参照の置換オプション」で、意外と簡単に乗り越えられるかもしれませんね


今回の例ではFOR変数に I を使用しています、またコマンドラインで実行しているので 変数I に付ける % は一個です、.batで実行するような時は %%I としてください。 またFOR変数は I である必要はありません、aを使いたかったら%aでいいですし、その場合は %~za という感じで使ってください


最後に「FOR 変数参照の置換オプション」をリストしておきます。for /? からの抜粋です。
===========================================================

    %~I         - すべての引用句 (") を削除して、%I を展開します。
    %~fI        - %I を完全修飾パス名に展開します。
    %~dI        - %I をドライブ文字だけに展開します。
    %~pI        - %I をパス名だけに展開します。
    %~nI        - %I をファイル名だけに展開します。
    %~xI        - %I をファイル拡張子だけに展開します。
    %~sI        - 展開されたパスは短い名前だけを含みます。
    %~aI        - %I をファイルの属性に展開します。
    %~tI        k- %I ファイルの日付/時刻に展開します。
    %~zI        - %I ファイルのサイズに展開します。
    %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                   検索し、最初に見つかった完全修飾名に %I を
                   展開します。
                   環境変数名が定義されていない場合、または検索
                   してもファイルが見つからなかった場合は、この
                   修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dpI       - %I をドライブ文字とパスだけに展開します。
    %~nxI       - %I をファイル名と拡張子だけに展開します。
    %~fsI       - %I を完全なパスと短い名前だけに展開します。
    %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
                   検索して %I を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftzaI     - %I を DIR コマンドの出力行のように展開します。

===========================================================

2013年2月25日月曜日

Scripting.FileSystemObject.Drive Object - Sample

Scripting.FileSystemObject.Driveの使用例


scanDrives.vbs:
 VBスクリプト。 Scripting.FileSystemObjectオブジェクトを作成してDrivesと

 EnumNetworkDrivesを使用して、マイコンピュータがマウントしている各ドライブをスキャンして
 各ドライブの情報をCSV形式で出力する

使い方:
 下のscanDrives.vbsをテキストエディタにコピペして、scanDrives.vbsで保存して実行

 次の例はC:\scanDrives.vbsに保存した場合の使用方法。


c:\>cscript /nologo c:\scanDrives.vbs
 Letter,Type,Total[Byte],Used[Byte],Available[Byte],Usage[%],Path
 C,Local HDD Drive,52428795904,48322715648,4106080256,7.83%,-
 D,Local HDD Drive,246629265408,151006982144,95622283264,38.77%,-
 E,Local HDD Drive,20971515904,10150678528,10820837376,51.60%,-
 F is not ready.
 Z,Network Drive,-,-,-,-,\\fileserver01\Shared\
 Y,Network Drive,-,-,-,-,\\fileserver02\NASShare
 Z,Network Drive,-,-,-,-,\\remoteservr01\c$


scanDrives.vbs
==================================================================================
'--------------------------------------------------------
' Scripting.FileSystemObject.Drive Object
'--------------------------------------------------------
' Property       | 機能
'----------------|---------------------------------------
' AvailableSpace | 利用可能な空きスペースの大きさを取得する
' DriveLetter    | ドライブ名(「C」など)を取得する
' DriveType      | ドライブの種類を取得する (0は不明なドライブ、1はリムーバブル・ディス
'                | ク、2はハードディスク、3はネットワーク・ドライブ、4はCD-ROM、5はRAM
'                | ディスクを表す。)
' FileSystem     | ドライブのファイルシステムを取得する
' FreeSpace      | ディスクの空きスペースの大きさを取得する
' IsReady        | ドライブが準備できているかどうかを取得する
' Path           | コロン付きのドライブ名を取得する
' RootFolder     | ルートフォルダを表すFolderオブジェクトを取得する
' SerialNumber   | ディスクのシリアルナンバーを取得する
' ShareName      | ネットワーク・ドライブの共有名を取得する
' TotalSize      | ディスクの総容量を取得する
' VolumeName     | ドライブのボリューム名を取得する
'---------------------------------------------------------

Set fso1 = CreateObject("Scripting.FileSystemObject")
Set drives = fso1.Drives
Set fso2 = CreateObject ("WScript.Network")
Set networkdrives = fso2.EnumNetworkDrives

WScript.Echo "Letter" & "," & "Type" & "," & "Total[Byte]" & "," & "Used[Byte]" & "," & "Available[Byte]" & "," & "Usage[%]" & "," & "Path"

For Each drive in drives
   letter = drive.DriveLetter
   if(drive.isReady) Then
   Select Case drive.DriveType
      Case "1"
         diskusage = FormatPercent (drive.AvailableSpace/drive.TotalSize)
         WScript.Echo letter & "," & "Removable HDD Drive" & "," & drive.TotalSize & "," & drive.TotalSize - drive.AvailableSpace & "," & drive.AvailableSpace & "," & diskusage & "," & "-"
         WScript.Echo letter
         diskusage = ""
      Case "2"
         diskusage = FormatPercent (drive.AvailableSpace/drive.TotalSize)
         WScript.Echo letter & "," & "Local HDD Drive" & "," & drive.TotalSize & "," & drive.TotalSize - drive.AvailableSpace & "," & drive.AvailableSpace & "," & diskusage & "," & "-"
         diskusage = ""
      Case "3"
         path = ""
         For i = 0 to networkdrives.Count - 1 Step 2
            if networkdrives.Item(i) = letter & ":" Then
               path = networkdrives.Item(i + 1)
            End if
         Next
         WScript.Echo letter & "," & "Network Drive" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & path
      Case "4"
         WScript.Echo letter & "," & "Disc Drive" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & "-"
      Case Else
         WScript.Echo letter & "," & "Unknown Drive Type" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & path
   End Select
   Else
         WScript.Echo letter & " is not ready."
   End if
Next
==================================================================================


DOSの妙 その1



妙: if文の処理ブロックは空ではいけない
@echo off
if "%1"=="" (

) else (
 echo %1
)
例えば、上の例は、 「) の使い方が誤っています。」  と怒られて処理が失敗します。
理由はif文ブロックが空だからです。
@echo off
if "%1"=="" (
 rem
) else (
 echo %1
)
remでもいいので、ブロックに何か入れてあげないといけません。
remって意味があるんですね、これも妙ですね

(まぁ、そもそも空のif文ブロックだったら書かないのが普通ですけど)



2013年1月30日水曜日

起動用バッチを作ってみよう


たとえばEclipseを使うときになどによくある、環境変数(%PATH%など)を明示的に設定してから実行させる必要があるような手のものに対して、起動用バッチを作ってみる

-----------------------------------------------------------------------------

Eclipseは%PATH%変数にJDKのbinを追加しておく必要がある、さもないとJVM Launcherから以下のようなエラーが出る。


Error: could not open
C:\apps\Java\jre6x64\lib\amd64\jvm.cfg
 

なので、Eclipseを起動するまえに起動環境に、あらかじめJDKのbinのパスを%PATH%変数に通してあげておくことが必要。 例えば、JavaをD:\java\jdk1.6.0_37にインストールしている場合には、以下の設定を行う。
set path=D:\java\jdk1.6.0_37\bin
もしくは
set path=D:\java\jdk1.6.0_37\bin;%path%  (eclipseの例の場合はどちらでも良いです。)
-----------------------------------------------------------------------------

システム環境変数に入れてしまってもいいんですけど、ほかに開発環境を持っていて、かつそれら環境には異なるバージョンのJDKを指定する必要がある場合、各環境毎に起動用バッチを作っておいて、それぞれ指定の環境で起動した方が勝手が良い。


Eclipseの例:

前提:
  • Eclipse はD:\eclipse-SDK-4.2.1-win32-x86_64にインストールされている
  • JDKは D:\java\jdk1.6.0_37\binにインストールされている
  • そしてEclipseを、%path%=D:\java\jdk1.6.0_37\binという設定がされている環境で起動したい 
  • 環境設定+Eclipse起動用のbatファイルを(start_eclipse.bat)
手順:

 1. Eclipse用の環境を設定するbatファイルを準備する (start_eclipse.bat)
例: start_eclipse.bat
 @echo off
 set path=D:\java\jdk1.6.0_37\bin
 D:\eclipse-SDK-4.2.1-win32-x86_64\eclipse.exe

Eclipseのケースは以上で充分ですが、Command lineベースで使用するアプリケーション(Wireshark(tshark)など)の場合にはさらに応用編として、cmd /kショートカットを使うとより細かく実行環境をセットアップする方法もありますが、こちらは何かの折に。ということで。。。

2013年1月29日火曜日

outlook.ost

outlook.ostとは "オフライン Outlook データ ファイル" のこと。

この機能自体は大変便利だけど、標準設定だとCドライブの %USERPROFILE%\AppData\Local\Microsoft\Outlookという場所に作成されてしまうので、使っているうちにCドライブのDiskをどんどん消費してしまう (ほっとくとGB以上になることも。。。)

もし、Cドライブとは別にユーザデータ用にD:やE:ドライブがあるなら、そちらに移しておいた方が良い。

--> 設定変更はこちらのURLを参照のこと
http://office.microsoft.com/ja-jp/outlook-help/HA010378297.aspx

2012年12月14日金曜日

Websphere Error Code 134218392

WebSphere Error Code 134218392 は、General Errorなので、まずはWindows Serviceで使用しているLog on アカウントのID/PWDを確認してみる。。。

2012年12月13日木曜日

Link to capture option examples for Wireshark.


Capture option examples for Wireshark.

   http://wiki.wireshark.org/CaptureFilters