連続で処理したいので、xargsっぽい動作をするbatを作ってみた


ファイルを順番に7zにかけたいので、unixのxargsっぽい動作をするbatを作ってみた。

↓これを xargs.bat として保存してください。

@echo off
rem 引数が無いとき
if "%~1"=="" (
echo Unixのxargs -0 -i と似たような動作をするプログラム.
echo usage:
echo.
echo dir /b *.txt ^| %0 command
echo dir /b *.txt ^| %0 command "{}"  //{}が置換される。
echo dir /b *.txt ^| %0 command "{}.txt" "{}"  //{}は複数回置換される。
echo.
echo dir /b *.txt ^| %0 echo command "{}"  //Unix xargs -t のかわりにどうぞ。
exit/b 1
)

setlocal ENABLEDELAYEDEXPANSION
set COMMAND=%*

for /f "delims=" %%i in ('findstr .*') do call :exec %%i
exit/b

:exec
set REP=%*
if "%REP%"=="." exit/b
if "%REP%"==".." exit/b

rem REPLACE {} 
set COMMANDEX=!COMMAND:{}=%REP%!

rem DEBUG
rem echo %COMMANDEX%

rem EXECUTE!!
%COMMANDEX%
exit/b


で、こんなふうに使います。
現在ディレクトリにある *.foo を 7z で圧縮します。

dir /b *.foo | xargs 7z "{}.7z" "{}"


ようするに、 Unix(Linux)系でいう、↓と同じような処理です。
(ただし、windowsのdirの仕様上、サブディレクトリまでは見に行きません。 dir /s オプションはちょっと勝手が違うかも・・・?)

find . -name "*.foo" -print0 | xargs -0 -i 7z {}.7z {} 

このスクリプトは、hishidamaさんのスクリプトを改造して作ってます。
http://www.ne.jp/asahi/hishidama/home/tech/windows/cmd/xargs.html