LoginSignup
9
8

More than 5 years have passed since last update.

tee コマンド for windows

Posted at

職場に酷いスクリプトがあったのでカッとなって作った。

おそらく監視ツール(JP1?)が標準出力を記録するからという理由で標準出力に出したい勢力と、従来通り実行ログに落としたいという勢力の妥協点だと思われる。

ヘッダは man のパクリです。

' ==================================================================================================
' 名前
'   tee - 標準入力から読んだ内容を標準出力とファイルに書き出す
' 
' 書式
'   tee [/a] [/append] [file...]
'   tee [/?] [/help] [/version]
' 
' 説明
'   tee コマンドは標準入力を、標準出力と引数で与えられた全てのファイルとにコピーする。
'   何らかのデータをパイプに送るとき、同時にそのコピーを保存しておきたいときに便利だろう。
'   存在しないファイルに書き出そうとすると、このファイルは作成される。もしすでに存在しているファイルに
'   書き出そうとすると、 /a オプションを使わない限り、以前の内容は上書きされる。
' 
' オプション
'   /a, /append
'       ファイル内容を上書きせずに、標準入力をファイルに追加する。
'   /?, /help
'       標準出力に使用方法のメッセージを出力して正常終了する。
'   /v, /version
'       標準出力にバージョン情報を出力して正常終了する。
' 
' 注意
'   動作には .NET Framework 1.1 以上(System.Collections.ArrayList) が必要
' 
' ==================================================================================================

option explicit

' =========
' parameter
' =========
dim iomode
iomode = 2 ' for writing


' ===============
' parse arguments
' ===============
dim i, arg
i = 0
do while i < WScript.Arguments.count
    arg = WScript.Arguments.Item(i)
    if left(arg, 1) <> "/" then exit do
    select case arg
    case "/a", "/append"
        iomode = 8 ' for appending
    case "/?", "/help"
        call WScript.Echo("tee - 標準入力から読んだ内容を標準出力とファイルに書き出す")
        call WScript.Echo("使用法: tee [option]... [files]...")
        call WScript.Quit(0)
    case "/v", "/version"
        call WScript.Echo("tee version 0.1")
        call WScript.Quit(0)
    end select
    i = i + 1
loop


' ==========================
' get file objects to output
' ==========================
dim fso, file, files
set fso = CreateObject("Scripting.FileSystemObject")
set files = CreateObject("System.Collections.ArrayList")
do while i < WScript.Arguments.Count
    arg = WScript.Arguments.Item(i)
    on error resume next
        set file = fso.OpenTextFile(arg, iomode, true)
        if err.number <> 0 then
            call WScript.StdErr.WriteLine("[" & err.number & "] " & err.description & "'" & fso.GetAbsolutePathName(arg) & "'")
        else
            call files.Add(file)
        end if
    on error goto 0
    i = i + 1
loop


' ================================
' output stdin to stdout and files
' ================================
dim stdin, line
set stdin = WScript.Stdin
do while not stdin.AtEndOfStream
    line = stdin.ReadLine()
    call WScript.Echo(line)
    for each file in files
        call file.WriteLine(line)
    next
loop
9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8