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

2011年5月26日木曜日

FOR文のINに|(パイプ)を含んだコマンドの出力結果を指定する方法

こちらへ
http://starmine.jp/?p=44

2011年5月24日火曜日

””とwindowsコマンドライン

&(アンパサンド)とwindowsコマンドラインの所で、「&」がパスに入ったせいで誤動作が起こったという事案を載せましたが、こちらもそれにからんだ内容です。

実は、パスを””で囲んでいれば、間に「&」が入っていても単なる文字列として扱われるため前記事のような自称は起きません。

今回使用したバッチでも””を使用していましたが、その使い方が間違っていたことが実は根本的な原因です。

一部を記載します。

↓の場合、カレントフォルダパスが「×××\aaa&bbbの場合」、「×××\aaa」が作成され、その配下にファイルがコピーされます。
---------------------------------------------------
1 SET MOTO1_DIR="H:\MCWEL_COM\MCWEL000\dsp\affair"
2 SET SAKI1_DIR=%~dp0dsp\affair
3 MkDir %SAKI1_DIR%
4 XCOPY "%MOTO1_DIR%" "%SAKI1_DIR%" /S /E /q
---------------------------------------------------

ちなみに、2行目と3行目の間に、ECHO SAKI1_DIR を入れると、ちゃんと「×××\aaa&bbb」が表示されます。
ですが、3,4行目で引数として使われる場合、””がうまく働かないようで、上記のような現象が起こります。

うまくいくパターンはこちらです。みなさまご注意を。
---------------------------------------------------
1 SET MOTO1_DIR="H:\MCWEL_COM\MCWEL000\dsp\affair"
2 SET SAKI1_DIR="%~dp0dsp\affair"
3 MkDir %SAKI1_DIR%
4 XCOPY "%MOTO1_DIR%" %SAKI1_DIR% /S /E /q
---------------------------------------------------

ちなみに、一度やってしまいましたが↓はうまくいきません。
---------------------------------------------------
1 SET MOTO1_DIR="H:\MCWEL_COM\MCWEL000\dsp\affair"
2 SET SAKI1_DIR="%~dp0dsp\affair"
3 MkDir %SAKI1_DIR%
4 XCOPY "%MOTO1_DIR%" "%SAKI1_DIR%" /S /E /q
---------------------------------------------------

理由は、まぬけすぎて恥ずかしくて大きな声では言えません(*ノДノ)

&(アンパサンド)とwindowsコマンドライン

これまで複数のバージョンのPKG適用する場合、出荷資産を入れるフォルダを「000_L08-L10一括」のように「連番+バージョン+"-"+バージョン+"一括"」という名前で作成していました。

が、今回久しぶりに2バージョンの適用だったため、「-」ではなくて「&」だなと思い、
「41_HOPL01&L02一括」と命名しました。

が、一発目の適用で資産退避用のバッチが変な動き(記載と違うパスにコピー)をする・・・(汗)

調査した結果、コピー先が"××\○○\41_HOPL01&L02一括"ではなく、"××\○○\41_HOPL01"になっていました。

原因は、パスが「&」によってぶった切られていたことでした。
Linux系列のコマンドでは"&"は文字列ではなく、コマンドラインの区切りを意味する文字として判定されるようです。

資産持ち帰り用バッチファイルなどで「%~dp0」(コマンドファイルのカレントディレクトリ取得)を使用しているため、バッチ自体は変わらなくても、親フォルダが変わることでこの現象が発生しました。

windowsコマンドでは使ってはいけない恐ろしい文字達がたくさんいますが、こいつは一番強烈ですのでご注意を。
なんせ、普通に動きますからね。見落とす可能性ありです。
検証漏れ(汗)というか、そんな危険な文字は使わないようにしましょう。

ちなみに、ソースの根本的な間違いは””の使い方のミスです。
””でちゃんと囲めばいいじゃんと思った方、ナイスです(・∀・)

2011年5月18日水曜日

windowsコマンド(バッチ)で階層構造の分析を行う

簡単な階層構造をもったファイルを分析して、必要な行を抽出する方法。
普通のプログラムであれば、FORをまわしながら1階層目の文字が見つかったら、2階層目の文字をチェックするという処理にすると思いますが、windowsコマンドではFORを階層化すると遅延環境変数のせいで記載方法が色々めんどくさい。
というわけで、ファイルを解析して必要な部分を切り出し、その中を検索するという方法で該当行を抽出する。
【お題】
以下のようなファイルから、X階層でかつ"a"を含んだ行を抽出する。

【ファイル内容】

Y
abc
def
X
ade
bfg
Z
aef
vhj
【コマンドファイル】

以下のコマンドは
1.Xが何行目に出てくるか調べる。
2.Xまでの行を省いた結果をテキストに出力する。
3.出力したテキストからaが含まれている行を抽出する。
という流れで処理を行っています
--------------------------------------------------------
@ECHO OFF
setlocal enabledelayedexpansion
findstr /N "X" C:\Users\hogehoge\Desktop\test.txt>out.txt
pause
FOR /F "delims=: " %%I IN (out.txt) DO (
SET GYO=%%I
)
ECHO %GYO%行目
pause
FOR /F "skip=%GYO%" %%I IN (C:\Users\n0155\Desktop\test.txt) DO (
ECHO %%I>>out2.txt
)

TYPE out2.txt|FIND "a"
endlocal
pause
--------------------------------------------------------


【出力結果】
ade
aef
この結果をテキストに出力して1行目を取得すればOK。
aの行が複数ある場合は、別で

2011年5月15日日曜日

コマンド(バッチ)ファイルの出力結果を絞る

Windowsコマンドで実行した結果を簡単に加工する方法。
指定した文字の含まれた行を抽出します。
ログファイルの分析とかでよく使うかな。

(コマンド) |FIND "文字列"


【使用例】
○DIRでディレクトリだけ出力したい場合
(コマンド)
DIR |FIND "<DIR>"
(結果)
2011/05/14 00:22 <DIR> Desktop
2010/12/30 14:55 <DIR> Documents
2011/05/07 13:02 <DIR> Downloads
2010/07/15 06:42 <DIR> Favorites




○DIRでディレクトリだけ出力したい場合
(コマンド)
DIR |FIND "<DIR>"
(結果)
2011/05/14 00:22 <DIR> Desktop
2010/12/30 14:55 <DIR> Documents
2011/05/07 13:02 <DIR> Downloads
2010/07/15 06:42 <DIR> Favorites




○テキストファイルの必要な行だけ表示
(コマンド)
TYPE sample.txt |FIND "エラー"
(結果)
○○エラー
△△エラー
□□エラー


応用で、FIND /Vにすると見付かった行数が出るので、
TYPE sample.txt |FIND /V "エラー"で上の例だと「3」が表示されます。

2011年4月29日金曜日

【windowsコマンド】FINDSTR

findstrでディレクトリ内のファイルを一括して検索したいとき。
引数の設定方法で困った・・・( "T 3T゛)ノ

NG


FINDSTR /N /S "txtHdSyokaiNnd"

OK


FINDSTR /N /S "txtHdSyokaiNnd" *.java


対象ファイルを絞り込む為の条件(もしくはファイル名)を入れないといけない。
※ちなみにFindは正規表現は使えない。

しらんがな(゚Д゚)

2011年4月15日金曜日

javaでコマンドファイルを実行し、終了まで待機する。

javaでコマンドファイルを実行し、終了まで待機する場合、返ってくるProcessオブジェクトのwaitFor()メソッドで値が返ってくるのを待つ。


waitを使って監視しなくてもいいので楽かな。


------------------------------------------------------------------------------------------
        try {
            String[] cmd = new String[1];
            cmd[0] = "c:\\hoge.cmd”


            Runtime rt = Runtime.getRuntime();


            rt.exec(cmd);
            Process proc = rt.exec(cmd);
                //結果が返ってくるまで待つ。
                int exitValue = proc.waitFor();
                if (exitValue == 0){
                 return true;
                }
        }
        catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
e.printStackTrace();
}




------------------------------------------------------------------------------------------

Runtimeのexecコマンドは別プロセスを生成して処理を実行するので、コマンドの結果をもとに処理を行う場合はこの方法を使う。



2011年4月9日土曜日

ps1ファイルの実行方法(Poweshellファイル)


windows7/windwsserver2008R2以降で標準装備されているPowerShellコマンド。

.NETフレームワークのライブラリを直接呼び出せるなどかなり強力なスクリプトとなっています。
呼び出し方法

以下の2通り
・「スタート⇒すべてのプログラム⇒管理ツール⇒Windows PowerShell Modules」を実行
・ファイル名を指定して実行で「powershell」を実行

でもやっぱりコマンドファイルと同じようにファイルから直接実行したい。
というわけで、powershellコマンドファイルとして登録されている拡張子「ps1」の登場です。

これを右クリックすると「PowerShwell」で実行というメニューがあり、これを選択すると実行できます。
※左ダブルクリックではメモ帳が起動するようになっています。

…が、このスクリプト、かなり強力でかつ管理用機能として用意されているらしくかなり厳しいポリシーが設定されています。
というわけで、まず「スクリプト実行ポリシー」の設定が必要になります。
実行ポリシー設定方法
powershellのコマンド入力画面で"Set-ExecutionPolicy RemoteSigned"を実行します。
※ポリシーの意味:インターネット経由でダウンロードしたスクリプトのみ証明書を要求
但し!このコマンドを実行するためには管理者特権が必要となります。
なのでスタートメニューのリンクから「管理者として実行」を選択して起動し、そこでこのコマンドを打ち込む必要があります。

この設定がおわれば無事、ps1ファイルを実行することができます。


※Powershellはちゃんとヘルプコマンドがあります。

2011年4月5日火曜日

ファイル名を指定して実行する際のユーザ権限設定方法

ファイル名を指定して実行する際に、実行ユーザ権限を変更してコマンドを呼び出す方法です。

Windows Vista以降のOSで管理系のツールを呼び出す際に管理者特権が必要な場合があります。
ドメインユーザにadministrator権限を与えてもうまく実行できない場合、ローカルのadministratorユーザで実行すればうまくいく(ことがあるかも…)

やり方
ファイル名を指定して実行する際、

runas /user:administrator (コマンド内容)
※administrator以外のユーザも選択できます。


例)odbcの設定変更ツール呼び出し時
runas /user:administrator odbcad32

たぶんバッチもうまくいきます。

2010年12月9日木曜日

【困ったときのwindowsコマンド】for文

繰り返し処理で使うのがFOR文。といっても、テキストの読み込みに使うのが一番多いかも。
基本はこんな感じ

【sample.txt】

あああ
いいい
ううう


【run.bat】

IF /F %%I IN (sample.txt) DO (
ECHO %%I
)

(説明)

/F
 ⇒ファイル、文字列を読み込むときのパラメタ
%%I
 ⇒この変数の中に一行ずつ値が入る。
sample.txt
 ⇒読み込むファイルパス



【実行結果】
あああ
いいい
ううう


実は、微妙な構文ミスで結構エラーが出やすい。
※構文ミスっていると処理がIF文に入った瞬間に実行画面が閉じる。

以下の点はミスりやすいので注意
1.ファイルパスに空白が入っている。
 ⇒この場合は、「'」でファイル名を囲む。「"」で囲むとファイル名ではなく文字列として認識されるので注意(例の場合sample.txtが表示される)
2.「IN」と「(」がくっついている。
 半角空白を入れないとダメ
3.「DO」と「(」がくっついている。
 2.と同じく半角空白を入れないとダメ


2.3.ははまったなあ・・・

【困ったときのwindowsコマンド】変数の保持

職業柄、客先の端末でログファイルなどのテキストを解析しないといけない!でも目視確認はめんどくさい!
そんなんやってられるか!
なんか楽な方法はないのか!
ということで、ツールやランタイムの充実していない客先での作業で頼るようになったのがwindowsコマンド

基本的に客先にwindowsがないということは100%ない。
客先で処理待ち時間とかに作れるし、リファレンスも充実(helpコマンド)なのでいつでも修正可能(≧∀≦)

とはいえ、使い方を工夫しないとたいしたことはできないし、使わないとすぐに忘れるし・・・

というわけで、今のうちに少しずつまとめとこう。


【変数の使い方】
変数の保持の仕方には2パターンある。
一つは、メモリ上に保存する方法

PATH 変数名={値}

ECHO %変数名%


これは%変数名%と書けばそのまま{値}に入れ替わる。


二つ目は、テキストにはく方法

ECHO {値} >{ファイル名}

FOR /F %%I IN ({ファイル名}) (
ECHO %%I
)


※どちらも結果に{値}が表示される

二つ目は変数の保持の仕方ってのとはニュアンスが違うかもしれないけれど、
単純にPATHで変数に代入することができない場合や複数の変数を同時に扱いたい場合などに重宝する。
処理途中の値が残るので、エラーが出たときに追いやすいしうまく作ればそのファイル自体がログになったりする。

もちろん場合によって使い分ける必要があるけど、両方知っておかないとなかなか思い通りのコマンドファイルは作れないので、忘れないようにしとこう。

【困ったときのwindowsコマンド】IF文によるnull判断

バッチファイルで変数に入っている値によって処理を分けたいときIF文を使う。
ただ、変数を使った場合変数がnull(0文字の文字列)の可能性がある場合注意が必要になる。



SET /P para==Hello>>

IF %para%==Hello DO ECHO "How are you?"

pause


上のソースの場合、「こんにちは>>」に対してこんにちはを入力してEnterを押すと
ごきげんいかがですか?が表示され、それ以外の文字列が入力されていれば何も表示されずにpuse処理まで進む。
しかし、何も入力せずにEnterを押されると、構文エラーで落ちる。

なぜかというと以下のような処理になるから


SET /P para=
IF ==Hello DO ECHO "How are you?"

pause

変数の中身がnullやと、IFの比較条件の片方がないということになってしまうらしい。
これでは、逆にnullの場合は~という処理が書けない事になる。

解決方法は以下の通り


SET /P para=Hello>>

IF %para%_A==Hello_A DO ECHO "How are you?"

pause

IFの比較条件の両方に_Aなどの関係ない文字列を付加する。これによって、変数がnullでも

SET /P para=Hello>>

IF _A==Hello_A DO ECHO "How are you?"

pause

となって処理は正常に進むこととなる。
※もちろん変数にHelloが入っていればHello_A==Hello_Aで"How are you?"が表示される。


はまったなぁ・・・

2010年11月21日日曜日

Go言語で日本語表示

Go言語のソースファイルはUTF-8で作成しますが、コマンドで日本語を表示する処理を実行すると文字化けします。

なので、まずコマンドプロンプトの文字コードをUTF-8に変更する必要があります。
変更用のコマンドは以下の通り

chcp 65001
※数値はUTF-8を示す値

ちなみに起動用のバッチに上記のコマンドを組み込もうとしたけど、chchpが実行された瞬間に落ちる。
別ウインドウが開いて処理が終わるっぽいけど、いまいちうまいやり方がわからない。分かったらまたメモします。