ラベル windows の投稿を表示しています。 すべての投稿を表示
ラベル windows の投稿を表示しています。 すべての投稿を表示

2018年1月18日木曜日

BATファイルでエラー出力(引数チェックなど)

Windowsのバッチファイルでエラーメッセージを標準エラー出力に出す方法。以下で"ERROR!!"が標準エラー出力に出るようになる。
echo ERROR!! 1>&2
例えば以下のように書いておけば、バッチの引数がなかった時にエラーメッセージを出してエラーレベルを1にして終了する。
if "%1"=="" (
  echo Usage: mybat.bat {param}... 1>&2
  exit /b 1
)
実行結果
C:\>mybat.bat
Usage: mybat.bat {param}...

C:\>echo %ERRORLEVEL%
1

2016年9月2日金曜日

WindowsでUUIDを作る

プログラムを作っているとテストデータとしてUUIDを作りたいことがたまにある。 Windowsの場合、VisualStudioをインストールしていればguidgen.exeとツールが付属しているのでそれを使うことができるが、インストールしていない環境でもPowerShellを使って出力できる。PowerShellから以下のコマンドをたたく。
[System.GUID]::NewGuid().ToString()
コマンドプロンプト派の人は、PowerShellを起動するまでもなく以下で。
@powershell "[System.GUID]::NewGuid().ToString()"
ほかにはWSHを使ってもできると思うけどコマンドラインから直接できるかどうかは不明。

2016年6月15日水曜日

BATファイル CSVの読み込み

WindowsコマンドプロンプトのバッチファイルでCSVファイルを読み込んで逐次処理をするにはfor文を使う。 たとえば、次のようなカンマ区切りのCSVファイルがあったとする。 列は3つあり、1行目は列名のヘッダである。

品目,単価,個数
りんご,98,10
みかん,30,20
キウイ,78,30

このCSVを読み込んで表示するバッチは以下のようになる。

for /f "skip=1 tokens=1,2,3* delims=," %%i in (data.csv) do (
    echo 品目=%%i 単価=%%j 個数=%%k
)
このバッチはCSVファイルdata.csvを開き各行をを順次for文で処理する。 for文にオプションskip=1 を付け1行目のヘッダ行は無視するようにする。 また、列が3つあるのでtokens=1,2,3*を指定している。このとき読み込んだ列はそれぞれ変数%%i, %%j, %%kに入る。for文に指定しているのは%%iだけだが、forの仕様としてi,j,k...のアルファベット順の変数に列の値が自動で入る。 列の区切り文字はdelims=, オプションで指定する。

このバッチで先のCSVファイルを読み込むと次のような感じになる。

C:\Temp>readcsv.bat
品目=りんご 単価=98 個数=10
品目=みかん 単価=30 個数=20
品目=キウイ 単価=78 個数=30

データ中にカンマが入っているとそこが区切りと認識されるのでこの方法ではうまく動かないが、 簡単にCSVファイルを処理したい場合は十分役立つのではと思う。

2013年1月23日水曜日

BATファイル 直近のファイルを残して古いファイルを消す

Windowsコマンドプロンプトのバッチファイルで直近のファイルを残して古いファイルを消すにはforを使うとよい。 以下はC:\Tempにあるzipファイルのうち直近5個を残して古いものから削除する例である。
for /f "skip=5" %%i in ('dir /b /o-d C:\Temp\*.zip') do (
    del C:\Temp\%%i
)
dir /b /o-d ~ でファイルを新しい順にリストしそれを順次for文で処理する。 for文に skip=5 を付けているので、リスト先頭から5行、つまり最新のzipファイル5つは無視し、後は del で消すという意味になる。%%iにはファイル名のみが入りパスは入らないので、delするときに改めて指定する必要があることに注意。

2011年1月6日木曜日

xcopyでフォルダごとコピー

コマンドラインでのフォルダコピーにはWindows VISTA以降であればrobocopyを使うのが便利だが、XP以前ではxcopyしか標準では使えないので、まだまだ使う機会が多い。

やりたいこと
フォルダ srcdir の内容全部を、フォルダ destdir にコピーする。
フォルダ destdir はまだ存在しない。

コマンド
xcopy /i /s /e /h srcdir destdir


ここで指定したオプションは以下のとおり、xcopy /? で出力される説明だとわかりにくいがおおむね以下のとおりである。

  • /i : コピー先フォルダがなければ作る
  • /s,/e : セットで使うとフォルダツリー全体をコピーする
  • /h : 隠しファイル(.svnなど)もコピーする



自分が使うパターンはこれしか無いのだが、つけるオプションを忘れがちなのでここにメモ。


おまけ robocopy編
最初にも書いたが、Windows VISTA以降であればrobocopyを使うのが便利だと思う。個人的には次の2つのパターンをよく使う。どちらもsrcdirからdestdirにフォルダを丸ごとコピーする。オプションはxcopyと似ているが若干異なる。

(1)destdirに重ね書きする
srcdirにあってdestdirにもあるファイルやフォルダは上書き、srcdirに無くてdestdirにあるものは残る。
robocopy /s /e srcdir destdir


(2)srcdirとdestdirを同期
destdirの内容をsrcdirと同一にする。srcdirにあってdestdirにもあるファイルやフォルダは上書き、srcdirに無くてdestdirにあるものは消す。rmdirとxcopyを使えば同等のことはできるが、robocopyは差分でコピーするので速い。
robocopy /mir srcdir destdir