Perl,VB,Javaスクリプト,BAT

指定桁数 出力(Perl Script)
#6桁目から251バイト出力(桁数は0から始まります)
while(<>){
  chop if( /\n$/ );
  print substr($_,5,251);
  print "\n";
}

固定長 出力(Perl Script)
#2048バイトの固定長レコード出力
while(<>){
  chop if( /\n$/ );
  printf "%-2048s",$_;
  print "\n";
}

accessの自動実行(java Script)
var obj = WScript.CreateObject("Access.Application.9");//access2000の場合
obj.OpenCurrentDatabase("C:\\test\\db1.mdb");
obj.Visible = -1;
obj.DoCmd.RunMacro("M_auto更新") //マクロ名を入れてください
WScript.Sleep (200);
obj.CloseCurrentDatabase();
WScript.Sleep (200);
obj.Quit();
WScript.Quit();
・Access = Access.Application//複数インストールされているときは最後に動いたもの
・Access2000 = Access.Application.9
・Access97 = Access.Application.8

固定長からCSV(Perl Script)
# 固定長からCSV
@Len = (5,3,2,3);
#項目の数
$Item = $#Len + 1;
while(<>){
  chop if( /\n$/ );
  $j = 0;
  for( $i = 0; $i < $Item; $i++ ){
    $Data = substr($_,$j,$Len[$i]);
    $j = $j + $Len[$i];
    #文字列の最後の空白を取り除く
    $Data =~ s/ +$//g;
    $Data =~ s/ +$//g;
#カンマの場合(データに内にカンマがあった場合は削除しています)
    $Data =~ s/,//g;
    print $Data;
    print "," if( $i < $Item - 1);
#tabの場合
#   print $Data;
#   print "\x09" if( $i < $Item - 1);
  }
  print "\n";
}

NULL(\x00)文字のチェック(Perl Script)
#NULL(\x00)文字のチェック
while(<>){
  if(/\x00/){
     print $_;
  }
}

コマンドラインのパラメータからPerlを実行(Perl Script)
rem カンマをTABに変換
jperl -pe 'tr/,/\x09/;' %1

パラメータをwindowsの画面より入力してバッチを起動(vb Script)
Dim var
Dim bat
Dim batname
batname = "test.bat"
var = InputBox("何月度ですか? ex. 200403")
Set Ws = WScript.CreateObject("Wscript.Shell")
MsgBox var & "を処理します"
bat = batname & " " & var
Ws.Run bat

コマンドパラメータの指定のサンプル 指定行出力(Perl Script)
#指定行数出力(jperl xxx.pl -100 input.txt > output.txt)
$lineno = 1;
while( $ARGV[0] =~ /^-([0-9]+)/ ){
  $lineno = $1;
  shift;
}
while(<>){
 if($. eq $lineno){
    print $_;
 }
}

コマンドパラメータの指定のサンプル option表示(Perl Script)
#オプション表示、ファイル内容出力(jperl yyy.pl -a input.txt > output.txt)
$option ="";
while( $ARGV[0] =~ /^-([a-zA-Z])/ ){
  $option = $1;
  shift;
}
print "option = ",$option,"\n";
while(<>){
  print $_;
}

前ゼロ取る、後ろスペース取る(Perl Script)
s/^0+//g; #前ゼロ取る
s/^ +//g; #前スペース取る
s/ +$//g; #後ろスペース取る
s/ +$//g; #後ろ全角スペース取る

s/[,"~]//g; #記号を取る
# s/[!#$%&'()=~|+}{`_,<>":. \x2f]//g;
s/[\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2e\x2f]//g;
s/[\x3a\x3b\x3c\x3d\x3e\x3f\x7a\x7b\x7c\x7d\x7e\x7f\x20]//g;

現在日時を得る(Perl Script)
($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst) = localtime();
$mon = sprintf("%02d",($mon + 1));
$mday = sprintf("%02d",$mday);
$hour = sprintf("%02d",$hour);
$min = sprintf("%02d",$min);
$sec = sprintf("%02d",$sec);

$otime = "20".substr($year,1,2).$mon.$mday.$hour.$min.$sec;

「数字と数字の間の「の」を「−」にする(Perl Script)
#No100の12 -> No100−12
while(<>){
  s/No\d+の\d+/&no2hai($&)/ge;
  print $_;
}
sub no2hai{
  local($_) = @_;
  tr/の/−/;
  $_;
}

指定した文字列が入っている行数を求める(Perl Script)
# kensu.pl 指定した文字列が入っている行数を求める
$cnt = 0;
$taisyo = "今日";
while(<>){
  $cnt++ if( /$taisyo/ );
}
printf " cnt = %7ld 件\n",$cnt;


tab(csv)形式の項目の並び替え(Perl Script)
1 2 3
-------
a b c
 ↓  (3,2,1)
-------
c b a
# narabi.pl tab形式の項目の並び替え
# 各項目の種別(出力する順番)
@kubun = (3,2,1);
while(<>){
  #改行を消す
  chop if(/\n$/);
  #tab形式の一行を項目に分解する
  @item = split(/\x09/, $_);  #csvのとき @item = split(/,/, $_);
  for( $j = 0; $j <= $#item; $j++ ){
    printf $item[$kubun[$j] - 1];
    print "\x09" if( $j < $#item);  #csvのとき print "," if( $j < $#item);
  }
  print "\n";
}

tab(csv)形式の指定列のみ出力(Perl Script)
1 2 3
-------
a b c
 ↓  (1,3)
-------
a c
# nukitori.pl tab形式の指定列のみ出力
# 各項目の種別(1:出力する,0:しない)
@kubun = (1,0,1);
# 区分ごとに処理してCSV出力
while(<>){
  #改行を消す
  chop if(/\n$/);
  #tab形式の一行を項目に分解する
  @item = split(/\x09/, $_); #csvのとき @item = split(/,/, $_);
  for( $j = 0; $j <= $#item; $j++ ){
    if($kubun[$j] == 1){
      printf $item[$j];
      print "\x09" if( $j < $#item ); #csvのとき print "," if( $j < $#item );
    }
  }
  print "\n";
}

カレントディレクトリのファイルでbat作成(Perl Script)
# カレントディレクトリのファイルでbat作成
#dir取得
opendir(DIR,".");
@file = readdir(DIR);
foreach $filename (@file){
  if(substr($filename,0,1) ne "."){
    #c:\test2へコピーするとき
    print ("copy \"",$filename,"\" ","\"c:\\test2\\",$filename,"\"\n");
    #リネームするとき[.bk]を付加
    #print ("ren \"",$filename,"\" \"",$filename,".bk\"","\n");
  }
}
closedir(DIR);


ホームページを巡回して自動印刷(vb script)
urlの一覧からホームページを巡回して自動印刷を行うサンプルです。

1.urldata.txtにurlを記入します

例 [urldata.txt]
http://hp.vector.co.jp/authors/VA036757/
file://c:\test\a.txt

2.autoprt.vbsを実行します。

*autoprt.vbsを修正することで
・巡回ファイルはurldata.txt以外も指定できます。
・表示している秒数を変更できます。
download

IEのダウンロード先を変更(vb Script)
// *************************************************************************
// IEのダウンロード先の変更
// *************************************************************************
var downdir = "c:\\tes";
var WShell = WScript.CreateObject("WScript.Shell");
WShell.RegWrite("HKCU\\Software\\Microsoft\\Internet Explorer\\Download Directory",downdir);
//HKCUは、HKEY_CURRENT_USERの略称
WScript.Sleep (1000);
var NNDir = WShell.RegRead("HKCU\\Software\\Microsoft\\Internet Explorer\\Download Directory");
WScript.Echo(NNDir);
*レジストリを変更しますので、注意してください

バージョン違いのAccessがインストールされている環境で実行するバージョンの変更(vb Script)
// *************************************************************************
// Accessの実行するバージョンの変更
// *************************************************************************
var WShell = WScript.CreateObject("WScript.Shell");
WShell.RegWrite("HKEY_CLASSES_ROOT\\.mdb\\","Access.Application.9");
Msg = WShell.RegRead("HKEY_CLASSES_ROOT\\.mdb\\");
WScript.Echo(Msg);
・Access2000 = Access.Application.9
・Access97 = Access.Application.8
*レジストリを変更しますので、注意してください

excelの日付のシリアル値をyyyy/mm/ddに変換(perl script)
Xls2csvsでexcelからcsvにすると、書式が取れた値になります。金額のカンマも取れますが
yyyy/mm/ddの日付はシリアル値(1900/01/01からの経過日数)になります。
これをyyyy/mm/ddの形式に変換するサンプルです。

perlではlocaltime()関数があり、これは1970/01/01からの秒数になります。
そこで、excelのシリアル値を(1900/01/01から1970/01/01までの経過時間)で引き
年月日を表示します。

2005/05/21 , 東京
2005/05/22 , 広島

while(<>){
  #改行を消す
  chop if(/\n$/);
  #csv形式の一行を項目に分解する
  @item = split(/,/, $_);
  # 1970/01/01 - 1900/01/01 + 1 = 25569日
  # 経過日数を秒数に変換
  $year_sa = ($item[0] - 25569) * 24 * 60 * 60;
  ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($year_sa);
  $yyyymmdd = sprintf("%04d/%02d/%02d", $year + 1900, $mon +1, $mday);
  print $yyyymmdd.",".$item[1]."\n";
}


perlの配列の数を求める(Perl Script)
@ArrayX = (1,2,3,4,5);
#項目の数
$Item = $#ArrayX + 1;
printf $Item,"\n";

縦一列のデータを横に割り振る(Perl Script)
1
2
3
4
5

1,2
3,4
5
#2列に割り振る
$COL = 2;
$j = 0;
while(<>){
  $j++;
  chop if( /\n$/ );
  print $_;
  if($j eq $COL){
    print "\n";
    $j = 0;
  }else{
    print ",";
  }
}

ファイルをソートする[件数が少ないとき](Perl Script)
4
1
3
2

1
2
3
4
#行をソートする
while (<>) {
  push (@data, $_);
}

foreach $dat (sort  @data) {
   print $dat;
}

ハッシュについて(Perl Script)
#血液型でソートする
#ハッシュ
@Name = ('早紀', '沙紀', '佐紀', '沙希');
%Blood = ('早紀' => 'B','沙紀' => 'A','佐紀' => 'O','沙希' => 'AB' );
#次のようにも書ける
#%Blood = ('早紀','B','沙紀','A','佐紀','O','沙希','AB');
@SortedName =sort {$Blood{$a} cmp $Blood{$b}} @Name;
print "ハッシュ(血液型)でソート\n";
print "早紀(B) 沙紀(A) 佐紀(O) 沙希(AB)\n";
print join(', ', @SortedName); 
print "\n";

SORTについて(Perl Script)
@SortList = (1,2,3,4,5,6,7,8,9,10,11);
print "SORT前\n";
$, = ", ";
print @SortList;
print "\n";

#文字列で昇順
@SortedList = sort @SortList;
$, = ", ";
print "文字列で昇順\n";
print @SortedList;
print "\n";

#文字列で昇順(省略しないとき)
@SortedList = sort { $a cmp $b } @SortList;
#他の出力の仕方
print "文字列で昇順(省略しないとき)\n";
print join(', ', @SortedList); 
print "\n";

#文字列で降順
@SortedList = sort { $b cmp $a } @SortList;
print "文字列で降順\n";
print join(', ', @SortedList); 
print "\n";

#文字列で降順(Reverse使用)
@SortedList = reverse sort { $a cmp $b } @SortList;
print "文字列で降順(Reverse使用)\n";
print join(', ', @SortedList); 
print "\n";

#数値で昇順
@SortedList = sort { $a <=> $b } @SortList;
print "数値で昇順\n";
print join(', ', @SortedList); 
print "\n";

#数値で降順
@SortedList = sort { $b <=> $a } @SortList;
print "数値で降順\n";
print join(', ', @SortedList); 
print "\n";

#数値で昇順(サブルーチン使用)
@SortedList = sort byNumber @SortList;
print "数値で昇順(サブルーチン使用)\n";
print join(', ', @SortedList); 
print "\n";

sub byNumber{
  $a <=> $b;
}

#数値で昇順(サブルーチン内省略しない)
@SortedList = sort byNumber2 @SortList;
print "数値で昇順(サブルーチン内省略しない)\n";
print join(', ', @SortedList); 
print "\n";

sub byNumber2{
  if ($a < $b){
    return -1;
  }elsif ($a == $b){
    return 0;
  }elsif ($a > $b){
    return 1;
  }
}

#文字列で昇順(サブルーチン内省略しない)
@SortedList = sort byNumber3 @SortList;
print "文字列で昇順(サブルーチン内省略しない)\n";
print join(', ', @SortedList); 
print "\n";

sub byNumber3{
  if ($a lt $b){
    return -1;
  }elsif ($a eq $b){
    return 0;
  }elsif ($a gt $b){
    return 1;
  }
}

#好きなように(偶数奇数に分ける)
@SortedList = sort byNumber4 @SortList;
print "好きなように(偶数奇数に分ける)\n";
print join(', ', @SortedList); 
print "\n";

sub byNumber4{
  if ($a%2 < $b%2){
    return -1;
  }elsif ($a%2 == $b%2){
    return 0;
  }elsif ($a%2 > $b%2){
    return 1;
  }
}


1行だけ読み込む(Perl Script)
#1行だけ読み込む
$_ = <ARGV>;
print $_;


whie(<>){}を省略しないで書いてみると(Perl Script)
while(<>)
  print $_;
}
↓
while($_ = <>)
  print $_;
}
↓
whle($_ = <ARGV>)
  print $_;
}
↓
#引数がないときはSTDINをOPENさせるためにファイル名に「-」を使用
#ちなみにSTDOUTのOPENは「>-」
unshift(@ARGV, '-') if $#ARGV < 0;
#引数が複数ある場合に順番に読んでいく
#shift(@ARGV)はshiftだけの省略可
while ($ARGV = shift(@ARGV)) {
  open(ARGV, $ARGV);
  while ($_ = <ARGV>) {
    print $_;
  }
}


複数のexcelファイルを読み一つにまとめバッチファイルを流す例(vbs)
for i = 0 to WScript.Arguments.Count - 1
nextのループで複数ファイルを読みます
csvに保存するのはWorksheets(1).SaveAs OutPath, 6 で行います
appendするのは、openTextFile("filename", 8, False)で行います
batファイルを実行するのはWs.Run batnameで行います

詳しくはサンプルを参考にしてください
download

excelファイルを読みCSVにする(vbs)
OPENメソッドとSAVEASメソッドを使用します。

objXL.Workbooks.Open Path,,True
objXL.Worksheets(1).SaveAs OutPath,6
download

csvファイルを読みexcelにする(vbs)
OPENメソッドとSAVEASメソッドを使用します。
vbスクリプトの中で、列幅、罫線、フォントなどを整えて
excelで保存することも可能です

objXL.Workbooks.Open Path,,,,2 'csvで読込
objXL.ActiveWorkbook.SaveAs OutPath,-4143 'excelで出力
download

ファイルを連結するバッチファイル
DEL c:\dataall.dat
FOR %%1 IN (c:\abc\*.dat) DO TYPE %%1 >> c:\datall.dat

バッチファイルでのサブルーチン
CALL :SUB_R A1 A2
rem ****************************************************************:
rem   サブルーチン
rem ****************************************************************:
:SUB_R
setlocal
 echo %1 %2
endlocal
exit /b

※サブルーチンを呼びだすときに、「:」を先頭につけること
 exitに「/b」をつけること
 setlocal ,endlocalで挟むことがポイントです。


メールを受信し添付ファイルをメールアドレスのフォルダに振り分ける(vbs)
BASP21を利用し、メールを受信し添付ファイルをメールアドレスのフォルダに振り分けます。
タスクに組み込めば自動化も可能です。

download

※ご使用にあたっては、BASP21をインストール後
メールを受信するフォルダ、メールアドレス等の設定をしてください。
また、サーバにあるメールを削除するには、SAVEALLDに変更して使用してください

富士通汎用機で出力したリストをPDFにするperlスクリプトとバッチファイル
リストの1桁目には改行、改ページ等の制御情報が入っています。
これを考慮してテキストを作成した後、txt2pdfs.exeでpdfにします。
jperl list2pdf.pl sample.out  > sample.txt
txt2pdfs -sA4L -fg9 -ml20 -mp0 sample.txt sample.pdf

[list2pdf.pl]
$LineMax = 66;
%kaigyo = (' ',1,'0',2,'-',3); 
#ライン数をクリア
$lineNo = 0;

#66行でページを分割
while (<>) {
  chop if( /\n$/ );
  if(substr($_,0,1) eq '1'){
    if($lineNo ne 0){
      for ($xx = 1; $xx <= $LineMax - $lineNo; $xx++) {
       print "\n";
      }
    }
    $lineNo = 0;
  }else{
    for ($xx = 1; $xx <= $kaigyo{substr($_,0,1)}-1; $xx++) {
      $lineNo++;
      print "\n";
    }
  }
  $lineNo++;
}


バッチファイルのパラメータ修飾子
バッチファイルのパラメータは%1〜%9まで使用可能(%0は実行したバッチファイル名)
%1には1つめのパラメータが入ります
(例) c:\>test.bat a b c d e f g h i
[test.bat]
echo %1 %9
[結果]
a i

%1の代わりに下記修飾子を使用することも可能
例は echo (修飾子)で表現します。

修飾子 「説明」
%~1】 「%1を展開して、二重引用符 で囲まれている場合は削除」
(例) test "abc def" → abc def

%~f1】 「%1を完全修飾パス名に展開(実行したフォルダが付きます)」
(例) test "abc" → c:\folder\abc

%~d1】 「%1をドライブ文字に展開(実行したドライブになります)」
(例) test "abc" → c:

%~p1】 「%1をパスに展開(パスのみにになります)」
(例) test "abc" → \foler\

%~n1】 「%1をファイル名に展開(拡張子を抜いたファイル名)」
(例) test abc.bat → abc

%~x1】 「%1をファイル拡張子に展開(拡張子のみになります)」
(例) test abc.bat → bat

%~s1】 「%1をショートネームパスに展開」
(例) C:\Program Files>test abc → C:\PROGRA~1\abc

%~a1】 「%1をファイル属性に展開」
(例) test abc.bat → --a------

%~t1】 「%1をファイルの日時に展開」
(例) test abc.bat → 2008/02/29 00:25

%~z1】 「%1をファイルサイズに展開」
(例) test abc.bat → 412

パラメータ2のときは「%~n2」のように使います
修飾子を続けて書くこともできます「%~dpnx1」

よく使用しているのが、拡張子を除いたファイル名を指定してバッチファイルを流す場合です
csv2fixs -f f.ini %~n1.csv %~n1.txt

コマンドプロンプトからテキストファイル作成
今でもたまに使いますが
copy con abc.txt

カレントディレクトリに存在する10以上のファイルを削除・コピー
エクスプローラ等からドラッグアンドドロップでも使用できます。
【削除用】
[dlt.bat]
:dlt
if "%1"=="" goto end
if exist %1 del %1 /p
shift
goto dlt
:end

【コピー用】
[cpy.bat]
set /p filename="出力ファイル名を入れてください="
copy NUL %filename%
:cpy
if "%1"=="" goto end
if exist %1 copy %filename% + %1 %filename%
shift
goto cpy
:end
pause
環境変数に出力ファイルを設定してから、まず空のファイルを作成後
コピーをしています。(出力ファイルはドライブパスを指定してください)

fix2csvsのパラメータファイルからJHT用のパラメータファイルを作成する(Perl Script)
#fix2csvs_p.ini
X,3,店コード
X,10,品番
9,5,数量
 ↓
#jhtc_p.ini
#店コード,品番,数量
"XXX","XXXXXXXXXX","99999"

#tateyoko.pl
#fix2csvsの形式からjhtの形式に変換する
$t = "#";
$d = "";
while (<>) {
  if(substr($_,0,1) ne "#"){
    chop if( /\n$/ );
    @item = split(/,/, $_);
    $w = $item[0] x $item[1];
    $t = $t."\x22".$item[2]."\x22"."\x2c";
    $d = $d."\x22".$w."\x22"."\x2c";
  }
}
$t =~ s/\x2c+$//g;
$d  =~ s/\x2c+$//g;
print $t."\n";
print $d."\n";
jhtは富士通の汎用機で使われているJEFコードとシフトJISコードを双方向に変換するツールです

別名のファイル作るバッチファイル
エクスプローラ等からドラッグアンドドロップで使用します
ファイル名の後ろに「a」を付加します
:cpy
echo %1
if %1=="" goto end
copy %1 "%~d1%~p1\%~n1a.jpg"
shift
goto cpy
:end
pause

b、cなど2つ以上作りたい場合は
copy %1 "%~d1%~p1\%~n1b.jpg"
copy %1 "%~d1%~p1\%~n1c.jpg"
のように記述してください
用途としては、デジカメのjpegファイルを写真屋に持っていくとき
同じ写真を2枚以上必要な場合に使っています
例えば20080514122334.jpgから20080514122334a.jpgを作成します

Pythonのサンプル
引数を表示します
import sys
if  len(sys.argv) != 3:
 print "error"
 sys.exit()
else:
  print sys.argv[1]
  print sys.argv[2];
print "test"
Pythonを触る機会があったので作成してみました

文字の変換(Python)
かっこ株1文字を括弧と株の3文字にします
import string
import sys
import fileinput
 
if  len(sys.argv) != 2:
  sys.exit()
else:
  print sys.argv[1];
 
for line in fileinput.input(sys.argv[1]):
  print line.replace("", "(株)")
 

バッチファイルでテキストファイルの内容を付加してリネームしてコピー
例えば日付のデータがあり、その日付を付加した名前でバックアップして
おきたいときに使用できます。
[date.txt]
20080930

[sample.bat]
for /f %%i in ( date.txt ) do (
 copy 日報.pdf .bkup\日報_%%i.pdf
)

[実行例]
copy 日報.pdf .bkup\日報_20080930.pdf

他の使用方法
[コマンド指定例]
for /f "skip=3" %%i in ('type a.txt') do echo %%i
 (3行スキップ)
[データ指定例]
for /f ""tokens=2,*" %%i in ("a b c d") do echo %%i
 (2個目とそれ以降のデータが対象  b,c,d)


文字の変換(vbscript)
かっこ株1文字を括弧と株の3文字にします
全件をメモリに読み込みますので件数が少ない場合に使用します
Dim text, text1, text2, filename1, filename2, tf, fso

text1=""
text2="(株)"
filename1 = 'c:\input.txt'
filename2 = 'c:\output.txt'
'全件読込
Set fso = CreateObject("Scripting.FileSystemObject")
Set tf = fso.OpenTextFile(filename,1,True)
text=""
While Not tf.AtEndOfStream
  text = tf.ReadAll
Wend
tf.Close
'置換
text = Replace(text,text1,text2)
'全件出力
Set tf = fso.OpenTextFile(filename2,2,True)
  tf.Write text
tf.Close

CSVの品番集計を行う(Perl Script)
#a.csv
AAA-1,TITLEA,1
BBB-1,TITLEB,2
CCC-1,TITLEC,3
AAA-1,TITLEA,4
CCC-1,TITLEC,5

 ↓
#b.csv
#品番,タイトル,数量
AAA-1,TITLEA,5
BBB-1,TITLEB,2
CCC-1,TITLEC,8

#hashusum.pl
while (<>) {
 #改行をとる
 chop if(/\n$/);
 #CSVを項目に分ける
 @item = split(/,/, $_);
 #品番をキーにする
 $key = $item[0];
 #品番・タイトルをカンマでつなげる
 $hash_data{$key} = $item[0].",".$item[1];
 #品番ごとの数量を加算する
 $hash_su{$key} += $item[3];
}
print "品番,タイトル,数量\n";
foreach $key ( sort keys %hash_data ) {
   print $hash_data{$key}.",".$hash_su{$key}."\n";
}
品番とタイトルは必ず同じと考えて、品番順に出力しています。
件数が少ない場合の方法です

名前に空白があるフォルダをパラメータとして使用する(bat)
名前にの中に空白があるフォルダをパラメータとして使用したいとき
c:\>a.bat 全角が含まれた フォルダ
[a.bat]
echo "%1 %2"

ゼロバイトのデータで条件分岐(bat)
for %%I in (data1.dat) do set sz=%%~zI
if %sz%==0 goto ZERO_FILE
echo ゼロバイトではありません
goto end
:ZERO_FILE
echo ゼロバイトです
:END


One Liner(perl)
コマンドライン1行で済ます方法
まずパラメータについて
-n ・・・  "while (<>) { ... }" と同様
-p ・・・  "while (<>) { print }" と同様
-e ・・・  一行プログラム

[小文字を大文字にする]
perl -pe "tr/a-z/A-Z/" [input]
セミコロンで2つ以上命令を続けることができることを利用し
次のようにも書くことができる。
perl -ne "tr/a-z/A-Z/;print" [input]

[Grepの代わり]
perl -ne "print if ( /検索文字列/ )" [input]

[-aパラメータと-F区切り文字と-lパラメータ]
-a は「自動splitモード」で
-F,とすると
@F = split(','); のように配列Fにデータが入る
-lは入力の際にchompし、出力の際に自動で改行を付加する

カンマで区切られたファイルを読み、2項目目を改行をつけて出力する。
perl -F, -lane "print @F[1]" [input]

スクリプトで書くと
while (<>){
  @F = split(',');
  print $F[1]."\n";
}


CSVからhtmlのtable作成(Perl Script)
splitで分けてからtrとtdをjoinで繋げます
print "<html><body>\n";
print "\n";
print '<TABLE border="3">'."\n";
while(<>){
  print '<tr><td>'.join("</td>\n<td>", split(/,/, $_))."</td>\n</tr>\n";
}
print "</table>\n";
print "</body></html>\n";
A1 B1 C1
A2 B2 C2
A3 B3 C3

CSVからセルを結合したhtmlのtable作成(Perl Script)
二度同じファイルを読むのがみそです。
rowspanを使用します

NO A B C
1 a1 b1 c1
2 c2
3 a2 b2 c2
4 b3 c3
5 a3 b2 c3
download

CGIで全角文字をDecode、Encodeする方法です(Perl Script)
CGIでパラメータを渡すとき全角ではうまくいかない場合があります。
なお、空白はプラスに変換してからDecodeします。
「全角です」は次のようになります。
"http://xxx/test.cgi?%91S%8ap%82%c5%82%b7"
$value = "全角です";
print $value."\n";
print "*******\n";

#encode
$value =~ tr/ /+/;
$value =~ s/(\W)/'%'.unpack("H2",$1)/eg;
print $value."\n"
print "*******\n";

#decode
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
print $value."\n";


CGIでパラメータを2つにするには(Perl Script)
「abc」と「全角です」のパラメータを2つにするときは「?」の後ろに
「+」でつないで使います。
"http://xxx/test.cgi?abc+%91S%8ap%82%c5%82%b7"

バイナリファイルの文字コードを変換するには(Perl Script)
バイナリモードで開きます。
この場合1バイトごとに読んで変換をかけ、出力しています
入力ファイルをサンプルのように指定したいため、下記のようにしています。
open (FH, $ARGV[0]) or die;
binmode FH;
binmode(STDOUT);
while (read( FH, $code, 1)) {
    $code =~ tr/\x7f/\xBE/;
    print STDOUT $code;
}
close FH;

jperl test.pl a.dat > b.dat

ループの途中で処理をしないようにするには(Perl Script)
ループをある条件のとき抜けたい、ある条件のとき最後まで処理をしたくないときがあります
「last」と「next」を使って行うことができます
[last]
while (<>)) {
  last if ($. eq 10);
  print $_;
}
lastが実行されると、その行でループを抜けます。
この場合は9行まで出力され終わります。

[next]
while (<>)) {
  last if ($. eq 10);
  print $_;
}
nextが実行されると、その行以下が実行されませんが、ループを続けます。
この場合は9行まで出力され、10行目は出力されず、11行から最後まで出力されます。


Substrの使い方(Perl Script)
$data ="abcdefg";の場合、先頭は0から数えます

a b c d e f g
--------------------
0 1 2 3 4 5 6
-7 -6 -5 -4 -3 -2 -1


# n文字目からm文字を取得(通常のパターン)
$data2 = substr($data, n, m);
n=2,m=3のとき"cde"

# n文字目から最後までを取得(取得文字数を省略)
$data2 = substr($data, n);
n=5のとき"fg"

# 後ろから数えてn文字目から最後までを取得(マイナスは後ろから数える)
$data2 = substr($data, -n);
n=3のとき、"efg";

# n文字目からm文字残して取得
$data2 = substr($data, n, -m);
n=2,m=3のとき"cd"

# n文字目からm文字を"CCC"に置換して取得
$data2 = substr($data, n, m,"CCC");
n=4,m=2,"CCC"="EF"のとき"abcdEFg"

# 一部分を置き換える
substr($data, 4, 2) = 'EF'; # $a = 'abcdEFg'

環境変数の時刻の前の空白をゼロにする(bat)

%time% =  3:59:48.19のように時間が1ケタの時には先頭に空白が入っています。

(1)set timex=%time: =0%

*環境変数の空白を0に置換しています。文字列1はアスタリスクも可能です。
%変数名:文字列1=文字列2%

(2)set /a hh=%time:~0,2%
If %hh% lss 10 Set hh=0%hh%
set timex = %hh%%time:~3%

*/aをつけると計算式となり文字列でなく数字として認識してくれます。

*%変数名:~位置,長さ% を利用しています。他の例を示します。

(%変数名:~3% : 4文字以降すべて)
(%変数名:~3,1% : 4文字から1文字)
(%変数名:~3,-1% : 4文字から最後の1文字を除いたもの)
(%変数名:~-3% : 右から3文字目から後ろ)
(%変数名:~-3,1% : 右から3文字目から1文字)
(%変数名:~-3,-1% : 右から3文字目から最後の1文字を除いたもの)



コンピュータ名をバッチで取得するには(bat)
set hname=%computername%

または
for /F %%h in ('hostname') do set hname=%%h

hostnameコマンドの出力を変数に入れてから、setコマンドで代入しています

約1秒待たせる(bat)
ping localhost -n 2 > nul

フルパスの引数からファイル名のみ取得(bat)
set flid=%~n1%~x1 

ファイルに記述されたバッチファイルをパラメタ付で起動する(bat)
for /F "tokens=1-9" %%a in ( batname.dat ) do ( 
call %%a %%b %%c %%d %%e %%f %%g %%h %%i
) 

[batname.bat]
aaa.bat para1 para2
bbb.bat para1 para2

プログラムが起動中なら起動しないようにする(bat)
set process_name=aaa.exe
tasklist /fi "imagename eq %process_name%" | find /i "%process_name%" 
if %errorlevel%==0 (
echo *** 起動済
) Else ( 
start aaa.exe
) 

バッチファイルで変数がNULLの対応(bat)
if %1 equ a echo a
のバッチファイルをパラメータをいれずに処理すると
if equ a echo a となり、エラーとなります。

エラーにしない方法として
[方法1] if "%1" equ "a" echo a
[方法2] if %1. equ a. echo a

とすると構文エラーにならず、うまく流れます。


If文とfor文の中で変数を扱う(bat)
バッチファイルでは他の言語とは違い、if文やfor文の中での式の代入した値が
反映されるのが、if文やfor文を抜けてからです。
よって

set var1=1
set var2=1
if %var1%==1(
set var2=%var2%+1
echo 中 %var2%
)
echo 外 %var2%

とやってもif文の中では反映されず、抜けてから反映されます。

これを回避するには遅延環境変数の展開の指定をします。

setlocal enabledelayedexpansion
set var1=1
set var2=1
if %var1%==1(
set var2=!var2!+1
echo 中 !var2!
)
echo 外 %var2%
end local

先頭に宣言をして、変数には「!」を使用します。