001 | gcim win32_useraccount -Filter "LocalAccount='true'" |
gwmiを使っても基本的には同じ。
普通のサーバー管理者はSQLでやるのでしょうが、日付をファイル名にする場合はやっぱりPowerShellの方が楽。
001 002 003 | $now = (get-date).ToString("yyyyMMddHHmmss") Backup-SqlDatabase -Database Northwind ` -BackupFile "D:\DBBackup\test\$now.bak" -ServerInstance localhost |
「ServerInstance」はローカルなら省略できても良さそうだが、省略するとエラーになった。
2012ServerでSQLServer用PowerShell(sqlps)を開いてみたら、何やら以下のようなエラーが発生。(Windows Server 2012,SQL Server 2012)
どうもユーザープロファイルで「SharePoint」のスナップインをAddしているのが宜しくない模様。
何で?
見てみると、PSバージョンが2.0何ですね。
ん~、こんなものなのか、何か追加が必要なのか・・・。
何となく、Ver3では「sqlps」自体不要なのかも?。
「SSMS」でメニューに表示されるのでつい開いてしまいがちだが、
こいつはあくまでも2008ServerなどにSQLServerを入れた時用かもしれない。
2012Serverなら環境を判断して切り替えるくらいのスマートさがあっても良い気はするが・・・。
PowerShellでは.Netクラスへのアクセスを簡易にすべく「TypeAccelerators」なるものが用意されている。
どんな時に使われるかというと、[System.Xml.XmlDocument]なんてクラスにアクセスする時に[xml]といった短い名前でのアクセスを提供してくれる。
C#言語が提供する「int」や「string」といった型名と同じ感じだ。
どんなものが用意されているかは以下で確認できる。
001 002 | $clsAccelerators = "System.Management.Automation.TypeAccelerators" [psobject].Assembly.GetType($clsAccelerators)::Get |
ここで、「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 |
我らが牟田口さんのポケットリファレンスがVer3に対応して発売されるそうです。
PowerShellは本当に守備範囲が広がり、全体を俯瞰するのが難しくなっているので、この様な本があると重宝しますよね。
全角の日付に対して演算をするには日付型に変換してから計算し、元に戻してあげる。(そのまま計算する方法なんてあるのだろうか・・・、きっとローカルだから無いような・・・)
ちょっとべたな感じいっぱいだが、とりあえずこんな感じでいけそう。
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 |
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版で使うと良くフリーズするし・・・。
どなたかお勧めの環境はありませんか?
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にしないとダメなのね・・・。
001 002 003 | [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | ft Description,OperationalStatus, @{n="Speed(M)";e={($_.speed/1000000).tostring("0.0").padleft(8)}} -auto |
PowerShell: ◆SharePoint InfoPathフォーム(xsn)をアップロードするでアップロードしたテンプレートは、そのままではまだ使えない。
テンプレートを使いたいサイトコレクションごとに「アクティブ化」という作業が必要になる。
GUIでの作業は、サーバー側の管理サイト「サーバー全体の管理」から行う方法と、サイトコレクションの「サイトの設定」から行う方法の2通りがある。
<サーバー全体の管理>
<サイトコレクション・サイト設定>
<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」プロパティに持っているシリアライズされた情報を渡すって感じでしょうか。
2010のSharePointでInfoPathを使ったライブラリがいくつかあるので2013に持ってきて使えるようにしたい。
まずはTemplateを登録する。
GUIでやるには、
これを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 |