2010年12月24日金曜日

◆Wordの目次を更新する

PowerShell: ◆複数のWord文書を纏めて1つにする。で複数の章に分けたドキュメントを一つにまとめている。
それぞれの文書には先頭に目次が付いているのだが、一つに纏めたときにフォーマットが崩れてしまう文書が存在する。(1つの目次行が2行に分かれて表示されたりする)

どういう文書の場合おかしくなるのか法則性はよくわからない。
Wordお得意のバグの範疇だと思うのだがWordに腹を立てても解決しない。

目次を選択してF9で最新状態にしてやれば直るので、文書を纏めるときに最新に更新するロジックを組み込むことにした。
Selection.Fields.Update()で更新してくれるのかと思ったのだが、どうやら目次は更新してくれない。
調べてみたところ、TablesOfContents.Update()メソッドで更新されるようだ。

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

#Wordの目次を更新する
$word = new-object -comObject "Word.Application"
$word.Visible = $true
[void]$word.Documents.Open("d:\desktop\test.docx")

#$word.ActiveDocument.TablesOfContents.Item(1).Update()
foreach($item in $word.ActiveDocument.
TablesOfContents){
 
$item.
update()
 
#$item.UpdatePageNumbers
}
[void]$word.Application.ActiveDocument.Close()
$word.Quit()

2010年12月17日金曜日

◆プリンターを指定して印刷する2

PowerShell: ◆プリンターを指定して印刷する。(Out-Printer)ではテキストファイルの印刷を行ったが、やはりOffice文書なども印刷したい。
それぞれCOMでアクセスして印刷しなくてもStart-Processコマンドレットを使うと印刷できるようだ。
ドキュメントを右クリックしてコンテキストメニューから印刷するのと同じ処理かと思われる。
Start-Processでは出力先はデフォルトプリンターになるので、デフォルトプリンターを変更し、印刷が終わったら元に戻す様にしてみた。

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
028
029
030
031
032
033
034

<#
.SYNOPSIS
  指定したパスのドキュメントを印刷する
.DESCRIPTION
  Pathパラメータに指定したドキュメントを印刷する。
  Listスイッチを付けると出力先プリンターをプロンプトする。
.EXAMPLE
  Mout-Printer2.ps1 -Path w:\test.docx
  w:\test.docxをデフォルトプリンターで印刷する。
.EXAMPLE
  Mout-Printer2.ps1 -Path w:\test.docx -List
  出力先プリンターの一覧をプロンプトする。
#>

param
(
 
[string]$path,
  [switch]$list
)

if($list
){
 
$printers = gwmi win32_printer

  0..($printers.Count -1 ) | %
{
   
if($printers[$_].default){$defaultPrinter = $printers[$_]
}
   
Write-Host (($_+1).ToString() + " : " + $printers[$_].name) -Fore Green
 }

 
$printerNo = (Read-Host "出力するプリンター番号を指定してください") -as [int]
  if(($printerNo) -and ($printerNo -le $printers.
Count)){
    (
$printers[$printerNo-1]).SetDefaultPrinter() | Out-Null
  }else{exit
}
} 


Start-Process -FilePath $path -Verb print 
-Wait

if
($list){$defaultPrinter.SetDefaultPrinter() | Out-Null }

◆プリンターを指定して印刷する。(Out-Printer)

Out-Printerコマンドレットにデータをパイプすると簡単に印刷が可能だ。

出力先のプリンターを一覧で指定できるようにしたスクリプトを作ってみた。

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

<#
.SYNOPSIS
出力プリンターを指定して印刷
.DESCRIPTION
出力プリンターの一覧をプロンプトし、指定されたプリンターにパイプライン入力
されたデータを印刷する。
.EXAMPLE
Get-Content w:\test.txt | MOut-Printer.ps1
#>


$printers = gwmi 
win32_printer

0
..($printers.Count -1 ) | %
{
 
Write-Host (($_+1).ToString() + " : " + $printers[$_].name) -Fore Green }

$printerNo = (Read-Host "出力するプリンター番号を指定してください") -as [int]
if(($printerNo) -and ($printerNo -le $printers.
Count)){
   
$input | Out-Printer -Name ($printers[$printerNo-1].
name) 
} 

20101217165914

2010年12月16日木曜日

◆別の資格情報でプロセスを開始する

PowerShell: ◆Windows7からActiveDirectoryモジュールを使う時にはドメイン管理者の資格情報が使いたくなるだろう。

それぞれのコマンドに資格情報を指定してもよいが、Powershell自体をドメイン管理者の資格情報で起動しておけば便利な気がする。

資格情報を指定してPowershellを起動するのは以下のような感じだ。

Start-Process powershell -LoadUserProfile -Credential (Get-Credential)

ついでにActiveDirectoryモジュールを読み込んでおけばベターかも。(Profileを使っても良いけど)

Start-Process powershell "-noexit","-command ipmo ActiveDirectory"

2010年12月15日水曜日

◆Wordの文書プロパティを設定する

Wordの文書プロパティをPowershellから設定するのは若干面倒なのでメモしておく。
手探りなので最適かどうかは判らない。

以下ではとりあえず文書プロパティの「コメント」に文字を設定している。

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

$docPropName = "comments"
$docPropValue = "文書のコメント"
$ref = [System.Reflection.BindingFlags]

$word = new-object -comObject "Word.Application"
$word.Visible = 
$true
$word
.Documents.Add() | Out-Null

$prop = $word.ActiveDocument.BuiltInDocumentProperties
$comments=[System.__ComObject].
InvokeMember(
 
"Item",$ref::GetProperty,$null,$prop,$docPropName)
[System.__ComObject].
InvokeMember(
 
"Value",$ref::SetProperty,$null,$comments,$docPropValue)

2010年12月14日火曜日

◆ランダムなパスワードを作る(Get-Random)

以下のTipsでランダムなパスワードの作り方のサンプルがあったので紹介しておく。

Create Random Passwords - Power Tips - Powershell.com Powershell Scripts, Tips and Resources

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

<#
.SYNOPSIS
    ランダムなパスワードを作る
.DESCRIPTION
    パスワードに使う文字列と長さを指定するとランダムなパスワードを(文字列)を返す。
.LINK
    http://powershell.com/cs/blogs/tips/archive/2010/12/13/create-random-passwords.aspx
.NOTES
    デフォルトでは10桁のパスワードを返す。(紛らわしいのでゼロとオーは使わない)
.EXAMPLE
    mGet-RandomPassword.ps1 -length 7 -char 'abcdefghijklmnopqrstuvwxyz0123456789'
#>
 
param( 
$length = 10, 
$characters = 
'abcdefghkmnprstuvwxyzABCDEFGHKLMNPRSTUVWXYZ123456789!"$%&/()=?*+#_'
 
 
#[string][char[]](33..47+49..78+80..110+112..126)
) 
# select random characters
$random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length } 
# output random pwd
[String]$characters
[$random] 

すこし解説すると、まずパスワードに使える文字列と桁数を定義する。
Get-Randomを使ってパスワードの桁数分の文字列(配列)の添字を創りだして$randomに配列で入れる。
その配列が指し示す文字を$charactersから抜き出しStringに変換して返す。
これで、都度$charactersに定義した文字列から$lengthで指定した個数の文字をランダムに抜き出したパスワードが出来上がる。

※記号などは使えない文字もあるかもしれないので適宜カスタマイズ。

2010年12月10日金曜日

◆IPアドレスとホスト名の相互変換を行う

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
028
029
030
031
032
033
034
035
036
037

<#
.SYNOPSIS
  IPアドレスとホスト名の相互変換を行う。
.DESCRIPTION
  IPアドレスが引数に渡された場合はホスト名を、ホスト名が渡された場合は
  IPアドレスを返す。
.LINK
  $link$
.EXAMPLE
  mTrans-IP 172.16.65.29
.EXAMPLE
  mTrans-IP vista3
#>
 
param
( 
 
[string]$hostaddr
 
) 

function main
{ 
 
trap
{ 
   
Write-Warning ホスト又はアドレスが見つかりません;exit
 
  } 
 
if(isIpAddress($hostaddr
)){ 
    (
[Net.Dns]::GetHostByAddress($hostaddr)).
hostname 
  }
else
{ 
    (
[Net.Dns]::GetHostByName($hostaddr) |
 
     
select -ExpandProperty AddressList).
IpAddressToString 
     
  } 
}


function isIPAddress($IPHost) { 
#if($object){$object}else{"Null"}
  ($IPHost -as [System.Net.IPAddress]).IPAddressToString -eq $IPHost -and
 
  (
$IPHost -ne $null
) 
  #
Write-Host

}


. main

◆パラメータのエイリアス一覧を取得する

同じパラメータ名でもコマンドによってはエイリアスが違うケースも有るようなので一覧で出して役に立つのかという気もするが、概要をつかむには良いのではないかと。

001
002
003
004
005
006

Get-Command -CommandType Cmdlet | 
 
Select -expand ParameterSets |
 
 
% { $_.Parameters} |
 
 
? { $_.Aliases -ne $null } |
 
 
Select Name, Aliases -Unique |
 
 
Sort Name

20101210202255

◆テキストファイルの改行コードを削除する

XMLファイルを扱っていて不要な改行コードを削除する必要に迫られたので例を載せておく。

特に難しいところは無いが、Get-Contentでは改行コードを読み込めないのでStreamReaderを使ってみた。

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

# encoding設定
$encoding = [Text.Encoding]::
default 
  

# テキスト読み込み
$sr = new-Object IO.StreamReader((Convert-Path w:pcname_SJIS.txt),$encoding
) 
{
変換前テキスト} 
$sr.Readtoend() | tee -Variable text 
$sr.close()

""
 
{
変換後テキスト} 
$text -replace "`r`n",''

20101210200452

追記:
 テキストの読み込みは以下を使ったほうが簡単かも。
 [System.IO.File]::ReadAllText("c:\test.txt")

2010年12月9日木曜日

◆Powershellのバージョンを調べる

001
002
003
004
005
006
007
#Powershellがインストールされているか調べる(あまり意味はないな・・・)
Test-Path hklm:\SOFTWARE\Microsoft\PowerShell\1


#Powershellのバージョンを調べる
$reg = Get-Itemproperty hklm:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
$reg.powershellversion

2.0以降だと$psversiontableなんて変数も参照できるようだ。
20101220111501

◆プロセスの終了を待つ(Wait-Process,Start-Process)

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

#メモ帳が終了するのを待つ
notepad | Out-Null
"メモ帳が終了しました"
Start-Process notepad -Wait -WindowStyle Maximized
"最大化で開いたメモ帳が終了しました"

#特定のメモ帳が終了するのを待つ
$memo = Start-Process notepad -PassThru
Wait-Process -Id ($memo.id)
"id=$($memo.id)のメモ帳が終了しました"

#全てのメモ帳が終了するのを待つ
notepad
notepad
Wait-Process
 -Name notepad | Out-Null
"全てのメモ帳が終了しました"

#メモ帳が終わるのを非同期に待つ
$obj = Start-Process notepad -PassThru
Register-ObjectEvent $obj -EventName Exited -SourceIdentifier memo -Action
{
 
Write-host "メモ帳の終了イベントが発生しました"
  Unregister-Event -SourceIdentifier memo
}
"スクリプトが終了しました"

notepad を Out-Nullにパイプしてあげるとその終了を待ってくれる。
notepad を開いた後になにか処理をしたい場合などはそれでは不都合なのでWait-Processコマンドレットでプロセスを特定して待つ。
Start-ProcessコマンドレットにもWaitスイッチがあるので、それで待っても良い。

すべてのnotepadが終了するのを待つにはnotepadという名前を指定して待てば良い。

非同期に終了を待つにはProcessのExitedイベントを拾えば良い。

◆カスタムオブジェクト(PsObject)を使う(New-Object)

PowerShell: ◆Pingでサーバーの死活確認(Test-Connection)ではCSV経由でオブジェクトを作りHTML化していたが、CSVの代わりに独自のオブジェクト(いわゆるマイオブジェクト)を使ってみる。
C#でクラスを作ってインスタンシングしても良いのだが、ここではPowershellだけでやって見る。
独自のオブジェクトを作るにはPsObject(正式にはPsCustomObjectか?)のインスタンスを作り、それにメンバーを追加していけば良さそうだ。

メンバーの追加はPowerShell: ◆オブジェクトにプロパティを追加する(Add-Member)でもやっているので特に目新しいことは無い。

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
028
029
030
031
032
033
034
035
036
037
038

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
New-Object psobject |
  Add-Member -Name Pc名 -type NoteProperty -Value $pcname[$_] -PassThru |
  Add-Member -Name IsAlive -type NoteProperty -Value $isalive[$_] -PassThru
 
}

$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

ちなみに、メンバーの追加はAdd-Memberの代わりにハッシュテーブルにして一度に与えても良い。

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
028
029
030
031
032
033
034
035
036
037
038
039

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
$hash = @{}
  $hash.PC名 = $pcname[$_]
  $hash.isalive = $isalive[$_]
  New-Object pscustomobject -Property $hash
}
$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

参考までにハッシュテーブルは文字列で定義しておいてConvertFrom-StringDataコマンドレットで変換して作ることも出来る。

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
028
029
030
031
032
033
034
035
036
037
038
039
040
041

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %
{
 
$hashstring = 
@"
   PC名 = $($pcname[$_])
   isalive = $($isalive[$_])
"@

  $hash = ConvertFrom-StringData($hashstring
)
 
New-Object pscustomobject -Property $hash
}
$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

◆Pingでサーバーの死活確認(Test-Connection)

Test-Connectionコマンドレットを使うとPingコマンドを直接使うよりも簡単に結果を確認することが出来る(文字列解析が不要)

Quietスイッチを指定すると単純にPingが成功したか失敗したかの結果だけを返してくれる。
以下の例では直接Server名を指定するパターンと、Server名の入ったテキストファイルを用意するパターンに対応してみた。

結果はそのままテキストで表示してもよいが、ここではHTML形式にして表示させている。
(HTML化が本題ではないのでごく簡単な表示で済ませている)
また、場合によってはこのHTMLテキストをPowerShell: ◆メールを送る(Send-MailMessage)を使って管理者にメールするなんてのも良いだろう。

PowerShell: ◆コメントベースのヘルプを記述するで書いたコメントも先頭に付けてみた。

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
028
029
030
031
032
033
034
035

<#
.SYNOPSIS
サーバーの死活確認を行う
.DESCRIPTION
Serversに指定したServerまたはinputpathで指定したテキストファイル中のServerに
対してPingを送信しその死活を確認する。
結果は指定されたパスにHTML形式で出力する。
.NOTES
inputpath、serversともに指定しないとエラーとなる。
.LINK
http://www.powershell.com
.EXAMPLE
Ping.ps1 -inputpath w:\pcname.txt
.EXAMPLE
Ping.ps1 -servers vista3,goemon
#>

param
(
 
[string]$inputpath,
  [string[]]$Servers,
  [string]$outputpath="W:\servers.htm"
)
if($inputpath
){
 
$pcname = Get-Content $inputpath
}elseif($Servers
){
 
$pcname = $servers
}else
{
 
Write-Warning "Please Specify Params"
  exit
}
$isalive = @(Test-Connection -ComputerName $pcname -Quiet)
$result = 0..($pcname.Count - 1) | %{$pcname[$_] + "," + $isalive[$_]}
$head = (Get-Date).ToString() + " サーバー死活確認"
$html =  $result | ConvertFrom-Csv -Header "PC名","IsAlive" |
 
 
ConvertTo-Html -Head $head -Title "Servers" 
$html | 
Out-File $outputpath

結果はこんな感じになる。
20101209194217

◆PowerGUIにスニペットを追加する。

前回コメントベースのヘルプの記述方法を説明したが、毎回手で追加するのは面倒。
PowerGUIにはスニペットを挿入する機能があるので、スニペットとして追加してみた。
スニペットはインストールしたフォルダー配下のsnippetsフォルダーにある。
通常は”C:\Program Files\PowerGUI\snippets” 。

既存のスニペットをコピーして適当に変更してやれば良い。
コメントベースのヘルプを挿入するために作ったのが以下である。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>comment</Title>
      <Shortcut>comment</Shortcut>
      <Description>Comment For Help</Description>
      <Author>minminnana</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
       <Literal>
          <ID>gaiyou</ID>
        </Literal>
        <Literal>
          <ID>setsumei</ID>
        </Literal>
        <Literal>
          <ID>link</ID>
        </Literal>
        <Literal>
          <ID>memo</ID>
        </Literal>
        <Literal>
          <ID>sample</ID>
        </Literal>
      </Declarations>
      <Code Language="powershell">
        <![CDATA[<#
.SYNOPSIS
    $gaiyou$
.DESCRIPTION
    $setsumei$
.LINK
    $link$
.NOTES
    $memo$
.EXAMPLE
    $sample$
#>
]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

赤で記述した箇所が変更(追加)した部分。
<ID>で入力を促す項目を定義しておき、<Code>の中で$hoge$の形式で参照してやると良いようだ。

定型的なコーディングを色々と登録しておけば効率UPする事だろう。

ちなみに私が試した限りでは日本語は通らない(スニペットの一覧に表示されなくなる)ようだ。

◆コメントベースのヘルプを記述する

以前PowerShell: ◆スクリプトファイルを作るで独自のコメントを使ったヘルプを記述したが、Ver2になってPowershellの機能としてコメントベースのヘルプがサポートされた。(about_Comment_Based_Help)
VisualStudioで言うところのコードコメントと同じイメージかな。
以下のようにスクリプトや関数の先頭にコメントを書いておく。
<#
.SYNOPSIS
    概要のテスト
.DESCRIPTION
    説明のテスト
.LINK
    http://mtgpowershell.blogspot.com/
.NOTES
    メモのテスト
.EXAMPLE
    Write-Comment ”コメント"
#>
Get-Help W:\Write-Comment.ps1 –full
っとやると以下のように通常のコマンドレットと同じ書式でヘルプが表示される。
20101209115524

2010年12月7日火曜日

◆多次元配列と多段階配列(ジャグ配列)

PowerShell: ◆配列関連でも書いたが、いろいろなサイトを見ているとあまり区別していないケースが多いので少し補足。(多段階配列を指して多次元配列と呼んでいるケースが多いようだ)

多段階配列も多次元配列の一種なのかもしれないが、アクセスする文法が違うのでやはり区別したほうが良いものと思う。

PS>#多段階(ジャグ)配列
PS>$arrJag = @((New-Object string[] 2) , (New-Object int[] 3), (New-Object int[] 2))
PS>$arrJag[0][0] = "aaa"
PS>$arrJag[0][1] = "bbb"
PS>$arrJag[1][0] = 1
PS>$arrJag[1][1] = 2
PS>$arrJag[1][2] = 3
PS>$arrJag[2][0] = 4
PS>$arrJag[2][1] = 5
PS>Write-Host $arrJag
aaa bbb 1 2 3 4 5
PS>
PS>$arrJag = (("c","d"),(6,7,8),(9,0))
PS>Write-Host $arrJag
c d 6 7 8 9 0
PS>
PS>#多次元配列
PS>$arrMulti = New-Object "int[,]" 2,3
PS>$arrMulti.Count
6
PS>
PS>$arrMulti[0,0] = 1
PS>$arrMulti[0,1] = 2
PS>$arrMulti[0,2] = 3
PS>$arrMulti[1,0] = 4
PS>$arrMulti[1,1] = 5
PS>$arrMulti[1,2] = 6
PS>Write-Host $arrMulti
1 2 3 4 5 6
PS>$arrMulti[(1,0),(0,1)]
4
2

多段階配列とは、配列の個々の要素が配列になっている物。
上記の例の様にそれぞれで違うデータ型を取ることが出来る。
全体の要素数は個々の配列の要素数を足した値となる。

多次元配列とはスプレッドシートの様に次元を掛けあわせた形の配列。
要素のデータ型は一律。
全体の要素数は個々の配列の要素数を掛けた値となる。

といった違いがあるので表の様なデータを扱うには多次元配列。
そうでなければ多段階配列を使うと良いのだと思う。
多段階配列の方が必要な分しか領域が確保されないのでメモリー的には優位と思われる。

2010年12月3日金曜日

◆フォントの一覧を取得する

HTMLなどを書いているとフォントを文字列で指定したいことがあるが、正式な名前が判らないことがある。

MSゴシックなども、半角なのか全角なのか、間にスペースは入るのか、そのスペースは半角か全角か・・・。

そんな時はPowershellで文字列表示してコピーすると確実だ。

PS>add-type -AssemblyName system.drawing
PS>(New-Object System.Drawing.Text.InstalledFontCollection).Families

◆DOSコマンドをPowershellから使う

ヒア文字列で定義してパイプで渡してあげると簡単に実行できる。
以下では2つのテキストファイルをまとめて一つのテキストファイルにしている。
大きいファイルではPowershellでやるよりこちらのほうが効率的かもしれない。

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

Set-Location d:\Desktop
"---- test1.txt ----------"
Get-Content test1.txt
"---- test2.txt ----------"
Get-Content test2.txt
$cmd = 
@"
  if exist test3.txt (del test3.txt)
  copy /b test1.txt + test2.txt test3.txt
"@

$cmd | 
cmd
Write-Host

"---- test3.txt ----------"
Get-Content test3.txt

結果
20101203222959