2013年2月28日木曜日

◆ローカルユーザーアカウントを列挙する

001
gcim win32_useraccount -Filter "LocalAccount='true'"

image

gwmiを使っても基本的には同じ。

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版で使うと良くフリーズするし・・・。
どなたかお勧めの環境はありませんか?

◆CABファイルを展開する

InfoPathのテンプレート(XSNファイル)をSharePoint2010からSharePoint2013に移行しようとしている。

残念なことにXSNファイル内にサーバーURLがハードコードされているので、そのままでは持って行けない。

テキストに変換して一括で修正できないか?

最近のパターンからするとZIP展開するとテキスト(xml)ファイルが出てくるパターンかと思ったのだがそうでもなさそう。

調べてみるとどうやらZIP形式ではなく、CABなんだそうな・・・。

PowerShellでのCABファイル操作を調べてみると以下にサンプルがあったので使わせてもらう。
Windows PowerShell で .CAB ファイルを作成する

展開処理を最小限に抜き出すとこんな感じ。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015

Function ConvertFrom-Cab()
{

Param
(
 
$cab ,
  $destination
)
 
$comObject = "Shell.Application"
  $shell = New-Object -Comobject $comObject
  if(!$?) { $(Throw "unable to create $comObject object"
)}
 
$sourceCab = $shell.Namespace($cab).
items()
 
$DestinationFolder = $shell.Namespace($destination
)
 
$DestinationFolder.CopyHere($sourceCab
)
}


ConvertFrom-Cab -cab "F:\Test.cab" -destination "F:\Desktop\wk"

ファイルの拡張子はXSNのままではうまくいかなかったのでCABにリネームした。

最初は気づかなかったが、ミニマムにしたソースを見てみるとZIPの解凍に似ている。

っていうか、もしかして同じ?

以前作ったZIP解凍のソースを見てみたら、同じですねぇ。

だから拡張子をCABにしないとダメなのね・・・。

◆コンストラクタを表示する

TypeのGetConstructorsメソッドで確認できる。

image

2013年2月5日火曜日

◆ネットワークカードの速度を表示

001
002
003

[System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | 
 
ft Description,OperationalStatus,
    @{n="Speed(M)";e={($_.speed/1000000).tostring("0.0").padleft(8)}} -auto

image

2013年2月4日月曜日

◆SharePoint InfoPathフォーム テンプレートをアクティブ化する

PowerShell: ◆SharePoint InfoPathフォーム(xsn)をアップロードするでアップロードしたテンプレートは、そのままではまだ使えない。

テンプレートを使いたいサイトコレクションごとに「アクティブ化」という作業が必要になる。

GUIでの作業は、サーバー側の管理サイト「サーバー全体の管理」から行う方法と、サイトコレクションの「サイトの設定」から行う方法の2通りがある。

<サーバー全体の管理>

  • 「サーバー全体の管理」「アプリケーション全般設定」「フォームテンプレートの管理」をクリック
  • 「フォームテンプレートの管理」画面でテンプレートが一覧表示されるので対象のテンプレートのドロップダウンを表示させて「サイトコレクションへのアクティブ化」をクリック
    image
  • 「フォームテンプレートのアクティブ化」画面が表示されるので、アクティブ化したいサイトコレクションを選択し「OK」をクリック
    image

<サイトコレクション・サイト設定>

  • サイトコレクションのトップサイトを開く
  • 設定ボタンをクリックし、表示されたメニューから「サイトの設定」をクリック
    image
  • 表示された「サイトの設定」画面から「サイトコレクションの管理」「サイトコレクションの機能」をクリック
    image
  • 表示された「サイトコレクションの機能」画面でアップロードしたテンプレートを探し「アクティブ化」ボタンをクリックする
    image

<PowerShellでの設定>

PowerShellからは「Enable-SPInfoPathFormTemplate」コマンドレットを使えば一発で設定が可能だ。

>Enable-SPInfoPathFormTemplate -Identity xsnファイル名 -Site サイト

前回のテンプレートアップロード時に一緒にやってしまえば良いだろう。

このコマンドは既に「アクティブ」な機能に対して行うとエラーが返ってくるので(無視しても良いが)一応確認してから登録することにした。

アクティブな機能を取ってくるのはとりあえず以下のような感じ。(ベストかとどうかは判らない)

>(Get-SPSite "http://sv/sites/hoge").Features | % properties | ? name -eq "OriginalFileName" | % value

登録するInfoPathファイルがここで返ってくるコレクションに含まれるかチェックすればよい。

前回のアップロードに今回の「アクティブ化」を追加したのが以下のソース。

001
002
003
004
005
006
007
008
009
010
011
012
013
014

#サイトコレクション取得
$Root = "http://sv01/sites/hoge"
$siteCol = Get-SPSite $Root
#InfoPathフォームアップロード&アクティブ化
$xsnDocs = $siteCol.Features |
 
 
% properties | ? name -eq "OriginalFileName" | % value
$oldSitePath =
 
 
"\\spsv2010\DavWWWRoot\sites\site1\FormServerTemplates"  #旧サイト
dir $oldSitePath | %
{
   
Install-SPInfoPathFormTemplate -Path $_.
FullName
   
if($xsnDocs -notcontains $_.
Name){
       
Enable-SPInfoPathFormTemplate -Identity $_.Name -Site $Root
    }
}

◆リモートマシンのドライブにデフラグが必要か調べる

PowerShell: ◆各ドライブにデフラグが必要か調べるのリモート版。

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

function DefragAnalysis($computer)
{
 
gwmi win32_logicaldisk -Filter DriveType=3 | %
{
   
$drive = $_.
DeviceID
   
$disk =
 
     
gwmi win32_volume -Filter "DriveLetter='$drive'" -Comp $computer
    $def = 1 | select ComputerName,Drive,DefragRecommended
    $def.ComputerName = $computer
    $def.Drive = $drive
    $def.DefragRecommended =
 
      (
Invoke-WmiMethod -Path $($disk.
__PATH)  `
          
-Name DefragAnalysis).
DefragRecommended
   
$def
  } 
}


$computers = "sv01","sv02","sv03"
$computers | %{DefragAnalysis $_} | ft -AutoSize

「Win32_volume」オブジェクトの「DefragAnalysis」メソッドを「Invoke-WmiMethod」で呼ぶ。

ただし、リモートに対してオブジェクトを渡せないので「__PATH」プロパティに持っているシリアライズされた情報を渡すって感じでしょうか。

image

2013年2月1日金曜日

◆SharePoint InfoPathフォーム(xsn)をアップロードする

2010のSharePointでInfoPathを使ったライブラリがいくつかあるので2013に持ってきて使えるようにしたい。

まずはTemplateを登録する。

GUIでやるには、

  • 「サーバー全体の管理」「アプリケーションの全般設定」「フォームテンプレートの管理」をクリック
    image
  • 表示された「フォームテンプレートの管理」画面で「フォームテンプレートのアップロード」をクリック
    image
  • 「フォームテンプレートのアップロード」画面が表示されるので「参照」ボタンをクリックして該当の「xsn」ファイルを指定してアップロードする

これをPowerShellでやるには「Install-SPInfoPathFormTemplate」コマンドレットを使えば良い。
アップロードしたい「xsn」ファイルを引数に指定するだけで簡単にアップロードできる。

旧2010SharePointシステムからWebDav経由でテンプレートを取ってきてインストールするにはこんな感じになる。

001
002
003
004

$oldSitePath = 
 
"\\spsv2010\DavWWWRoot\sites\site1\FormServerTemplates"  #旧サイト
dir $oldSitePath |
 
 
%{Install-SPInfoPathFormTemplate -Path $_.FullName}

◆各ドライブにデフラグが必要か調べる

Win32_VolumeのDefragAnalysisメソッドが使える。

001
002
003
004
005
006
007
008

gwmi win32_logicaldisk -Filter DriveType=3 | %{
 
$drive = $_.
DeviceID
 
$disk = gwmi win32_volume -Filter "DriveLetter='$drive'"
  $def = 1 | select Drive,DefragRecommended
  $def.Drive = $drive
  $def.DefragRecommended = ($disk.DefragAnalysis()).
DefragRecommended
 
$def
} | ft -auto

image