2013年12月1日日曜日

PowerShellでシンプルなテンプレートエンジンを作成する

概要

テスト環境や本番環境のアプリリリースにて一部(IPアドレス等)以外、リリース手順が同じ場合
また、メール送信ファイル作成にてユーザ情報以外同一の場合など
毎回、記述するのが面倒なのでシンプルなテンプレートエンジンを作成する

テンプレートファイルと入力データよりファイルを出力する
・テンプレートファイルが存在しない場合はメッセージを出力してなにもしない
・テンプレートの変換は「Hashtable」を使う( @{キー名 = 値; キー名 = 値; ....... })
「Hashtable」の「キー名」にテンプレートに記述した値を設定、「値」に変更する入力データを設定
文字コードのデフォルトは「UTF8」(テンプレートファイル、出力ファイル)

関数


# ------------------------------------------------------------------
# テンプレートファイルと入力データよりファイルを出力する
# 関数名:Render-Template
# 引数 :TemplateFilePath テンプレートファイルパス
# :DataObject データ
# :OutPutFilePath 出力ファイルパス
# :Encoding 文字コード
# 戻り値:なし
# ------------------------------------------------------------------
function Render-Template([String]$TemplateFilePath, [System.Collections.Hashtable]$Data,
[String]$OutPutFilePath, [String]$Encoding = "UTF8"){
# テンプレートファイルの存在チェック
if(-not(Test-Path -LiteralPath $TemplateFilePath -PathType Leaf)){
Write-Host "指定したテンプレートファイルが存在しません"
break
}
# テンプレートファイル読み込み
$template = Get-Content $TemplateFilePath -Encoding $Encoding
# 置換
foreach ($value in $Data.keys){
$template = $template -replace $value , $Data[$value]
}
# ファイル出力
$template | Out-File $OutPutFilePath -Encoding $Encoding
}

実行例

・テンプレートファイル(Mail_Template.txt)

{LAST_NAME} {FIRST_NAME} 様
ご購入ありがとうございます。

~省略~
・powershell実行
# メールテンプレート指定
$MailTemplateFile = "C:\template\Mail_Template.txt"
# ユーザ情報セット
$User = @{"{LAST_NAME}"="山田"; "{FIRST_NAME}"="太郎"}
# 出力ファイル指定
$MailFile = "C:\Temp\Mail_001.txt"
# 実行
Render-Template -TemplateFilePath $MailTemplateFile -Data $User -OutPutFilePath $MailFile

2013年11月14日木曜日

URLエンコード、URLデコードをする

関数


# ------------------------------------------------------------------
# 指定した文字コードより、文字列をURLエンコードする
# 関数名:Get-URLEncode
# 引数 :VALUE URLエンコードする文字列
# :ENCODING 文字コード
# 戻り値:URLエンコードした文字列
# ------------------------------------------------------------------
function Get-URLEncode([String]$VALUE, [String]$ENCODING){
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web")
$enc= [System.Text.Encoding]::GetEncoding($ENCODING)
return [System.Web.HttpUtility]::UrlEncode($VALUE,$enc)
}

# ------------------------------------------------------------------
# 指定した文字コードより、文字列をURLデコードする
# 関数名:Get-URLDecode
# 引数 :VALUE URLデコードする文字列
# :ENCODING 文字コード
# 戻り値:URLデコードした文字列
# ------------------------------------------------------------------
function Get-URLDecode([String]$VALUE, [String]$ENCODING){
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Web")
$enc= [System.Text.Encoding]::GetEncoding($ENCODING)
return [System.Web.HttpUtility]::UrlDecode($VALUE,$enc)
}

実行例

# 実行
PS > Get-URLEncode -VALUE "あいうえお" -ENCODING "utf-8"
%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a
# 実行
PS > Get-URLDecode-VALUE "%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a" -ENCODING "utf-8"
あいうえお

メモ

文字コードの指定「Encoding.GetEncoding」


2013年11月3日日曜日

ファイル名を置換する

関数


# ------------------------------------------------------------------
# ファイル名を置換する
# 関数名:Replace-FileName
# 引数 :FilePath ファイル名を置換するファイルパス
# :Befor 置換前
# :After 置換後
# 戻り値:なし
# ------------------------------------------------------------------
function Replace-FileName([String]$FilePath, [String]$Befor, [String]$After){
if(Test-Path -LiteralPath $FilePath -PathType Leaf){
$fileInfo = Get-ChildItem -LiteralPath $FilePath
# 置換対象が存在する場合
if($fileInfo.BaseName -match $Befor){
# 置換
$newFileName = ($fileInfo.BaseName -replace $Befor,$After) + $fileInfo.Extension
$newFilePath = Join-Path -Path (Split-Path $FilePath -Parent) -ChildPath $NewFileName
Move-Item -LiteralPath $FilePath -Destination $newFilePath
}
}else{
Write-Host "ファイルが存在しません。ファイル名[ $FilePath ]"
}
}

実行例

$FolderPath = "C:\sample"
$Include = "*.xls"
$Befor = "\["
$After = "【"
Get-ChildItem $FolderPath -Recurse -Include $Include |
ForEach-Object{
  Replace-FileName -FilePath $_.FullName -Befor $Befor -After $After
}

2013年10月30日水曜日

Linux上でH2 Databaseが起動しない

概要

Linux上でH2 Databaseが起動しない
理由はホスト名が/etc/hostsに記述されていないためエラーが発生

詳細

実行

/h2-1.3.173.jar org.h2.tools.Server

エラー内容

Exception in thread "main" org.h2.jdbc.JdbcSQLException: 入出力例外: "java.net.UnknownHostException:
 XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です"
IO Exception: "java.net.UnknownHostException: XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です" [90028-173]
 at org.h2.message.DbException.getJdbcSQLException(DbException.java:331)
 at org.h2.message.DbException.get(DbException.java:160)
 at org.h2.message.DbException.convert(DbException.java:275)
 at org.h2.util.NetUtils.getLocalAddress(NetUtils.java:263)
 at org.h2.server.web.WebServer.updateURL(WebServer.java:328)
 at org.h2.server.web.WebServer.init(WebServer.java:317)
 at org.h2.tools.Server.<init>(Server.java:51)
 at org.h2.tools.Server.createWebServer(Server.java:413)
 at org.h2.tools.Server.runTool(Server.java:306)
 at org.h2.tools.Server.main(Server.java:117)
Caused by: java.net.UnknownHostException: XXXXXXX.local: XXXXXXX.local: 名前またはサービスが不明です
 at java.net.InetAddress.getLocalHost(InetAddress.java:1466)
 at org.h2.util.NetUtils.getLocalAddress(NetUtils.java:261)
 ... 6 more
Caused by: java.net.UnknownHostException: XXXXXXX.local: 名前またはサービスが不明です
 at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
 at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:894)
 at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1286)
 at java.net.InetAddress.getLocalHost(InetAddress.java:1462)
 ... 7 more

解決方法

/etc/hostsに記述することで解決

hostsの確認

$ hostname
XXXXXXX.local
$ cat /etc/hosts
127.0.0.1 localhost

hostsの修正

$ vi /etc/hosts
127.0.0.1  XXXXXXX.local localhost

2013年10月24日木曜日

フォルダ配下のファイル名を作成日時順に連番を付ける

関数


# ------------------------------------------------------------------
# フォルダ配下のファイル名を作成日時順に連番を付ける
# 関数名:AddNumber-FileNameByCreationTime
# 引数  :FolderPath 対象フォルダ
# :Include 対象拡張子
# :AddType 連番指定[接頭or接尾] (※接頭の場合は「Prefix」、接尾の場合は「Suffix」を指定)
# :NumberFormat 0埋め桁数 (※3桁の場合「000」と桁数分0を指定)
# 戻り値:なし
# ------------------------------------------------------------------
function AddNumber-FileNameByCreationTime([String]$FolderPath,[String]$Include,[String]$AddType="Prefix",[String]$NumberFormat="0"){
$count = 0;
Get-ChildItem $FolderPath -Recurse -Include $Include | Sort-Object {$_.CreationTime -as [DateTime]} |
ForEach-Object {
# 接頭に連番追加
if("Prefix" -eq $AddType){
$Name =$_.Name
Rename-Item $_.FullName -newName ("{0:$NumberFormat}_$Name" -F $count++)
}
# 接尾に連番追加
elseif("Suffix" -eq $AddType){
$BaseName =$_.BaseName
$Extension =$_.Extension
Rename-Item $_.FullName -newName (("$BaseName"+ "_" + "{0:$NumberFormat}$Extension") -F $count++)
}
}
}

メモ

DateTime型をソートする場合、キャスト(変換)しないといけない
Sort-Object {$_.CreationTime -as [DateTime]} 

2013年10月22日火曜日

配列から重複を削除

概要

HashSetを使用して配列の値を一意にする。
プリミティブ型の場合、そのまま使えないのでオブジェクトにラップして一意にする。

メソッド


import java.util.Arrays;
import java.util.HashSet;
/**
*
* @author ao-zkn
*/
public class RemoveArraysDuplicate {
/**
* String型の配列から重複した値を削除する
*
* @param arrays 配列
* @return 重複を削除した配列
*/
private static String[] removeStringArraysDuplicate(String[] arrays) {
if (arrays == null || arrays.length == 0) {
return arrays;
}
// 重複削除
HashSet<String> hashSet = new HashSet<>();
hashSet.addAll(Arrays.asList(arrays));
return hashSet.toArray(new String[0]);
}
/**
* int型の配列から重複した値を削除する
*
* @param arrays 配列
* @return 重複を削除した配列
*/
private static int[] removeIntArraysDuplicate(int[] arrays) {
if (arrays.length == 0) {
return arrays;
}
// 重複削除(オブジェクトにラップ)
HashSet<Integer> hashSet = new HashSet<>();
for (Integer i : arrays) {
hashSet.add(i);
}
// プリミティブ型に変換
Integer[] integers = hashSet.toArray(new Integer[0]);
int[] array = new int[integers.length];
for (int i = 0; i < array.length; i++) {
array[i] = integers[i];
}
return array;
}
public static void main(String[] args) {
String[] s = {"a", "b", "c", "d", "a", "c", "d"};
System.out.println(Arrays.toString(removeStringArraysDuplicate(s)));
int[] i = {1, 2, 3, 4, 5, 1, 3, 5, 9};
System.out.println(Arrays.toString(removeIntArraysDuplicate(i)));
}
}

2013年10月14日月曜日

2つのCSVファイルから項目に一致した行を出力

概要

2つのCSVファイル(顧客マスタ、商品マスタ)から、顧客マスタに商品マスタ.商品コードが存在するものをPowerShellを使ってCSV出力する

メモ

CSVファイル

■商品マスタ(items.csv)

ITEM_ID,ITEM_NAME
10000,AAAAAA
10001,BBBBBB
10002,CCCCCC
・・・・
・・・・
■顧客マスタ(customers.csv)
CUSTOMER_ID,ITEM_ID,CUSTOMER_NAME,QUANTITY
8000,10000,aaaaa,100
8000,10002,bbbbb,50
8001,10005,ccccc,1000
・・・・
・・・・

SQL文だと以下のような感じ

■SQL

SELECT CUSTOMERS.* FROM CUSTOMERS, ITEMS 
WHERE CUSTOMERS.ITEM_ID = ITEMS.ITEM_ID

PowerShell その1

$result = Import-Csv c:\items.csv | Select-Object ITEM_ID 
Import-Csv c:\customers.csv | Where-Object {$result -match $_.ITEM_ID} | Export-Csv c:\output.csv -NoType
customers.csvが10万件、items.csvが1万件で約数十分ぐらいかかる(※スペックによるがとにかく遅い!!)

PowerShell その2

その1の場合、シンプルだが遅いので
items.csvをHashTableにセット(ITEM_IDに重複がないこと)する方法で解決した(約20秒ぐらいで終わる)

$hash = @{}
Import-Csv c:\items.csv | ForEach-Object {$hash.Add($_.ITEM_ID, $_)}
Import-Csv c:\customers.csv | ForEach-Object {if($hash.Get_Item($_.ITEM_ID)){$_}} | Export-Csv c:\output.csv -NoType

2013年10月6日日曜日

音楽ファイルのタグ情報を取得する

概要

フォルダ配下の音楽ファイルのタグ情報を取得する。

・タグ情報を取得するため「taglib-sharp.dll」を使用する。
以下のサイトより取得後、任意の場所に解凍する。
http://download.banshee.fm/taglib-sharp/2.1.0.0/
ファイル名:taglib-sharp-2.1.0.0-windows.zip

関数


# 任意に解凍したtaglib-sharp.dllを指定する
Remove-Variable -Name TagLibFilePath -Force -ea silentlycontinue
Set-Variable -Name TagLibFilePath -Value "C:\develop\lib\taglib-sharp.dll" -Option ReadOnly -Scope "Global"
# ------------------------------------------------------------------
# 音楽ファイル(m4a,flac,mp3)よりタグ情報を取得する
# 関数名:Get-MusicTagData
# 引数 :MusicFolderPath フォルダパス
# 戻り値:タグ情報
# ------------------------------------------------------------------
function Get-MusicTagData([String]$MusicFolderPath){
# ライブラリ読み込み
$TagLib = [System.Reflection.Assembly]::LoadFile($TagLibFilePath)
$result = @()
# フォルダ配下のm4a,flac,mp3を取得
Get-ChildItem $MusicFolderPath -Recurse -Include *.m4a ,*.flac,*.mp3 |
ForEach-Object {
$audiofile = [TagLib.File]::Create($_.fullname)
# タグ情報をセット
$value = New-Object PSCustomObject -Property @{
#ファイル名
FILENAME = $_.name
#アルバム
Album = $audiofile.Tag.Album
#アルバムアーティスト
AlbumArtists = $audiofile.Tag.AlbumArtists
#年
Year = $audiofile.Tag.Year
#タイトル
Title = $audiofile.Tag.Title
#アーティスト
Artists = $audiofile.Tag.Artists
#作曲者
Composers = $audiofile.Tag.Composers
#ジャンル
Genres = $audiofile.Tag.Genres
#トラック番号
Track = [String]$audiofile.Tag.Track + "/" + [String]$audiofile.Tag.TrackCount
#ディスク番号
Disc = [String]$audiofile.Tag.Disc + "/" + [String]$audiofile.Tag.DiscCount
#コメント
Comment = $audiofile.Tag.Comment
}
$result += $value
}
return $result
}

実行例

 Get-MusicTagData -MusicFolderPath "C:\develop\flac\MR.BIG\Big, Bigger, Biggest"

メモ

タグ情報/プロパティ情報をすべて取得(※taglib-sharp.dllから取得できるすべて)

$TagLib = "C:\develop\lib\taglib-sharp.dll"
# ライブラリ読み込み
[System.Reflection.Assembly]::LoadFile($TagLib)
# タグ情報を取得するファイル名を指定
$audiofile = [TagLib.File]::Create("C:\develop\flac\MR.BIG\Big, Bigger, Biggest\01 Addicted to that rush.flac")
# タグ情報を取得
$audiofile.Tag
# プロパティ情報を取得
$audiofile.Properties

2013年9月18日水曜日

CentOSにH2 Databaseをインストール

概要

H2 Databaseをインストールすることがメインなので、今回はパーミッション、アクセス権限は考えない

メモ

Javaをインストール


#!/bin/sh
# ダウンロードURL
DownloadURL="http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz"
# インストール先
InstallDirectory="/usr/local/java"
# シンボリック・リンク
JavaSymbolicLink=$InstallDirectory"/latest"
# ダウンロードファイル名
DownloadFileName=${DownloadURL##*/}
LogFileName="$DownloadFileName""_install_""`date +%Y%m%d%H%M`.log"
### ダウンロード処理
#
DownLoadFilePath="$InstallDirectory"/"$DownloadFileName"
LogFilePath="$InstallDirectory"/"$LogFileName"
echo "========== $DownloadFileName install start ==========" >> $LogFilePath
# ディレクトリチェック
if [ ! -e $InstallDirectory ]; then
mkdir -p $InstallDirectory
if [ $? -gt 0 ]; then
echo "Cannot create $InstallDirectory"
break;
fi
fi
# ファイルダウンロード
echo "========== ファイルダウンロード ==========" >> $LogFilePath
if [ ! -e $DownLoadFilePath ]; then
wget --no-cookies --no-check-certificate \
--header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com; oraclelicense=accept-securebackup-cookie" $DownloadURL \
-O $DownLoadFilePath \
-a $LogFilePath
if [ $? -gt 0 ]; then
echo "Cannot download $DownloadURL"
rm -rf $DownLoadFilePath
break;
fi
else
echo "Already download $DownloadURL"
fi
### 解凍処理
#
echo "========== 解凍処理 ==========" >> $LogFilePath
# 解凍したフォルダ名
UnzippedDirectoryName=$(tar tfz $DownLoadFilePath | head -1)
UnzippedDirectoryPath=$InstallDirectory"/"$UnzippedDirectoryName
if [ ! -e $UnzippedDirectoryPath ]; then
tar zxvfC $DownLoadFilePath $InstallDirectory >> $LogFilePath
else
echo "Already install $UnzippedDirectoryPath"
fi
### シンボリックリンク作成
#
ln -snf $UnzippedDirectoryPath $JavaSymbolicLink
echo "========== $DownloadFileName install end ==========" >> $LogFilePath
view raw install_java.sh hosted with ❤ by GitHub

H2 DataBaseをインストール


#!/bin/sh
# ダウンロードURL
DownloadURL="http://www.h2database.com/h2-2014-08-06.zip"
# インストール先
InstallDirectory="/opt/database"
#
# ダウンロードファイル名
DownloadFileName=${DownloadURL##*/}
LogFileName="$DownloadFileName""_install_""`date +%Y%m%d%H%M`.log"
### ダウンロード処理
#
DownLoadFilePath="$InstallDirectory"/"$DownloadFileName"
LogFilePath="$InstallDirectory"/"$LogFileName"
echo "========== $DownloadFileName install start ==========" >> $LogFilePath
# ディレクトリチェック
if [ ! -e $InstallDirectory ]; then
mkdir -p $InstallDirectory
if [ $? -gt 0 ]; then
echo "Cannot create $InstallDirectory"
break;
fi
fi
echo "========== ファイルダウンロード ==========" >> $LogFilePath
if [ ! -e $DownLoadFilePath ]; then
wget $DownloadURL \
-O $DownLoadFilePath \
-a $LogFilePath
if [ $? -gt 0 ]; then
echo "Cannot download $DownloadURL"
rm -rf $DownLoadFilePath
break;
fi
else
echo "Already download $DownloadURL"
fi
### 解凍処理
#
echo "========== 解凍処理 ==========" >> $LogFilePath
# 解凍したフォルダ名
UnzippedDirectoryPath=$InstallDirectory"/h2"
if [ ! -e $UnzippedDirectoryPath ]; then
unzip -n $DownLoadFilePath -d $InstallDirectory >> $LogFilePath
else
echo "Already install $UnzippedDirectoryPath"
fi
echo "========== $DownloadFileName install end ==========" >> $LogFilePath
view raw install_h2.sh hosted with ❤ by GitHub

H2 DataBaseに接続

# H2 DataBaseに起動
/usr/local/java/latest/bin/java -cp /opt/database/h2/bin/*.jar org.h2.tools.Server

Welcome to H2 Shell 1.3.173 (2013-07-28)
Exit with Ctrl+C
[Enter]   jdbc:h2:~/test
URL
[Enter]   org.h2.Driver
Driver
[Enter]   sa
User
[Enter]   Hide
Password
Password
Connected
Commands are case insensitive; SQL statements end with ';'
help or ?      Display this help
list           Toggle result list / stack trace mode
maxwidth       Set maximum column width (default is 100)
autocommit     Enable or disable autocommit
history        Show the last 20 statements
quit or exit   Close the connection and exit

sql> SELECT * FROM INFORMATION_SCHEMA.CATALOGS ;
CATALOG_NAME
TEST
(1 row, 7 ms)
sql> exit;
Connection closed

2013年9月9日月曜日

xmlからログ設定を取得

概要

ログ出力する設定をXMLから取得する関数を作成する。

・初期設定はpsに記述する
・XMLにアペンダを記述して選べるようにする

関数


### 初期値の設定
# ログファイルパス
Remove-Variable -Name LogFilePath -Force -ea silentlycontinue
Set-Variable -Name LogFilePath -Value "common.log" -Option ReadOnly -Scope "Global"
# ログレベル
Remove-Variable -Name LogLevel -Force -ea silentlycontinue
Set-Variable -Name LogLevel -Value 1 -Option ReadOnly -Scope "Global"
# ログの文字エンコード
Remove-Variable -Name LogEncoding -Force -ea silentlycontinue
Set-Variable -Name LogEncoding -Value "utf8" -Option ReadOnly -Scope "Global"
# ------------------------------------------------------------------
# XMLファイルよりログ出力の設定情報をセットする
# 関数名:Set-LogSetting
# 引数 :XMLFilePath XMLファイルパス
# :Appender アペンダ
# 戻り値:なし
# ------------------------------------------------------------------
function Set-LogSetting([String]$XMLFilePath, [String]$Appender){
#XMLファイルの読込
$xmlLogSetting = [XML](Get-Content $XMLFilePath -encoding "utf8")
# 指定したアペンダを取得
$params = $xmlLogSetting.configuration.appender | Where-Object{$_.name -eq $Appender}
if($params){
foreach($param In $params){
# ログファイルパス
if("file" -eq $param.name){
Set-Variable -Name LogFilePath -Value ($param.value) -Option ReadOnly -Scope "Global" -Force
}
# ログ文字エンコード
if("encode" -eq $param.name){
Set-Variable -Name LogEncoding -Value ($param.value) -Option ReadOnly -Scope "Global" -Force
}
# ログの種類
if("loglevel" -eq $param.name){
Set-Variable -Name LogLevel -Value ($param.value) -Option ReadOnly -Scope "Global" -Force
}
}
}
}

XML設定


<!--?xml version="1.0" encoding="UTF-8" ?-->
<configuration>
<appender name="unit">
<!-- ログファイル名 -->
<param name="file" value="app_unitTest.log">
<!-- ログレベル(0:デバック,1:情報,2:警告,3:エラー) -->
<param name="loglevel" value="0">
<!-- ログエンコード -->
<param name="encode" value="utf8">
</appender>
<appender name="product">
<!-- ログファイル名 -->
<param name="file" value="app.log">
<!-- ログレベル(0:デバック,1:情報,2:警告,3:エラー) -->
<param name="loglevel" value="1">
<!-- ログエンコード -->
<param name="encode" value="utf8">
</appender>
</configuration>
view raw log4ps.xml hosted with ❤ by GitHub

実行例

# XML読込
Set-LogSetting -XMLFilePath "C:\log4ps.xml" -Appender "unit"
# ログ出力
Write-DebugLog -VALUE "デバッグ"
Write-InfoLog -VALUE "情報"
Write-WarnLog -VALUE "警告"
Write-ErrorLog -VALUE "エラー" 

2013年9月7日土曜日

ファイルサイズでファイルをローテーションする

概要

ログを出し続けるとファイルサイズが大きくなりすぎて、処理が遅くなったり、ログの移動・参照もたいへんなので
ファイルサイズよりローテーションを行う関数を作成

・指定したファイルサイズ以上になったらローテーションを行う
・ローテーションする回数も指定する
・ローテーションしたファイル名は「ログファイル名」+「.」+「回数」

関数


# ------------------------------------------------------------------
# ファイルサイズでファイルのローテーションを行う
# 関数名:Rotate-FileSize
# 引数 :FilePath ファイルパス
# :RollingFileSize 最大ファイルサイズ(デフォルト:10MB)
# :MaxBackupIndex 最大バックアップログファイル数(デフォルト:10)
# 戻り値:なし
# ------------------------------------------------------------------
function Rotate-FileSize([String]$FilePath, [Int]$RollingFileSize = 10MB, [Int]$MaxBackupIndex = 10){
# ファイルが存在する場合
if(Test-Path -LiteralPath $FilePath -PathType Leaf){
# ファイルサイズ
$filesize = $(Get-ItemProperty $FilePath).Length
# ローテート対象
if($filesize -gt $RollingFileSize){
$sizeRollingName = (Split-Path $FilePath -Leaf) + "."
$sizeRollingPath = Join-Path -Path (Split-Path $FilePath -Parent) -ChildPath $sizeRollingName
for($i = $MaxBackupIndex - 1;$i -ge 1;$i--){
if(Test-Path -LiteralPath ($sizeRollingPath + $i) -PathType Leaf){
Move-Item -LiteralPath ($sizeRollingPath + $i) -Destination ($sizeRollingPath + ($i + 1)) -Force
}
}
Move-Item -LiteralPath $FilePath -Destination ($sizeRollingPath + 1) -Force
}
}
}

日付でファイルをローテーションする

概要

日付よりローテーションを行う関数を作成

・ファイルの作成日が現在の日付でない場合にローテーションを行う
・ローテーションしたファイル名は「ログファイル名」+「.」+「日付フォーマット」

関数


# ------------------------------------------------------------------
# 日付でファイルのローテーションを行う
# 関数名:Rotate-Daily
# 引数 :FilePath ファイルパス
# :DailyRollingFormat 日付フォーマット(デフォルト:yyyy-MM-dd)
# 戻り値:なし
# ------------------------------------------------------------------
function Rotate-Daily([String]$FilePath,[String]$DailyRollingFormat = "yyyy-MM-dd"){
# ファイルが存在する場合
if(Test-Path -LiteralPath $FilePath -PathType Leaf){
# ファイル作成日
$creationDate = $(Get-ItemProperty $FilePath).CreationTime.ToString($DailyRollingFormat)
# 現在日付
$currentDate = Get-Date -Format $DailyRollingFormat
# ローテート対象
if($creationDate -ne $currentDate){
$dailyRollingName = (Split-Path $FilePath -Leaf) + "." + $creationDate
$dailyRollingPath = Join-Path -path (Split-Path $FilePath -Parent) -ChildPath $dailyRollingName
Move-Item -LiteralPath $FilePath -Destination $dailyRollingPath -Force
}
}
}

2013年9月3日火曜日

ファイル名に角括弧[]がついてるとRename-Itemで失敗する

概要

ファイル名に角括弧[]がついてるとRename-Itemで失敗するので、Move-Itemを代用する

関数

# ------------------------------------------------------------------
# ファイル名をリネームする
# 関数名:Rename-File
# 引数  :FilePath 名前を変更するファイルパス
#       :NewFileName 新しいファイル名前
# 戻り値:なし
# ------------------------------------------------------------------
function Rename-File([String]$FilePath, [String]$NewFileName){
  if(Test-Path -LiteralPath $FilePath -PathType Leaf){
    $newFilePath = Join-Path -Path (Split-Path $FilePath -Parent) -ChildPath $NewFileName
    Move-Item -LiteralPath $FilePath -Destination $newFilePath
  }else{
    Write-Host "ファイルが存在しません。ファイル名[ $FilePath ]"
  }
}
 
# ------------------------------------------------------------------
# フォルダ名をリネームする
# 関数名:Rename-Folder
# 引数  :FolderPath 名前を変更するフォルダパス
#       :NewFolderName 新しいフォルダ名前
# 戻り値:なし
# ------------------------------------------------------------------
function Rename-Folder([String]$FolderPath, [String]$NewFolderName){
  if(Test-Path -LiteralPath $FolderPath -PathType Container){
    $newFolderPath = Join-Path -Path (Split-Path $FolderPath -Parent) -ChildPath $NewFolderName
    if(Test-Path -LiteralPath $FolderPath -PathType Container){
      Write-Host "既に存在するフォルダを作成することはできません。フォルダー名[ $FolderPath ]"
    }else{
      Move-Item -LiteralPath $FolderPath -Destination $newFolderPath
    }
  }else{
    Write-Host "フォルダが存在しません。フォルダ名[ $FolderPath ]"
  }
}

実行例

Rename-File -FilePath "C:\[20130903]新規要件定義\[20130903]Webログイン.xls" -NewFileName "Webログイン.xls"
Rename-Folder -FolderPath "C:\[20130903]新規要件定義" -NewFolderName "[20130903]要件定義"

2013年8月29日木曜日

ログレベルによって出力するログを制御する

概要

開発環境・本番環境等でログに出すログレベルが違うので制御できるように関数を作成する

・ログ出力は「Out-LogFile」関数を使用する。なのでログレベルはそれに合わせる。
・引数は出力する文字列のみとする。それ以外の「Out-LogFile」関数に必要な引数を先に指定する。

関数


# ------------------------------------------------------------------
# デバッグログをファイルに出力する
# 関数名:Write-DebugLog
# 引数 :Value ログとして出力する文字列
# 戻り値:なし
# ------------------------------------------------------------------
function Write-DebugLog([String]$VALUE){
if($LogLevel-le 0){
Out-LogFile -LogFilePath $LogFilePath -Value $Value -LogType 0 -LogEncoding $LogEncoding
}
}
# ------------------------------------------------------------------
# 情報ログをファイルに出力する
# 関数名:Write-InfoLog
# 引数 :Value ログとして出力する文字列
# 戻り値:なし
# ------------------------------------------------------------------
function Write-InfoLog([String]$VALUE){
if($LogLevel -le 1){
Out-LogFile -LogFilePath $LogFilePath -Value $Value -LogType 1 -LogEncoding $LogEncoding
}
}
# ------------------------------------------------------------------
# 警告ログをファイルに出力する
# 関数名:Write-WarnLog
# 引数 :Value ログとして出力する文字列
# 戻り値:なし
# ------------------------------------------------------------------
function Write-WarnLog([String]$VALUE){
if($LogLevel -le 2){
Out-LogFile -LogFilePath $LogFilePath -Value $Value -LogType 2 -LogEncoding $LogEncoding
}
}
# ------------------------------------------------------------------
# エラーログをファイルに出力する
# 関数名:Write-ErrorLog
# 引数 :Value ログとして出力する文字列
# 戻り値:なし
# ------------------------------------------------------------------
function Write-ErrorLog([String]$VALUE){
if($LogLevel -le 3){
Out-LogFile -LogFilePath $LogFilePath -Value $Value -LogType 3 -LogEncoding $LogEncoding
}
}
view raw Write-Log.ps1 hosted with ❤ by GitHub

実行例

### 最初に設定を指定
# ログファイル出力先を指定
[String]$LogFilePath ="C:\common.log"
# ログエンコードを指定
[String]$LogEncoding="UTF8"
# ログレベルを指定する(0:デバック,1:情報,2:警告,3:エラー)
[Int]$LogLevel=1

# 実行例
for ($i = 0; $i -lt 100; $i++) {
  Write-DebugLog -VALUE "デバッグ"
  Write-InfoLog -VALUE "情報"
  Write-WarnLog -VALUE "警告"
  Write-ErrorLog -VALUE "エラー" 
}

2013年8月27日火曜日

ファイル名、フォルダ名をリネームする

概要

何度もフォルダを右クリックして名前変更していくのが大変なので関数化する

変更するファイル名、フォルダ名とリネームする名前を指定して実行
・指定した「ファイル名」「フォルダ名」が存在しない場合はメッセージ出力してなにもしない

関数


# ------------------------------------------------------------------
# ファイル名をリネームする
# 関数名:Rename-File
# 引数 :FilePath 名前を変更するファイルパス
# :NewFileName 新しいファイル名前
# 戻り値:なし
# ------------------------------------------------------------------
function Rename-File([String]$FilePath, [String]$NewFileName){
if(Test-Path -LiteralPath $FilePath -PathType Leaf){
Rename-Item $FilePath -newName $NewFileName
Write-Host "ファイル名を変更しました。置換前[ $FilePath ] 置換後[ $NewFileName ]"
}else{
Write-Host "ファイルが存在しません。ファイル名[ $FilePath ]"
}
}
view raw Rename-File.ps1 hosted with ❤ by GitHub

# ------------------------------------------------------------------
# フォルダ名をリネームする
# 関数名:Rename-Folder
# 引数 :FolderPath 名前を変更するフォルダパス
# :NewFolderName 新しいフォルダ名前
# 戻り値:なし
# ------------------------------------------------------------------
function Rename-Folder([String]$FolderPath, [String]$NewFolderName){
if(Test-Path -LiteralPath $FolderPath -PathType Container){
Rename-Item $FolderPath -newName $NewFolderName
Write-Host "フォルダー名を変更しました。置換前[ $FolderPath ] 置換後[ $NewFolderName ]"
}else{
Write-Host "フォルダーが存在しません。フォルダー名[ $FolderPath ]"
}
}

実行例

PS > Rename-File -FilePath "C:\新規テキスト ドキュメント.txt" -NewFileName "test.txt"
PS > Rename-Folder -FolderPath "C:\新しいフォルダ" -NewFolderName "sample"

メモ

フォルダ・ファイル存在チェック「Test-Path」

・ファイル存在チェック

PS > Test-Path -LiteralPath <<ファイル名(フルパス)>> -PathType Leaf

・フォルダ存在チェック

PS > Test-Path -LiteralPath <<フォルダ名(フルパス)>> -PathType Container

フォルダ・ファイル名の変更「Rename-Item」

PS > Rename-Item <<ファイル名・フォルダ名(フルパス)>> -newName <<新規ファイル・フォルダ名>>

PowerShellでログ出力

概要

PowerShellでログ出力ができるように関数を作成する

ログ出力するファイルパスと出力内容、ログレベル、文字コードを指定して実行
・ログレベルは「デバック(0)」「情報(1)」「警告(2)」「エラー(3)」のみ
・ログメッセージの形式は「ログ出力時刻 [ログレベル] : ログ内容」
・ログ出力時刻のフォーマットは「yyyy/MM/dd HH:mm:ss.fff」

関数


# ------------------------------------------------------------------
# ログをファイルに出力する
# 関数名:Out-LogFile
# 引数 :LogFilePath ログファイルパス
# :Value ログとして出力する文字列
# :LogType ログの種類(0:デバック,1:情報,2:警告,3:エラー)
# 指定がない場合は「情報」として出力
# :Encoding 文字コード
# 指定がない場合は「UTF8」として出力
# 戻り値:なし
# ------------------------------------------------------------------
function Out-LogFile([String]$LogFilePath,[String]$Value,[Int]$LogType=1,[String]$LogEncoding="utf8"){
# 日付のフォーマット
[String]$LogDateFormat = "yyyy/MM/dd HH:mm:ss.fff"
if($Value){
switch ($LogType){
0{ [String]$log = (Get-Date -Format $LogDateFormat) + " [DEBUG] : " + $Value }
1{ [String]$log = (Get-Date -Format $LogDateFormat) + " [INFO ] : " + $Value }
2{ [String]$log = (Get-Date -Format $LogDateFormat) + " [WARN ] : " + $Value }
3{ [String]$log = (Get-Date -Format $LogDateFormat) + " [ERROR] : " + $Value }
}
Write-Output $Log | Out-File -FilePath $LogFilePath -Encoding $LogEncoding -append
}
}
view raw Out-LogFile.ps1 hosted with ❤ by GitHub

実行例

for ($i = 0; $i -lt 100; $i++) {
  Out-LogFile -LogFilePath "C:\app.log" -Value "デバックログを出力します。" -LogType 0
  Out-LogFile -LogFilePath "C:\app.log" -Value "情報ログを出力します。" -LogType 1
  Out-LogFile -LogFilePath "C:\app.log" -Value "警告ログを出力します。" -LogType 2
  Out-LogFile -LogFilePath "C:\app.log" -Value "エラーログを出力します。" -LogType 3
  Out-LogFile -LogFilePath "C:\app.log" -Value "ログの種類を指定しない場合、情報ログを出力します。"
}

「Out-File」と「Set-Content」の違い

別プロセスからの読み込み/書き込み

・「Out-File」の場合、ファイルを読み込むことは可能だが書き込むことはできない
・「Set-Content」の場合、ファイルを読み込むことも書き込むこともできない

2013年8月16日金曜日

Windowsでファイル名に使用できない禁止文字を全角に変換する

概要

mp3ファイルのタグ情報からファイル名にしようとするとき、ファイル名に使用できない禁止文字「\/:*?`"><|」が存在するため
全角「¥/:*?`”><|」に変換して対応する

関数


# ------------------------------------------------------------------
# Windowsでファイル名に使用できない禁止文字を全角に変換する
# 関数名:ConvertTo-UsedFileName
# 引数 :FileName ファイル名
# 戻り値:変換後のファイル名
# ------------------------------------------------------------------
function ConvertTo-UsedFileName([String]$FileName){
# 禁止文字(半角記号)
$CannotUsedFileName = "\/:*?`"><|"
# 禁止文字(全角記号)
$UsedFileName = "¥/:*?`”><|"
for ($i = 0; $i -lt $UsedFileName.Length; $i++) {
$FileName = $FileName.Replace($CannotUsedFileName[$i], $UsedFileName[$i])
}
return $FileName
}

実行例

# 実行
PS > ConvertTo-UsedFileName -FileName "6/2*(1+2)=?.txt"

2013年8月14日水曜日

Excelをシート単位で検索する

概要

Excelで書かれた設計書から修正対象となる項目をいちいち開いて検索するのはめんどうなので、
指定したExcelファイルからシート単位で検索できるようにする
(行列まで調べるようにしたらやたら遅いのでやめた)


検索対象となるExcelファイルと検索する対象項目を指定して実行
・Excelファイルかどうかの判定は行わない
・検索対象が存在する場合は検索結果に「Excelファイル名(フルパス)」「ワークシート名」を返すようにする

関数


# ------------------------------------------------------------------
# Excelファイルをシート単位で検索
# 関数名:Select-ExcelByWorkSheet
# 引数 :ExcelFilePath 検索対象のExcelファイル
# :Target 検索対象項目
# 戻り値:検索結果
# ------------------------------------------------------------------
function Select-ExcelByWorkSheet([String]$ExcelFilePath, [String]$Target){
# 検索結果
$result = @()
# Excel のインスタンスを作成
$excel = New-Object -comobject Excel.Application
# Excelファイルを開かない
$excel.Visible = $False
# 確認メッセージを非表示
$excel.DisplayAlerts = $False
# ワークブックを開く
$workBook = $excel.Workbooks.Open($excelFilePath)
# ワークシート分ループ
foreach($workSheet In $workBook.workSheets){
# 検索対象が存在するか確認
if($workSheet.UsedRange.Find($Target) -ne $Null){
# オブジェクト作成
$value = New-Object PSCustomObject -Property @{
# Excelファイル名(フルパス)
ExcelFilePath = $excelFilePath
# ワークシート名
WorkSheet = $workSheet.Name
}
$result += $value
}
}
$workBook.Close()
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($workBook)
$excel.Quit()
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel)
return $result
}

実行例

# 検索対象となるフォルダを指定
$FolderPath = "C:\Project\03.基本設計"
# 検索対象
$Target = "ユーザマスタ"

# 指定したフォルダからExcelファイル「xls」「xlsx 」を取得して検索する
Get-ChildItem $FolderPath -Recurse -Include *.xls,*.xlsx |
  ForEach-Object {
    # 検索
    Select-ExcelByWorkSheet -ExcelFilePath $_.FullName -Target $Target
  }

メモ

.Net Frameworkよりインスタンスを生成する

# インスタンス生成
PS > オブジェクト変数 = New-Object クラスの完全修飾名(引数)
# メソッドにアクセス
PS > オブジェクト変数.メソッド名(引数)

・.NET Framework からCOMオブジェクトを使用する

PS > オブジェクト変数 = New-Object -comobject クラスの完全修飾名(引数)

2013年8月11日日曜日

ExIf情報より画像ファイルを撮影日ごとにフォルダ分けする

概要

デジカメで撮った画像が1つのフォルダの中にたまってしまっているので
ExIf情報より撮影日ごとにフォルダ分けて整理する
・今回はmove(移動)ではなくてcopy(コピー)にする

コピー元(フォルダ)とコピー先(フォルダ)を指定して実行
・指定したコピー元が存在しない場合はコピーを行わない
・指定したコピー先が存在しない場合は作成してコピーを行う
・対象ファイルは「jpeg」「jpg」固定(大文字・小文字は気にしない)
・ExIf情報に撮影日時が存在しない場合は「unknown」フォルダに移動
・コピー先に対象ファイルが存在する場合はメッセージを出力してコピーしない

関数


# ------------------------------------------------------------------
# 画像ファイル(jpeg,jpg)を撮影日ごとにフォルダ分けする
# 関数名:Copy-ImagesByDateTimeOriginal
# 引数 :CopyFolderPath コピー元のフォルダパス
# :DestFolderPath コピー先のフォルダパス
# 戻り値:なし
# ------------------------------------------------------------------
function Copy-ImagesByDateTimeOriginal([String]$CopyFolderPath, [String]$DestFolderPath){
# EXIFタグ一覧より撮影日時のIDを指定
$DateTimeOriginalId = "36867"
# EXIFの撮影日時のフォーマット
$DateTimeFormat = "yyyy:MM:dd HH:mm:ss`0"
# コピー元の指定したフォルダのチェック
if(-not(Test-Path $CopyFolderPath)){
Write-Host "指定したコピー元フォルダが存在しません"
break
}
# コピー先の指定したフォルダが存在しない場合に作成
$destItem = New-Item $DestFolderPath -Type directory -Force
# 拡張子(jpeg、jpg)のファイルのみ
Get-ChildItem $CopyFolderPath -Recurse -Include *.jpeg ,*.jpg |
ForEach-Object {
# 画像ファイルを読み込み、撮影日時のオブジェクト取得
$image = [System.Drawing.Imaging.Metafile]::FromFile($_.FullName)
$propertyItem = $image.PropertyItems | Where-Object {$_.Id -eq $DateTimeOriginalId}
# 撮影日時が取得できない場合「unknown」フォルダを作成
if($propertyItem -ne $Null){
# EXIFの撮影日時のフォーマットが「YYYY:MM:DD HH:MM:SS」のため日付に変換
$value = $image.GetPropertyItem($DateTimeOriginalId).Value
$DateTimeOriginal = [System.Text.Encoding]::ASCII.GetString($value)
$date = [DateTime]::ParseExact($DateTimeOriginal,$DateTimeFormat,$Null).ToString("yyyyMMdd")
}else{
$date = "unknown"
}
# フォルダを作成
$createFolderPath = Join-Path -Path $DestFolderPath -ChildPath $date
$destFolderItem = New-Item $createFolderPath -Type directory -Force
# 作成したフォルダに画像ファイルをコピー
$destFilePath =  Join-Path -Path $createFolderPath -ChildPath $_.Name
if(Test-Path $destFilePath){
Write-Host "すでに存在します。コピー先 : [$destFilePath]"
return
}
$destFileItem = Copy-Item -Path $_.FullName -Destination $destFilePath
# 閉じる
$image.Dispose()
}
}

実行例

# 実行
PS > Copy-ImagesByDateTimeOriginal -CopyFolderPath "C:DCIM" -DestFolderPath "C:DateTimeOriginal"

メモ

.Net Frameworkを呼び出す

[完全修飾名のクラス]::静的メソッド(引数)

画像ファイルのメタデータを取得

PS > [System.Drawing.Imaging.Metafile]::FromFile(<<画像ファイルのフルパス>>)
例)
PS >[System.Drawing.Imaging.Metafile]::FromFile("C:\DateTimeOriginal\Blue hills.jpg")

Tag                  : 
PhysicalDimension    : {Width=800, Height=600}
Size                 : {Width=800, Height=600}
Width                : 800
Height               : 600
HorizontalResolution : 300
VerticalResolution   : 300
Flags                : 77960
RawFormat            : [ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format24bppRgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {282, 283, 296, 20515...}
PropertyItems        : {282, 283, 296, 20515...} 

フォルダ配下の指定した拡張子のファイル情報を取得(Get-ChildItem)

・引数[-Include]を指定して対象となる拡張子のファイル情報を取得
※複数の拡張子を指定する場合はカンマ「,」を使用
※拡張子の大文字、小文字は気にする必要はなし

PS > Get-ChildItem -Path <<フォルダのフルパス>> -Recurse -Include *.<<拡張子>>, *.<<拡張子>>
■補足
例1)フォルダ・ファイル情報を取得
PS > Get-ChildItem -Path C:\sample

    ディレクトリ: C:\sample


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2013/07/09     13:59            sample
-a---        2013/07/09     13:57          0 sample1.txt
-a---        2013/07/09     13:58          0 sample2.txt
例2)そのまま引数「Include」で拡張子を指定したが取得できない
PS > Get-ChildItem -Path C:\sample -Include *.txt

# 表示されない
例3)「フォルダのフルパス」の後ろに「\*」を追加して取得可能
PS > Get-ChildItem -Path C:\sample\* -Include *.txt

    ディレクトリ: C:\sample


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/07/09     13:57          0 sample1.txt
-a---        2013/07/09     13:58          0 sample2.txt

※サブフォルダ配下取得する場合(Recurseを指定)は特に気にしなくてよかった

パスと子パスを 1 つのパスに結合「Join-Path」

PS > Join-Path -Path <<パス>> -ChildPath <<子パス>>

2013年8月7日水曜日

フォルダ構成のみコピーする

概要

システム開発を行っている中で同一のフォルダ構成を作成する場合がある
・現行プロジェクトのフォルダ構成を新規プロジェクトにも適用
・ソースファイル/設定ファイル等の修正前後の差分をフォルダ構成含めて確認

コピー元(フォルダ)とコピー先(フォルダ)を指定して実行
・指定したコピー元が存在しない場合はコピーを行わない
・指定したコピー先が存在しない場合は作成してコピーを行う
・コピー元のフォルダがコピー先に存在する場合は上書き
・コピー先にコピー元に存在しないフォルダが存在する場合そのまま

関数


# ------------------------------------------------------------------
# コピー元のフォルダ構成をコピー先にコピーする
# 関数名:Copy-Folder
# 引数  :CopyFolderPath コピー元のフォルダフルパス
# DestFolderPath コピー先のフォルダフルパス
# 戻り値:なし
# ------------------------------------------------------------------
function Copy-Folder([String]$CopyFolderPath, [String]$DestFolderPath){
# コピー元の指定したフォルダのチェック
if(-not(Test-Path $CopyFolderPath)){
Write-Host "指定したコピー元フォルダが存在しません"
break
}
# コピー先の指定したフォルダが存在しない場合は作成
$destItem = New-Item $DestFolderPath -Type directory -Force
# コピー元配下のフォルダをコピー
Get-ChildItem $CopyFolderPath -Recurse | Where { $_.mode -match "d" } |
ForEach-Object {
# フォルダ名の大文字小文字を区別しないので小文字に統一して作成
$destFullName = $_.FullName.ToLower().Replace($CopyFolderPath.ToLower(), $DestFolderPath)
$destItem = New-Item $destFullName -Type directory -Force
}
}
view raw Copy-Folder.ps1 hosted with ❤ by GitHub

実行例

# 実行
PS > Copy-Folder -CopyFolderPath "C:\Project123" -DestFolderPath "C:\Project345"

メモ

新規にフォルダ・ファイルを作成「New-Item」

・引数[-Type directory]を指定して新規にフォルダを作成する

PS > New-Item <<フォルダのフルパス>> -Type directory

・引数[-Type file]を指定して新規にファイルを作成する
PS > New-Item <<ファイルのフルパス>> -Type file

・引数[-Force]を指定して強制上書きする
PS > New-Item <<ファイルのフルパス>> -Type file -Force

フォルダ配下のフォルダ・ファイル情報を取得「Get-ChildItem」

・フォルダ配下のみ取得する

PS > Get-ChildItem -Path <<フォルダのフルパス>>

・引数[-Recurse]を指定してサブフォルダ配下も再帰的に取得する
PS > Get-ChildItem -Path <<フォルダのフルパス>> -Recurse
例1) 「C:\sample」フォルダ配下のフォルダ・ファイル情報を取得
PS > Get-ChildItem -Path C:\sample

    ディレクトリ: C:\sample


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2013/07/09     13:59            sample
-a---        2013/07/09     13:57          0 sample1.txt
-a---        2013/07/09     13:58          0 sample2.txt
例2)「C:\sample」フォルダのサブフォルダ配下も含めてフォルダ・ファイル情報を取得
PS > Get-ChildItem -Path C:\sample -Recurse

    ディレクトリ: C:\sample


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2013/07/09     13:59            sample
-a---        2013/07/09     13:57          0 sample1.txt
-a---        2013/07/09     13:58          0 sample2.txt


    ディレクトリ: C:\sample\sample


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2013/07/09     13:57          0 sample1_2.txt
-a---        2013/07/09     13:58          0 sample2_2.txt

Get-ChildItemで取得した「Mode(属性)」

Mode(属性) 内容
d フォルダ
a ファイル
r 読み取り専用
h 隠しファイル
s システムファイル

文字列すべてを小文字に変換「ToLower()」

・メソッド[ToLower()]を使用して小文字に変換

PS > <<文字列>>.ToLower()
例) 英大文字を英小文字に変換
PS > $value = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
PS > $value = $value.ToLower()
PS > $value

abcdefghijklmnopqrstuvwxyz

2013年8月1日木曜日

システム日付取得

自宅のWikiサーバーが壊れたため、今後ブログにて技術系のメモをとる
select sysdate from dual;