2014年1月19日日曜日

@echo off

set WKF=_work.txt

dir /s /a-d /w . | findstr "個の" > %WKF%

for /f "usebackq tokens=3" %%A in (`
find /c /v "" %WKF%
`) do set /a LC=%%A - 2

for /f "skip=%LC% tokens=1,2,3" %%A in (
%WKF%
) do call :SUB1 "%%A" "%%C"

del %WKF%

echo ファイル = %NUMF1%
echo 使用量 = %NUM1%

goto :EOF


:SUB1
set NUMF=%~1
set NUMF1=%NUMF2%
set NUMF2=%NUMF%
set NUM=%~2
set NUM1=%NUM2%
set NUM2=%NUM%


■test2.bat
test2.bat test\test.txt
とすることによってファイル内の文字を行毎に表示する。
また、デスクトップにショ-トカットを置き、
そこへファイルをドロップすることによっても同様の結果を得る。
@echo off
echo ------START------
for %%V in (%1) do (
type %%V
)
echo ------END--------
pause

■連結
@echo off
set ZIP_FILE_LIST=zip_file_list.txt
echo ------START------
echo %~a1 | find "d">NUL
if %ERRORLEVEL% EQU 0 (
dir /B /O %1\*.zip.0>%1\%ZIP_FILE_LIST%
) else (
echo 複数に分割された集約ファイルの格納されているディレクトリを指定してください。
goto END
)

for /F "delims=" %%i in (%1\%ZIP_FILE_LIST%) do (
echo %%~niファイルへと連結しました。
)

del %1\%ZIP_FILE_LIST%

:END

echo ------END--------
pause

■WSH

vt1.vbs
Wscript.Echo "メッセージを表示します"

コマンドプロンプトから
cscript vt1.vbs //nologo

http://www.atmarkit.co.jp/ait/articles/0401/15/news084_2.html

■WSHリファレンス
http://msdn.microsoft.com/ja-jp/library/cc364460.aspx



■if /A == /%EV% ( echo EV=A ) else echo EV != A
とすると、環境変数EVの値が“A”のときには、“echo EV=A”が実行され、
そうでないとき(未定義の場合も含む)は、else以降のコマンドが実行される。
ここで、条件部分の左右の辺の先頭に“/”が含まれているが、
これは、EVが未定義のときの対策である。
今回はスラッシュを使ったが、実際には、ほかの文字でもかまわない。
“==”の両辺の式をダブルクオート(“ ”)で囲むスタイルを使う人もいる
(C言語などの文字列のスタイルにならっている)。



基本的には、usebackqを必ず指定することにして、ファイル名は必要に応じてダブルクォート記号で囲み、コマンドならばバッククォート、文字列ならシングルクォート記号で囲む


記号 なし ダブルクォート シングルクォート バッククォート
usebackqなし ファイル名 文字列 コマンド バッククォート記号を含むファイル名
usebackqあり ファイル名 ファイル名 文字列 コマンド
usebackqコマンドとファイル・セット指定の関係

for /F "usebackq delims=" %%i in ("%~1\%ZIP_FILE_LIST%") do (
echo %%~niファイルへと連結しました。
)

■指定フォルダのアレやアレで始まるファイルのリストを作成する

@echo off

set DIR_PATH=%~dp1
echo %DIR_PATH%

set WKF=__work.txt

dir /b /a-d "%DIR_PATH%%~1" | findstr /B "q." > %DIR_PATH%%WKF%
dir /b /a-d "%DIR_PATH%%~1" | findstr /B "w." >> %DIR_PATH%%WKF%

或いは、空白で繋げる

dir /b /a-d "%DIR_PATH%%~1" | findstr /B "q. w." > %DIR_PATH%%WKF%

rem del


■指定フォルダの下を全て取得する為にリストを作るが、特定フォルダ下のみ外す
外すディレクトリを"tes t"だとすると、

dir /s /b /a-d . | findstr /V /C:"tes t"


■指定フォルダの下を取得するにあたり、特定フォルダ下を除外する、というリストを作成
@echo off

set TARGET_PATH="C:\usr\command\tes t\trr"

echo %TARGET_PATH%

set DIR_PATH=%~dp1
echo %DIR_PATH%

set WKF=__work.txt

echo "%~f1"

echo ---
dir /s /b /a-d "%~f1"
echo ---

dir /s /b /a-d "%DIR_PATH%" | findstr /IV /C:%TARGET_PATH%

※ディレクトリを指定する際、最後に\を付けなければならない。

■指定フォルダが、特定フォルダ下に存在しないことの確認
@echo off

set TARGET_PATH="C:\usr\command\tes t"
set DIR_PATH=%~dp1
set WKF=__work.txt

dir /s /b /a-d "%DIR_PATH%" | findstr /I /C:%TARGET_PATH% > %WKF%
call :size_check %WKF%
if %WORK_FILE_SIZE% EQU 0 goto file_not_find
echo 取得処理を行う

:file_not_find
goto :EOF

:size_check
set WORK_FILE_SIZE=%~z1
goto :EOF


2014年1月13日月曜日

Linux

if [ 条件1 ]
then
  処理1
elif [ 条件2 ]
then
  処理2
else
  処理3
fi


case 変数 in
   パターン1) 処理;;
   パターン2) 処理;;
   パターン3 | パターン4) 処理;;
   *) 処理;;
esac

「;;」は「case文を抜ける」という意味です。
「*)」は「いずれのパターンにもあてはまらない場合」という意味で、省略可能です。
パターンを「 | 」で区切って論理和(or)をとることもできます。
また、パターンには正規表現が使えます。

while [ 条件 ]
do
  処理
done

ファイルを1行毎に読み込んで処理させたい場合は、以下のような構文になります。
「line」は変数であり、指定したファイルを1行毎に読み込んで順次「line」に格納されます。
ファイルの終端(EOF)まできたら「while」を抜けます。
while read line
do
  処理(${line}を処理)
done < ファイル

算術演算子 意味
a + b aとbの和
a - b aとbの差
a \* b aとbの積
a / b aとbの商
a % b aとbの剰余


数値評価演算子 意味
数値1 -eq 数値2 数値1と数値2が等しい場合に真
数値1 -ne 数値2 数値1と数値2が等しくない場合に真
数値1 -gt 数値2 数値1が数値2より大きい場合に真
数値1 -lt 数値2 数値1が数値2より小さい場合に真
数値1 -ge 数値2 数値1が数値2より大きいか等しい場合に真
数値1 -le 数値2 数値1が数値2より小さいか等しい場合に真


文字列評価演算子 意味
文字列 文字列の長さが0より大きければ真
-n 文字列 文字列の長さが0より大きければ真
! 文字列 文字列の長さが0であれば真
-z 文字列 文字列の長さが0であれば真
文字列1 = 文字列2 2つの文字列が等しければ真
文字列1 != 文字列2 2つの文字列が等しくなければ真


ファイルチェック演算子 意味
-d ファイル名 ディレクトリなら真
-f ファイル名 通常ファイルなら真
-L ファイル名 シンボリックリンクなら真
-r ファイル名 読み取り可能ファイルなら真
-w ファイル名 書き込み可能ファイルなら真
-x ファイル名 実行可能ファイルなら真
-s ファイル名 サイズが0より大きければ真
ファイル1 -nt ファイル2 ファイル1がファイル2より新しければ真
ファイル1 -ot ファイル2 ファイル1がファイル2より古ければ真

if文やwhile文で、複数の条件を結合(AND,OR)して評価したい場合は、以下のように記述します。

論理結合演算子 意味
! 条件 条件が偽であれば真
条件1 -a 条件2 条件1が真、かつ、条件2が真であれば真
条件1 -o 条件2 条件1が真、または、条件2が真であれば真

#!/bin/sh
while getopts l:t: opt
do
  case ${opt} in
  l)
   LIST=${OPTARG};;
  t)
   TYPE=${OPTARG};;
  \?)
   exit 1;;
  esac
done
echo "LIST=${LIST}"
echo "TYPE=${TYPE}"

$ getopts.sh -l list -t type
LIST=list
TYPE=type
$

ファイルの内容をクリアする。
cat /dev/null > abc.log
または、
:> abc.log

PARA2=string
echo "PARA2 = ${PARA2}"

変数 意味
$$ シェル自身のPID(プロセスID)
$! シェルが最後に実行したバックグラウンドプロセスのPID
$? 最後に実行したコマンドの終了コード(戻り値)
$- setコマンドを使って設定したフラグの一覧
$* 全引数リスト。"$*"のように「"」で囲んだ場合、"$1 $2 … $n" と全引数を一つにくっついた形で展開される。
$@ 全引数リスト。"$@"のように「"」で囲んだ場合、"$1" "$2" … "$n" とそれぞれの引数を個別にダブルクォートで囲んで展開される。
$# シェルに与えられた引数の個数
$0 シェル自身のファイル名
$1~$n シェルに与えられた引数の値。$1は第1引数、$2は第2引数…となる。

rem 不要なファイルを再帰的に検出して削除
for /F "usebackq" %%i in (`dir /s /b /a-D ^| findstr /V ".*\.html$" ^| findstr /V ".*\.css$" `) do (
  rem 削除確認しながら削除
  del /P %%i
)

rem ファイルがあれば削除
if exist %TMP_FILE_NAME% ( del %TMP_FILE_NAME% )


rem カレントフォルダを変数に保持
for /F "usebackq" %%i in (`cd`) do (
  set BAT_DIR="%%i"
)
rem 変数の内容を表示
echo %BAT_DIR%

set today_YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%

set now_HHmmSS=%time:~0,2%%time:~3,2%%time:~6,2%


スリープ
5秒待つ:
ping localhost -n 5 > nul


2014年1月5日日曜日

cmd.exe /k "コマンド"

help if

殊なラベル名として“:EOF”がある(ほかのラベルと違って、先頭にコロンが付いていることに注意。すべて小文字で“:eof”としてもよい。EOFはEnd Of Fileの略)。これは、スクリプトの最後の部分を表すもので、処理を終了させる場合の飛び先として利用できる(実際に“:EOF”ラベルをプログラムの最後に置く必要はない)。

for %%代入変数名 in (代入値1 代入値2 代入値3……)do 実行文

for %i in (*.txt) do type %i
“do”以下には、実行するコマンドを記述する。全体を括弧でくくることで複数のコマンドを記述することも可能だ。

スクリプト内では%%となる。
for %%i in (file01.txt file02.txt file03.txt) do type %%i

内容表示:
type tetxt.txt

for %%i in (01 02 03) do type File%%i.txt


for %%i in (01 02 03) do ren File%%i.txt >>ADD.TXT
あるいは、
for %%i in (*) do type %%i >>ADD.TXT
とすることで、すべてのファイル内容を1つのファイル(この例ではADD.TXT)に結合できる。

ディレクトリのみを出力。
for /d %%i in (*) do echo %%i

ディレクトリのみを再帰的に出力。
for /r /d %%i in (*) do echo %%i

if /A == /%EV% ( echo EV=A ) else echo EV != A
今回はスラッシュを使ったが、実際には、ほかの文字でもかまわない。“#”を使う人もいるし、“==”の両辺の式をダブルクオート(“ ”)で囲むスタイルを使う人もいる(C言語などの文字列のスタイルにならっている)。

find "name" text.txt

dir | find /v "ボリューム" | find /v "のディレクトリ" | find /v "個のファイル"