2013年2月21日木曜日

◆日付・時刻をファイル名にしてDBをバックアップ

普通のサーバー管理者はSQLでやるのでしょうが、日付をファイル名にする場合はやっぱりPowerShellの方が楽。

001
002
003

$now = (get-date).ToString("yyyyMMddHHmmss")
Backup-SqlDatabase -Database Northwind
 `
 
-BackupFile "D:\DBBackup\test\$now.bak" -ServerInstance localhost

「ServerInstance」はローカルなら省略できても良さそうだが、省略するとエラーになった。

◆sqlps in ver3.0

2012ServerでSQLServer用PowerShell(sqlps)を開いてみたら、何やら以下のようなエラーが発生。(Windows Server 2012,SQL Server 2012)

image

どうもユーザープロファイルで「SharePoint」のスナップインをAddしているのが宜しくない模様。

何で?

見てみると、PSバージョンが2.0何ですね。

image

ん~、こんなものなのか、何か追加が必要なのか・・・。


何となく、Ver3では「sqlps」自体不要なのかも?。

「SSMS」でメニューに表示されるのでつい開いてしまいがちだが、
image

こいつはあくまでも2008ServerなどにSQLServerを入れた時用かもしれない。
2012Serverなら環境を判断して切り替えるくらいのスマートさがあっても良い気はするが・・・。

2013年2月14日木曜日

◆型名のエイリアス(アクセラレータ)表示

PowerShellでは.Netクラスへのアクセスを簡易にすべく「TypeAccelerators」なるものが用意されている。

どんな時に使われるかというと、[System.Xml.XmlDocument]なんてクラスにアクセスする時に[xml]といった短い名前でのアクセスを提供してくれる。

C#言語が提供する「int」や「string」といった型名と同じ感じだ。

どんなものが用意されているかは以下で確認できる。

001
002

$clsAccelerators = "System.Management.Automation.TypeAccelerators"
[psobject].Assembly.GetType($clsAccelerators)::Get

image

ここで、「Get」というのは「TypeAccelerators」クラスのStaticプロパティだ。

また、自分でこの名前を追加することもできる。
以下の例では[System.IO.Path]に[Path]という名前を付けている。

001
002
003
004

$clsAccelerators = "System.Management.Automation.TypeAccelerators"
[psobject].Assembly.
GetType(
 
$clsAccelerators)::Add("Path",[System.IO.Path])
[Path]::DirectorySeparatorChar

◆「【改訂新版】Windows PowerShell ポケットリファレンス」

我らが牟田口さんのポケットリファレンスがVer3に対応して発売されるそうです。

PowerShellは本当に守備範囲が広がり、全体を俯瞰するのが難しくなっているので、この様な本があると重宝しますよね。

2013年2月8日金曜日

◆全角の日付を計算する

全角の日付に対して演算をするには日付型に変換してから計算し、元に戻してあげる。(そのまま計算する方法なんてあるのだろうか・・・、きっとローカルだから無いような・・・)

ちょっとべたな感じいっぱいだが、とりあえずこんな感じでいけそう。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019

function Add-KnajiDate($date,$days)  
{ 
 
[char[]]$zen2han = "0","1","2","3","4","5","6","7","8","9"
  $targetDay = $date
  $targetDay =
 
   
-join ([char[]]$targetDay |
 
   
%{if($zen2han.IndexOf($_) -ge 0){$zen2han.IndexOf($_)}else{$_
}})

 
$culture =
 
   
New-Object System.Globalization.CultureInfo -argumentlist "ja-JP",$true
  $culture.DateTimeFormat.Calendar =
 
   
New-Object System.Globalization.JapaneseCalendar
  $parsedTargetDay =
 
   
[DateTime]::ParseExact($targetDay, "ggyy年M月d日",$culture
)
 
-join([string[]][char[]]$parsedTargetDay.AddDays($days).
ToString(
   
"gyy年M月d日",$culture) | %{if($_ -match '\d'){$zen2han[$_]}else{$_
}})
}


Add-KnajiDate "平成24年2月8日" 3

image

2013年2月6日水曜日

◆CABファイルを作る

PowerShell: ◆CABファイルを展開するでは「Shell.Application」を使ったが、作成する方はこいつでは無く単独のアプリケーション「makecab.exe」を使うようだ。

展開の時と同様にWindows PowerShell で .CAB ファイルを作成するにサンプルがあるので使わせてもらった。
ただし、そのままでは動かなかったので若干修正している。

作り方としては、先頭に設定パラメータ、続いて圧縮対象となるファイル群のパスを含めた定義ファイル(Directive File)を作る。

あとは「makecab.exe」に定義ファイルを渡して起動するだけ。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027

Function New-Cab($tagetFolderPath,$outFolderPath)
{
 
$ddfFile = [System.IO.Path]::
GetTempFileName()

 
$ddfHeader =
@"
;*** MakeCAB Directive file
;
.OPTION EXPLICIT
.Set CabinetNameTemplate=Cab.*.cab
.set DiskDirectory1=$outFolderPath
.Set MaxDiskSize=CDROM
.Set Cabinet=on
.Set Compress=on
"@


  $ddfHeader | Out-File -filepath $ddfFile -force -encoding ASCII

  Get-ChildItem -path $tagetFolderPath | ?{ !$_.psiscontainer } | %
{ 
     
'"' + $_.fullname.tostring() + '"' |
 
     
Out-File -filepath $ddfFile -encoding ASCII -append
  }

 
makecab /f $ddfFile
  del $ddfFile
} #end New-DDF

New-Cab "F:\Desktop\wk" "F:\Desktop"

◆関数を削除する

中身を良く判らずにサンプルを取り込んで使っていると不可解なエラーに悩まされることがある。

今回はそのパターンの一つ。

どうにもこうにもエラーメッセージからは何が起きているのが見当がつかない。
仕方がないのでステップ実行すると突然あらぬところへ飛んでいきループが始まる。

やっと気づいた。

サンプルで使っていたネイティブなコマンドと自分で追加した関数の名前がかぶっている。(><)

ちゃんとコマンドレットっぽい関数名にすればこんなことは起きないのだが、オレオレ関数とコマンドレットの区別がつきづらく好きではない。

で、関数名を修正しこれでOKと思ったらどうにも直らない・・・。

あ~、名前を変えただけじゃなく削除しなきゃダメなのね。

PowerGUIの場合、「Reset RunSpace」なるアドオンがあってクリアできるのだが本家PowerShell_ISEでは出来そうもない。

再起動すればよいのだが、タブを沢山開いているとちょっと面倒。

という訳でピンポイントで関数を削除するには・・・。

あれぇ、コマンドがみつからない。

あ~、もしかして単純に「del function:hoge」かな。

 

余談だが、PowerShell_ISE君、ソースをドロップして開けないのね・・・。

この間のコメント化機能といい、どうしてこんなアプリケーションの基本中の基本の機能が無いのでしょう。

PowerGUIはVer3版で使うと良くフリーズするし・・・。
どなたかお勧めの環境はありませんか?