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

« 2008年7月 | トップページ | 2008年9月 »

2008年8月30日 (土)

コマンドプロンプトのコンソールログを採取するコマンドをVB.NETで作る(その2)

コンソールスクリーンバッファの中身を標準出力に取り出します。

使用法

ConCopy.exe >ファイル (上書き)

ConCopy.exe >>ファイル (追加書き)

コンソールスクリーンバッファから溢れたログは消えます。
なので、コマンドプロンプトのプロパティで「画面バッファのサイズ」の「高さ」を十分大きくしておきます。

過去のログが不要なときは、先にclsコマンドでコンソールスクリーンバッファを消去しておきます。

ファイルに保存するときは、標準出力をリダイレクトします。
上書きか、追加書きかは、リダイレクションで指定します。

cls
~~~
~~~
concopy > ファイル
cls
~~~
~~~
concopy >> ファイル

2008年8月29日 (金)

コマンドプロンプトのコンソールログを採取するコマンドをVB.NETで作る

コンソールスクリーンバッファの中身を標準出力に取り出します。

vbc concopy.vb

Public Class Class1

Private Structure COORD
Dim x As Short
Dim y As Short
End Structure

Private Structure SMALL_RECT
Dim Left As Short
Dim Top As Short
Dim Right As Short
Dim Bottom As Short
End Structure

Private Structure CONSOLE_SCREEN_BUFFER_INFO
Dim dwSize As COORD
Dim dwCursorPosition As COORD
Dim wAttributes As Short
Dim srWindow As SMALL_RECT
Dim dwMaximumWindowSize As COORD
End Structure

Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Integer) As Integer
Private Declare Function GetConsoleScreenBufferInfo Lib "kernel32" (ByVal hConsoleOutput As Integer, ByRef lpConsoleScreenBufferInfo As CONSOLE_SCREEN_BUFFER_INFO) As Integer
Private Declare Function ReadConsoleOutputCharacter Lib "kernel32" Alias "ReadConsoleOutputCharacterA" (ByVal hConsoleOutput As Integer, ByVal lpCharacter As String, ByVal nLength As Integer, ByVal dwReadCoord As COORD, ByRef lpNumberOfCharsRead As Integer) As Integer

Private Const STD_INPUT_HANDLE As Integer = -10
Private Const STD_OUTPUT_HANDLE As Integer = -11
Private Const STD_ERROR_HANDLE As Integer = -12

Public Shared Sub Main()
Try
  Dim hConsoleOutput As Integer = GetStdHandle(STD_ERROR_HANDLE)
  Dim ConsoleScreenBufferInfo As CONSOLE_SCREEN_BUFFER_INFO
  GetConsoleScreenBufferInfo(hConsoleOutput, ConsoleScreenBufferInfo)
  For y As Integer = 0 To ConsoleScreenBufferInfo.dwCursorPosition.y-1
    Dim ConsoleText As String = New String(vbNullChar, ConsoleScreenBufferInfo.dwSize.x)
    Dim nLength As Integer =  ConsoleScreenBufferInfo.dwSize.x
    Dim dwReadCoord As COORD
    dwReadCoord.x = 0
    dwReadCoord.y = y
    Dim NumberOfCharsRead As Integer
    ReadConsoleOutputCharacter(hConsoleOutput, ConsoleText, nLength, dwReadCoord, NumberOfCharsRead)
    Console.WriteLine(ConsoleText.TrimEnd(" "c,vbNullChar))
  Next
Catch
  Console.Error.WriteLine("Source" & vbTab & vbTab & Err.Source & vbLf & "Number" & vbTab & vbTab & Err.Number & vbLf & "Description" & vbTab & Err.Description & vbLf & "DLL Error" & vbTab & vbTab & Err.LastDLLError)
End Try
End Sub
End Class

2008年8月28日 (木)

コンソールウィンドウの表示を変更するコマンドをVB.NETで作る

ShowConsoleWindow.exe [ウィンドウスタイル]

ウィンドウスタイルの値は、
0 非表示
1 普通サイズ
2 最小化
3 最大化
省略すると、元のサイズに戻す。

vbc ShowConsoleWindow.VB

Imports Microsoft.VisualBasic
Imports System

Public Class Class1

Private Declare Function GetConsoleWindow Lib "kernel32" () As Integer
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Integer, ByVal nCmdShow As Short) As Integer

Private Const SW_HIDE As Short = 0s
Private Const SW_SHOWNORMAL As Short = 1s
Private Const SW_SHOWMINIMIZED As Short = 2s
Private Const SW_SHOWMAXIMIZED As Short = 3s
Private Const SW_SHOWNOACTIVATE As Short = 4s
Private Const SW_SHOW As Short = 5s
Private Const SW_MINIMIZE As Short = 6s
Private Const SW_SHOWMINNOACTIVE As Short = 7s
Private Const SW_SHOWNA As Short = 8s
Private Const SW_RESTORE As Short = 9s
Private Const SW_SHOWDEFAULT As Short = 10s

Public Shared Function Main(ByVal CmdArgs() As String) As Integer
Dim nCmdShow As Short = SW_RESTORE
If CmdArgs.Length=0 Then
ElseIf CmdArgs.Length=1 AndAlso IsNumeric(CmdArgs(0)) Then
  nCmdShow=Convert.ToInt16(CmdArgs(0))
Else
  Console.WriteLine("Usage: ShowConsoleWindow [nCmdShow]")
  Return 0
End If
Dim hwnd As Integer = GetConsoleWindow()
Console.WriteLine(hwnd)
If hwnd Then ShowWindow(hwnd, nCmdShow)
Return hwnd
End Function
End Class

2008年8月27日 (水)

コンソールアプリを非表示で実行するラッパーをVB.NETで作る。(その3)

コンソールアプリを非表示で実行するコマンドとしても使えます。

コンソールアプリ [引数...]

の代わりに、

HideExec.exe コンソールアプリ [引数...]

とします。

ここで、コンソールアプリの標準入出力は、NULになります。

もし、ここで、リダイレクションやパイプを指定すれば、それが有効になります。

これは、一般のウィンドウアプリに共通して言えることです。

特に、.NETでは、Console.WriteやConsole.Error.Writeが、エラーハンドリングなしに、NOPになります。

2008年8月26日 (火)

コンソールアプリを非表示で実行するラッパーをVB.NETで作る。(その2)

このラッパーをWScript.ShellのExec()で使うには、

Set oExec=wShell.Exec("コンソールアプリ [引数...]")

の代わりに、

Set oExec=wShell.Exec("HideExec.exe コンソールアプリ [引数...]")

とします。

使用例(1)

Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("HideExec.exe more.com")
oExec.StdIn.WriteLine "aaa"
oExec.StdIn.WriteLine "bbb"
oExec.StdIn.Close
MsgBox oExec.StdOut.ReadAll,,"StdOut"
MsgBox oExec.StdErr.ReadAll,,"StdErr"

Exec()のStdOutやStdErrは、ノンブロッキングReadができないので、StdOutとStdErrのどちらに出るか予測できない会話はできません。
もし、StdOutとStdErrのどちらに出るか予見可能なら、会話も可能です。

使用例(2)

Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("HideExec.exe fc")
MsgBox oExec.StdOut.ReadAll,,"StdOut"
MsgBox oExec.StdErr.ReadAll,,"StdErr"

2008年8月25日 (月)

コンソールアプリを非表示で実行するラッパーをVB.NETで作る。

ウィンドウアプリとしてコンパイルします。

vbc /t:winexe HideExec.VB

Imports Microsoft.VisualBasic
Imports System
Imports System.Diagnostics
Imports System.Threading
Imports System.Text
Imports System.IO

Public Class HideExec

Private Shared InputWriter As StreamWriter = Nothing
Private Shared OutputReader As StreamReader = Nothing
Private Shared ErrorReader As StreamReader = Nothing

Public Shared Function Main(ByVal Arguments() As String) 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()
'  Console.WriteLine("FileName:{0}",FileName)
'  Console.WriteLine("Arguments:{0}",CommandLine)
Next
Dim oProcess As New Process()
oProcess.StartInfo.FileName = FileName
oProcess.StartInfo.Arguments = CommandLine
oProcess.StartInfo.UseShellExecute = False
oProcess.StartInfo.CreateNoWindow = True
oProcess.StartInfo.RedirectStandardInput = True
oProcess.StartInfo.RedirectStandardOutput = True
oProcess.StartInfo.RedirectStandardError = True

Try
  oProcess.Start()
  OutputReader = oProcess.StandardOutput
  Dim OutputThread As New Thread(AddressOf OutputDataHandler)
  OutputThread.Start()
  ErrorReader = oProcess.StandardError
  Dim ErrorThread As New Thread(AddressOf ErrorDataHandler)
  ErrorThread.Start()
  InputWriter = oProcess.StandardInput
  Dim InputThread As New Thread(AddressOf InputDataHandler)
  InputThread.Start()
  oProcess.WaitForExit()
  OutputThread.Join()
  ErrorThread.Join()
  System.Environment.Exit(oProcess.ExitCode)
Catch
  MsgBox("Source" & vbTab & vbTab & Err.Source & vbLf & "Number" & vbTab & vbTab & Err.Number & vbLf & "Description" & vbTab & Err.Description & vbLf & "DLL Error" & vbTab & vbTab & Err.LastDLLError)
  System.Environment.Exit(255)
End Try
End Function

Private Shared Sub OutputDataHandler()
Do
  Dim c As Integer = OutputReader.Read()
  If c = -1 Then Exit Do
  Console.Write(Convert.ToChar(c))
Loop
End Sub

Private Shared Sub ErrorDataHandler()
Do
  Dim c As Integer = ErrorReader.Read()
  If c = -1 Then Exit Do
  Console.Error.Write(Convert.ToChar(c))
Loop
End Sub

Private Shared Sub InputDataHandler()
Try
  Do
    Dim c As Integer = Console.Read()
    If c = -1 Then Exit Do
    InputWriter.Write(Convert.ToChar(c))
  Loop
Catch
End Try
InputWriter.Close()
End Sub

End Class

2008年8月24日 (日)

WScript.ShellのExec()で、コンソールアプリを非表示で実行するラッパー(その2)

このラッパーをWScript.ShellのExec()で使うには、

Set oExec=wShell.Exec("コンソールアプリ [引数...]")

の代わりに、

Set oExec=wShell.Exec("WScript.exe ""フルパス\HideExec.VBS"" コンソールアプリ [引数...]")
(もし入力があれば、oExec.Writeなど)
oExec.StdIn.Close

とします。

使用例(1)

Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("WScript.exe HideExec.VBS more")
oExec.StdIn.WriteLine "aaa"
oExec.StdIn.WriteLine "bbb"
oExec.StdIn.Close
MsgBox oExec.StdOut.ReadAll,,"StdOut"
MsgBox oExec.StdErr.ReadAll,,"StdErr"

入力は最初にまとめて与えます。ラッパーの都合で、会話的にはできません。

使用例(2)

Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("WScript.exe HideExec.VBS fc")
oExec.StdIn.Close
MsgBox oExec.StdOut.ReadAll,,"StdOut"
MsgBox oExec.StdErr.ReadAll,,"StdErr"

ラッパーの都合で、入力がなくても、最初にoExec.StdIn.Closeしないと駄目です。

また、スクリプトホストの設定に関係なく、WScript.exeを指定しないと駄目です。
関連付けの起動では、標準入出力がinheritされないからです。

2008年8月23日 (土)

WScript.ShellのExec()で、コンソールアプリを非表示で実行するラッパー

WScript.ShellのExec()で、コンソールアプリを実行すると、コンソールウィンドウが表示されて、鬱陶しいですね。

そこで、コンソールウィンドウを非表示にする、コンソールアプリのラッパーをVBScriptで作ります。

HideExec.VBS

Option Explicit
Dim fso
Dim wStdIn
Dim wStdOut
Dim wStdErr
Dim TempPath
Dim pStdIn
Dim pStdOut
Dim pStdErr
Dim StdIn
Dim StdOut
Dim StdErr
Dim wShell
Dim Command
Dim arg

Set fso=CreateObject("Scripting.FileSystemObject")
Set wStdIn=fso.GetStandardStream(0)
Set wStdOut=fso.GetStandardStream(1)
Set wStdErr=fso.GetStandardStream(2)
TempPath=fso.GetSpecialFolder(2).Path
pStdIn=fso.BuildPath(TempPath,fso.GetTempName())
pStdOut=fso.BuildPath(TempPath,fso.GetTempName())
pStdErr=fso.BuildPath(TempPath,fso.GetTempName())
Set StdIn=fso.CreateTextFile(pStdIn)
Sub Try
Do While Not wStdIn.AtEndOfStream
  StdIn.Write wStdIn.Read(1)
Loop
End Sub
Sub Catch
On Error Resume Next
Try
End Sub
Catch
StdIn.Close
Set wShell=CreateObject("WScript.Shell")
Command=Array()
For Each arg In WScript.Arguments
  If InStr(arg," ") Then arg="""" & arg & """"
  ReDim Preserve Command(UBound(Command)+1)
  Command(UBound(Command))=arg
Next
Command=Join(Command)
Command=Replace(Command,"`","""")
Call CreateObject("WScript.Shell").Run("CMD.EXE /S /C <""" & pStdIn & """ "& Command & " 1>""" & pStdOut & """ 2>""" & pStdErr & """""",0,False)
Do While Not fso.FileExists(pStdOut)
  WScript.Sleep 1000
Loop
Set StdOut=fso.OpenTextFile(pStdOut)
Do While Not fso.FileExists(pStdErr)
  WScript.Sleep 1000
Loop
Set StdErr=fso.OpenTextFile(pStdErr)
Do
  Do While Not StdOut.AtEndOfStream
    On Error Resume Next
    wStdOut.Write StdOut.Read(1)
    On Error GoTo 0
  Loop
  Do While Not StdErr.AtEndOfStream
    On Error Resume Next
    wStdErr.Write StdErr.Read(1)
    On Error GoTo 0
  Loop
  If AtEndOfStream(pStdOut) And AtEndOfStream(pStdErr) And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do
  WScript.Sleep 1000
Loop
StdOut.Close
StdErr.Close
fso.DeleteFile(pStdIn)
fso.DeleteFile(pStdOut)
fso.DeleteFile(pStdErr)

Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function

2008年8月22日 (金)

renameコマンドのワイルドカードの怪?

renameコマンドのワイルドカードの「仕様」が「正しく」書いてあるところがないようです。

ren 旧ファイル名 新ファイル名

旧ファイル名のワイルドカードは、普通の解釈のとおり。

新ファイル名のワイルドカードは、普通の解釈と異なる!

基本形1

abc*

左から3文字(3バイトではなく)をabcに変えて、4文字目以降は元ファイル名を変えない。

基本形2

*xyz

元ファイル名を右から探して最初のxを見つけて、そこから右をxyzに変える。
元ファイル名にxがないときは末尾に追加。

応用形1

abc*xyz

基本形1と基本形2の組み合わせ。つまり、
左から3文字(3バイトではなく)をabcに変えて、
元ファイル名の4文字目以降を右から探して最初のxを見つけて、そこから右をxyzに変える。
元ファイル名の4文字目以降にxがないときは末尾に追加。

応用形2

*xyz*

基本形2と基本形1の組み合わせ。つまり、
元ファイル名を右から探して最初のxを見つけて、そこから右をxyzに変え、それ以降は元ファイル名を変えない。
元ファイル名にxがないときは末尾に追加。

応用形3

*.xyz

とすれば拡張子をxyzに変更する。

応用形4

*.

とすれば拡張子を削除する。

ワイルドカードの仕様としては、.に普通の文字以上の特別な意味はない。
ファイル名の仕様として、最後の.は削除される。

このように、新ファイル名のワイルドカードと、旧ファイル名のワイルドカードは無関係です。
なので、旧ファイル名にワイルドカードを使わなくても、新ファイル名だけにワイルドカードが使えます。

結局、renameコマンドでは、ワイルドカードを使って文字位置の変更はできません。文字の削除や追加が可能なのは末尾だけです。
そういう場合は、for文とfor変数や環境変数の編集機能を使います。

2008年8月21日 (木)

システム標準のVBSファイルをCMD化する。

c:\windows\system32には、システム標準のVBSファイルがあります。

dir c:\windows\system32\*.vbs

これらは、cscript.exeで、フルパス指定で、呼ばねばならず、使い勝手が悪い。

cscript.exe c:\windows\system32\prnjobs.vbs -l

そこで、

hoge.cmd
---
for %%1 in ("c:\windows\system32\*.vbs") do echo @cscript.exe //nologo "%%~dpn0.vbs" %%* >>"%%~dpn1.cmd"
---
を実行すると、それぞれのVBSファイルに対応して、ラッパーのCMDファイルを作ります。

例えば、prnjobs.vbsには、prnjobs.cmd
---
@cscript.exe //nologo "%~dpn0.vbs" %*
---
中身は同じで、名前(ベース名)で対応します。

その結果、

prnjobs -l

だけで呼べるようになります。

バッチファイルの中では、

call prnjobs -l

また、c:\windows\system32以外のPATHも、同じフォルダに作れば同様です。

2008年8月17日 (日)

スクリプトから.NETのSystem.IO.StringWriterのWriteLine()を使う。

スクリプトから.NET Framework version 2.0のSystem.Text.StringBuilderのAppendLine()は、なぜか使えません。

しかし、System.IO.StringWriterのWriteLine()なら使えます。

Set sw=CreateObject("System.IO.StringWriter")
sw.WriteLine_13 "aaa"
sw.WriteLine_13 "bbb"
MsgBox sw.GetStringBuilder.ToString()

オーバロードは以下。

WriteLine()
WriteLine_2(Char value)
WriteLine_3(Char[] buffer)
WriteLine_4(Char[] buffer, Int32 index, Int32 count)
WriteLine_5(Boolean value)
WriteLine_6(Int32 value)
WriteLine_7(UInt32value)
WriteLine_8(Int64 value)
WriteLine_9(UInt64 value)
WriteLine_10(Single value)
WriteLine_11(Double value)
WriteLine_12(Decimal value)
WriteLine_13(String value)
WriteLine_14(Object value)
WriteLine_15(String format, Object arg0)
WriteLine_16(String format, Object arg0, Object arg1)
WriteLine_17(String format, Object arg0, Object arg1, Object arg2)
WriteLine_18(String format, Params Object[] arg)

2008年8月16日 (土)

スクリプトから.NETの書式指定を使って、Format()関数を代替する。

スクリプトから.NETのFormat()は使えませんが、StringBuilderのAppendFormat()なら使えます。

例えば、数字を桁区切りして、右寄せ(左埋め)するとか。

Function LPadNum(n,m)
Dim sb
Set sb=CreateObject("System.Text.StringBuilder")
sb.AppendFormat "{0," & m & ":n0}",n
LPadNum=sb.ToString()
End Function

2008年8月15日 (金)

スクリプトから.NETを使って、右寄せ(左埋め)、LPad()、PadLeft()関数を代替する。

スクリプトから.NETのString型のPadLeft()は使えませんが、StringBuilderのAppendFormat()なら使えます。

Function LPad(s,n)
Dim sb
Set sb=CreateObject("System.Text.StringBuilder")
sb.AppendFormat "{0," & n & "}",s
LPad=sb.ToString()
End Function

2008年8月14日 (木)

スクリプトから.NETを使って、文字の繰り返し関数を代替する。

文字の繰り返し関数は、VBScriptでは、String(n,c)ですが、.NETでは、String型のコンストラクタに。

このように、.NETでは、従来、言語側に実装されて来た機能が、.NET側に移っています。

なので、VBScriptやJScriptから.NETに実装された機能が利用できます。

スクリプトから.NETのString型のコンストラクタは使えませんが、StringBuilderのAppend()なら使えます。

Function Strings(n,c)
Dim sb
Set sb=CreateObject("System.Text.StringBuilder")
sb.Append Asc(c),n
Strings=sb.ToString()
End Function

2008年8月13日 (水)

地域と言語の設定に依存しない数字の桁区切り(VBScript)

同様に、VBScriptで、符号や少数点のない整数の場合、

Function NumberGroup(n,g)
Dim s
Dim a
Dim k
s=CStr(n)
ReDim a((Len(s)+g-1) \ g -1)
k=Len(s) Mod g
If k Then a(0)=Left(s,k)
For k=k+1 To Len(s) Step g
  a((k+g-2) \ g)=Mid(s,k,g)
Next
NumberGroup=Join(a,",")
End Function

2008年8月12日 (火)

地域と言語の設定に依存しない数字の桁区切り(JScript)

数字の桁区切りは、VBScriptのFormatNumber()やJScriptのtoLocaleString()で可能ですが、これらは地域と言語の設定に依存します。

依存しないようにするには自作するしかありません。

符号や少数点のない整数の場合、

function NumberGroup(n,g){
  var s=n.toString();
  var a=new Array();
  var k=s.length%g;
  if(k) a.push(s.substr(0,k));
  for(k=k;k<s.length;k+=3) a.push(s.substr(k,3));
  return a.join(",");
}

2008年8月11日 (月)

JScriptで、右寄せ(左埋め)、LPad()、PadLeft()関数は?

function LPad(s,n,c){
  return new Array(Math.max(n-s.length,0)+1).join(c)+s;
}

2008年8月10日 (日)

VBScriptで、右寄せ(左埋め)、LPad()、PadLeft()関数は?

OracleにはLPAD()、.NETには、PadLeft()がありますが、VBScript、VB6、VBAでは?

Function LPad(s,n,c)
Dim m
m=n-Len(s)
If m<0 Then m=0
LPad=String(m,c) & s
End Function

2008年8月 9日 (土)

JScriptで、文字、文字列の繰り返し関数は?

VBScriptで、文字の繰り返し関数はString(n,c)ですが、JScriptは?

function string(n,c){
  return new Array(n+1).join(c);
}

2008年8月 6日 (水)

Windows Media エンコーダを使って、DVD-VideoからWMVへ変換する。(その2)

TV録画したDVD-VideoモードのDVDから、.VOBファイルを、Zune用に[Windows Media Video 9]の.WMVファイルに変換します。

CVRで、

for %%1 in ("D:\VIDEO_TS\*.VOB") do ^
cscript.exe "C:\Program Files\Windows Media Components\Encoder\WMCmd.vbs" ^
-input %%1 ^
-output ".\%%~n1.wmv" ^
-a_setting 128_44_2 ^
-v_bitrate 736000 -v_width 320 -v_height 240 -v_preproc 1 -v_framerate 30 -v_performance 0

または、VBRで、

for %%1 in ("D:\VIDEO_TS\*.VOB") do ^
cscript.exe "C:\Program Files\Windows Media Components\Encoder\WMCmd.vbs" ^
-input %%1 ^
-output ".\%%~n1.wmv" ^
-a_setting 128_44_2 ^
-v_mode 4 -v_bitrate 736000 -v_peakbitrate 1500000 -v_width 320 -v_height 240 -v_preproc 1 -v_framerate 30 -v_performance 0

この変換時間は、-v_performanceで大きく変わります。
最短の -v_performance 0 では、変換時間が、録画時間の
CVRで、30%
VBRで、50%
くらいです。

また、このように、最初から[Windows Media Video 9]にしておけば、Syncがコピーで済みます。

2008年8月 4日 (月)

フォルダサイズを一覧表示する。

どのフォルダのサイズが大きいかを調べます。

FolderList.CMD フォルダ

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var fso=new ActiveXObject("Scripting.FileSystemObject");
var Folder=fso.GetFolder(WScript.Arguments.Count()?WScript.Arguments.Item(0):".");
var TotalSize=0;
for(var e=new Enumerator(Folder.SubFolders);!e.atEnd();e.moveNext()){
  var f=e.item();
  if(f.Name!="System Volume Information"){
    var Size=f.Size;
    WScript.Echo(LPad(Size,15),f.Name);
    TotalSize+=Size;
  }
}
for(var e=new Enumerator(Folder.Files);!e.atEnd();e.moveNext()){
  var f=e.item();
  var Size=f.Size;
  WScript.Echo(LPad(Size,15),f.Name);
  TotalSize+=Size;
}
WScript.Echo(LPad(TotalSize,15),Folder.Path);
function LPad(str,n){
  str=str.toLocaleString();
  str=str.substr(0,str.length-3);
  return new Array(Math.max(n-str.length,0)+1).join(" ")+str;
}

2008年8月 3日 (日)

FileInfo.MediaInfo.VBS (その2)

頑張って、文字化けを補正しました。

FileInfo.MediaInfo.VBS メディアファイル

Option Explicit
Dim FileInfo
Dim File
Dim re
Set re=New RegExp
re.Pattern="^(  形式: )(....)$"
re.MultiLine=True
Set FileInfo=CreateObject("FileInfo.MediaInfo")
For Each File In WScript.Arguments
  FileInfo.FileName=File
  WScript.Echo re.Replace(FileInfo.MediaInfo,GetRef("replaceFunc"))
Next
Function replaceFunc(matchedString,subMatch1,subMatch2,matchPos,source)
replaceFunc=submatch1 & Chr(AscB(MidB(submatch2,1,1))) & Chr(AscB(MidB(submatch2,3,1))) & Chr(AscB(MidB(submatch2,5,1))) & Chr(AscB(MidB(submatch2,7,1)))
End Function

2008年8月 2日 (土)

FileInfo.MediaInfo.VBS

Windows Media Encoderが扱うファイルのメディア情報を表示します。

FileInfo.MediaInfo.VBS メディアファイル...

Option Explicit
Dim FileInfo
Dim File

Set FileInfo=CreateObject("FileInfo.MediaInfo")
For Each File In WScript.Arguments
  FileInfo.FileName=File
  WScript.Echo FileInfo.MediaInfo
Next

出力例
---------------------------
ファイル名: VTS_01_1.wmv

  ファイルの長さの合計: 3466.37 s

オーディオ:
  サンプリング レート (Hz): 44100
  チャンネル数: 2
  サンプルあたりのビット数: 16

ビデオ:
  幅: 320
  高さ: 240
  フレーム レート: 30.00
  形式: W??3
  ビット/ピクセル: 24
  フレーム数: 103991
---------------------------

形式の中2文字は文字化けです。(障害)
WMV3のunicodeのW_M_V_3_がW_MVV33_に化けてます。_はChrB(0)。
なので、頑張れば、補正できます。

« 2008年7月 | トップページ | 2008年9月 »