MdbCommandで利用できるSQLデータ型について。次は、文字列です。
こんにちは。
ここで、もう一度MdbCommandについてお知らせします。
MdbCommandは、Windows PowerShellで記述されたモジュールで、mdbファイルをPowerShellで操作するためのものです。
テーブルの作成や参照などの機能のほかに、プログラミングに利用することができるようになっています。
以下で、ダウンロードできます。
GitHub
GitHub - rancomma/MdbCommand: powershell ms mdb file automation command.
- Windows PowerShellは、Windows7から標準でスタートメニューの「アクセサリ」に入っています。
- XPでも、Windowsアップデートを行うとインストールされるようです。
- インストールされていない場合は、Microsoftのサイトからダウンロード出来ます。
- モジュールは、PowerShell version2 から導入されたもので、コマンドを簡単に増やしたりできる仕組みです。
- Windows7のPowerShellのヴァージョンは、version2です。
- mdbファイルは、Office Accessデータベースに利用されてるファイルで、Office Access2003までの形式に対応しています。
- Office Access2007や、Office Access2010は、Accdbファイルになりますが、mdbファイルも利用できます。
- WindowsXPや7では、mdbファイルを操作するためのライブラリが標準で入っています。
- MdbCommandを利用するのに、Office Accessは、必須ではありません。
SQLで利用できるデータ型 文字列
それでは、SQLで利用できるデータ型の文字列についてお話します。
◆MS ACCESS:SQL データ型
http://office.microsoft.com/ja-jp/access-help/HP001032248.aspx?CTT=5&origin=HP001032229
SQLで入力するデータ型 文字列
データ型 | SQLで入力する データ型 |
対応する .NETクラス |
備考 | ||
---|---|---|---|---|---|
VARCHAR | varchar string |
[string] | 0 〜 255 バイトの文字列 | ||
CHARACTER | character char |
[string] | 0 〜 255 バイトの文字列で、文字が無いところはスペースで埋まります。 | ||
TEXT | text memo |
[string] | 0 〜 2.14 GB の文字列 |
[string]は、System.String型をあらわします。
MdbCommand をインポートします。
PS (1) > ipmo .\MdbCommand
前回作成した、testdata.mdbをオープンします。
PassThru スイッチパラメータを指定すると、オープンした結果が返ってきます。
PS (2) > Open-Mdb testdata.mdb -PassThru
結果
DatabaseName State Transaction DataSource ------------ ----- ----------- ---------- main Open No C:\scripts\ps1\testdata.mdb
前回作成したテーブルの一覧を参照します。Get-MdbTable コマンドを実行します。
PS (3) > get-mdbtable
結果
TableName TableType Description --------- --------- ----------- decdata TABLE intdata TABLE moneydata TABLE
文字列のデータ型を使ってテーブルを作成します。
PS (4) > invoke-mdb "create table strdata (varcharA string(50), charA char(50), memoA memo)"
作成したテーブルの列情報を参照します。
PS (5) > get-mdbcolumn strdata
結果
TableName Pos ColumnName DataType AliasType Size NotNull Default PKey AutoInc --------- --- ---------- -------- --------- ---- ------- ------- ---- ------- strdata 1 varcharA VARCHAR string 50 strdata 2 charA CHARACTER char 50 strdata 3 memoA TEXT memo
文字列のデータを登録します。
PS (6) > invoke-mdb "insert into strdata values ('あいう', '123', '漢字')"
テーブルの中身を見てみます。
PS (7) > invoke-mdb "select * from strdata"
結果
varcharA charA memoA -------- ----- ----- あいう 123 ... 漢字
charAの最後が「...」になっていますが、データが後ろにまだ何かあることを示しています。
あとで、何文字あるか確かめます。
対応している.NETクラスの型を調べます。
PS (8) > invoke-mdb "select * from strdata" |gm
結果
TypeName: MdbCommand.MdbRecord Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() charA NoteProperty System.String charA=123 memoA NoteProperty System.String memoA=漢字 varcharA NoteProperty System.String varcharA=あいう
すべて、System.String型です。
それぞれ、何文字あるか、SQLで調べてみます。ここでは、len関数を使っています。
PS (9) > invoke-mdb "select len(varcharA),len(charA),len(memoA) from strdata" | ft -auto
結果
Expr1000 Expr1001 Expr1002 -------- -------- -------- 3 50 2
varcharは3文字、charは50文字、memoは2文字になりました。
charAの後ろは何が入っているか調べます。
まず、SELECT文の結果を、row変数に代入して、charAの中身を見てみます。
PS (10) > $row = invoke-mdb "select * from strdata" PS (11) > "[" + $row.charA + "]"
結果
[123 ]
スペースのようです。
すぺースをアンダースコア(_)に変えてみます。
PS (12) > "[" + $row.charA + "]" -replace " ","_"
結果
[123_______________________________________________]
このような感じで、charは固定サイズ、varchar(string)は、可変サイズになっています。
memoは、255文字を超える場合に使うことになると思います。
最後にmdbファイルを閉じます。
PS (13) > close-mdb
次回は、残りのデータ型(日付やYES/NOやバイナリ)を記述します。
今日のコマンド
PS (1) > ipmo .\MdbCommand
PS (2) > Open-Mdb testdata.mdb -PassThru
PS (3) > get-mdbtable
PS (4) > invoke-mdb "create table strdata (varcharA string(50), charA char(50), memoA memo)"
PS (5) > get-mdbcolumn strdata
PS (6) > invoke-mdb "insert into strdata values ('あいう', '123', '漢字')"
PS (7) > invoke-mdb "select * from strdata"
PS (8) > invoke-mdb "select * from strdata" |gm
PS (9) > invoke-mdb "select len(varcharA),len(charA),len(memoA) from strdata" | ft -auto
PS (10) > $row = invoke-mdb "select * from strdata"
PS (11) > "[" + $row.charA + "]"
PS (12) > "[" + $row.charA + "]" -replace " ","_"
PS (13) > close-mdb
MdbCommandで利用できるSQLデータ型についてまとめます。まずは数値から。
こんにちは。
mdbファイルを操作できるMdbCommandで利用できるSQLデータ型と、
対応する.NETのクラスについてまとめます。
今回は、数値について記述します。
利用できるSQLデータ型は、ほぼMS ACCESSと同じです。
◆MS ACCESS:SQL データ型
http://office.microsoft.com/ja-jp/access-help/HP001032248.aspx?CTT=5&origin=HP001032229
SQLで入力するデータ型 数値
データ型 | SQLで入力する データ型 |
対応する .NETクラス |
備考 | ||
---|---|---|---|---|---|
TINYINT | tinyint byte |
[byte] | 0 〜 255 の整数 | ||
SMALLINT | smallint short |
[int16] | -32,768 〜 32,767 の整数 | ||
INTEGER | long int integer |
[int32] | -2,147,483,648 〜 2,147,483,647 の整数 | ||
REAL | real single |
[single] | 4 バイトの範囲で小数 | ||
FLOAT | float double |
[double] | 8 バイトの範囲で小数 | ||
DECIMAL | decimal numeric |
[decimal] | decimal(10,5) のように指定すると整数5ケタ、少数5ケタになります | ||
MONEY | money currency |
[decimal] | -922,337,203,685,477.5808 〜 922,337,203,685,477.5807 の小数 |
[byte]は、System.Byte型をあらわします。
MdbCommadを使って、テーブルを作成
整数
PS (1) > ipmo .\MdbCommand PS (2) > open-mdb testdata.mdb -Create PS (3) > invoke-mdb "create table intdata (byteA byte, shortA short, intA int)"
テーブル内の列のデータ型を調べるには、Get-MdbColumn を使用します。
PS (4) > get-mdbcolumn intdata TableName Pos ColumnName DataType AliasType Size NotNull Default PKey AutoInc --------- --- ---------- -------- --------- ---- ------- ------- ---- ------- intdata 1 byteA TINYINT byte intdata 2 shortA SMALLINT short intdata 3 intA INTEGER int
データを登録します。
PS (5) > invoke-mdb "insert into intdata values (1,1,1)"
データを参照します。
PS (6) > invoke-mdb "select * from intdata" byteA shortA intA ----- ------ ---- 1 1 1
対応する.NETクラスを調べます。
PS (7) > invoke-mdb "select * from intdata"|get-member TypeName: MdbCommand.MdbRecord Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() byteA NoteProperty System.Byte byteA=1 intA NoteProperty System.Int32 intA=1 shortA NoteProperty System.Int16 shortA=1
表にあるように、System.Byte、System.Int16、System.Int32が対応します。
System.Int64のデータは、格納するデータ型がありません。
(※SQLでlongと書いてもintになります。)
パラメータを使って、データを登録します。
PS (8) > invoke-mdb "insert into intdata values (?, ?, ?)" 2,3,4 PS (9) > invoke-mdb "select * from intdata"| ft -auto byteA shortA intA ----- ------ ---- 1 1 1 2 3 4
パラメータは、?で記述します。
小数
PS (10) > invoke-mdb "create table decdata (singleA single, doubleA double, decimalA decimal(10,5))" PS (11) > Get-MdbColumn decdata TableName Pos ColumnName DataType AliasType Size NotNull Default PKey AutoInc --------- --- ---------- -------- --------- ---- ------- ------- ---- ------- decdata 1 singleA REAL single decdata 2 doubleA FLOAT double decdata 3 decimalA DECIMAL numeric 10,5 PS (12) > invoke-mdb "insert into decdata values (1.1, 2.22, 3.33)" PS (13) > invoke-mdb "select * from decdata" singleA doubleA decimalA ------- ------- -------- 1.1 2.22 3.33000 PS (14) > invoke-mdb "select * from decdata"|gm TypeName: MdbCommand.MdbRecord Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() decimalA NoteProperty System.Decimal decimalA=3.33000 doubleA NoteProperty System.Double doubleA=2.22 singleA NoteProperty System.Single singleA=1.1
小数のほうも、System.Single、System.Double、System.Decimalがそれぞれ対応します。
get-member で見たときの並び順は、Nameの順になるので注意です。
小数もパラメータを使って、データを登録します。
PS (15) > $values = ([single]::MaxValue),([double]::MaxValue),12345.12345 PS (16) > invoke-mdb "insert into decdata values (?,?,?)" $values PS (17) > invoke-mdb "select * from decdata"| ft -auto singleA doubleA decimalA ------- ------- -------- 1.1 2.22 3.33000 3.402823E+38 1.79769313486232E+308 12345.12345
お金
PS (18) > invoke-mdb "create table moneydata (moneyA money)" PS (19) > invoke-mdb "insert into moneydata values (29800)" PS (20) > invoke-mdb "insert into moneydata values (199.75)" PS (21) > invoke-mdb "select * from moneydata" | ft -auto moneyA ------ 29800 199.75 PS (22) > invoke-mdb "select * from moneydata" | % {$_|gm} TypeName: MdbCommand.MdbRecord Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() moneyA NoteProperty System.Decimal moneyA=29800 Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() moneyA NoteProperty System.Decimal moneyA=199.75
MONEYは、System.Decimalに対応します。
次回は、文字列について記述します。
今日のコマンド
PS (1) > ipmo .\MdbCommand
PS (2) > open-mdb testdata.mdb -Create
PS (3) > invoke-mdb "create table intdata (byteA byte, shortA short, intA int)"
PS (4) > get-mdbcolumn intdata
PS (5) > invoke-mdb "insert into intdata values (1,1,1)"
PS (6) > invoke-mdb "select * from intdata"
PS (7) > invoke-mdb "select * from intdata"|get-member
PS (8) > invoke-mdb "insert into intdata values (?, ?, ?)" 2,3,4
PS (9) > invoke-mdb "select * from intdata"| ft -auto
PS (10) > invoke-mdb "create table decdata (singleA single, doubleA double, decimalA decimal(10,5))"
PS (11) > Get-MdbColumn decdata
PS (12) > invoke-mdb "insert into decdata values (1.1, 2.22, 3.33)"
PS (13) > invoke-mdb "select * from decdata"
PS (14) > invoke-mdb "select * from decdata"|gm
PS (15) > $values = ([single]::MaxValue),([double]::MaxValue),12345.12345
PS (16) > invoke-mdb "insert into decdata values (?,?,?)" $values
PS (17) > invoke-mdb "select * from decdata"| ft -auto
PS (18) > invoke-mdb "create table moneydata (moneyA money)"
PS (19) > invoke-mdb "insert into moneydata values (29800)"
PS (20) > invoke-mdb "insert into moneydata values (199.75)"
PS (21) > invoke-mdb "select * from moneydata" | ft -auto
PS (22) > invoke-mdb "select * from moneydata" | % {$_|gm}
PowerShellでデータベース(Mdb)を操作できるモジュールをGitHubに公開しました。
こんにちは。
powershellで、データベースをよく使っているので、気合を入れてモジュールにまとめました。
Windowsに何もインストールしなくても使えます。
mdbファイルを操作するのに、MS OfficeのAccessは不要です。さすがに、あったら便利ですが。
モジュールは以下で、ダウンロードできます。
◆rancomma / MdbCommand
GitHub - rancomma/MdbCommand: powershell ms mdb file automation command.
モジュールについては、powershellに、「man about_modules」と入力するか、
以下のリンクを見てください。(同じ内容です)
◆MS TechNet about_modules
about_Modules | Microsoft Docs
使い方
使用するコマンドは、最初は4つです。
コマンド | 内容 |
---|---|
ipmo | モジュールをインポートします。ipmoは、Import-Moduleのエイリアスです。 |
open-mdb | mdbファイルをオープンします。mdbファイルの作成もできます。 |
invoke-mdb | SQLを実行します。 |
close-mdb | mdbファイルをクローズします。 |
get-mdb | オープンしているmdbファイルを確認します。 |
インポートします。
モジュールフォルダにコピーした場合
PS (1) > ipmo MdbCommand
どこかのフォルダにコピーした場合
PS (1) > ipmo c:\ps1\anyfolder\MdbCommand
相対パスでも大丈夫です。
PS (1) > ipmo .\anyfolder\MdbCommand
ファイルを作成してオープンします。
PS (2) > open-mdb sample.mdb -create
テーブルを作成します。
PS (3) > invoke-mdb "create table test (a int, b string)"
データを登録します。
PS (4) > invoke-mdb "insert into test (a, b) values (1, '文字列')" PS (5) > invoke-mdb "insert into test (a, b) values (2, 'あいう')" PS (6) > invoke-mdb "insert into test (a, b) values (3, 'abc')"
データを参照します。
PS (7) > invoke-mdb "select * from test" a b - - 1 文字列 2 あいう 3 abc
こんな感じで返ってきます。
ちょっとみずらいので、自動幅調整して、参照します。
PS (8) > invoke-mdb "select * from test" | ft -auto a b - - 1 文字列 2 あいう 3 abc
開いているMdbファイルの情報を取得します。
PS (9) > get-mdb DatabaseName State Transaction DataSource ------------ ----- ----------- ---------- main Open No C:\scripts\ps1\sample.mdb
Mdbファイルを閉じます。
PS (10) > close-mdb
その他の操作は、GitHubにおいてあるREADMEファイルを見てください。
転載しておきます。
使ってみてください!
README [Install Guide] 1. Check PSModulePath C:\PS>$env:PSModulePath -split ";" C:\Users\UserName\Documents\WindowsPowerShell\Modules C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ 2. Copy MdbCommand Folder C:\Users\UserName\Documents\WindowsPowerShell\Modules\MdbCommand [MdbCommand Exsamples] C:\PS>ipmo MdbCommand C:\PS>Open-Mdb newsample.mdb -Create C:\PS>Invoke-Mdb 'Create Table table1 (a int not null constraint PK Primary Key, b varchar, c yesno)' C:\PS>invoke-mdb 'create table table2 (ID counter not null primary key, a int, b int)' C:\PS>invoke-mdb @' create table table3 ( col1 string(5), col2 string(5), a int, constraint PK_table3 primary key (col1, col2) ) '@ C:\PS>Get-Mdb DatabaseName State Transaction DataSource ------------ ----- ----------- ---------- main Open No C:\scripts\ps1\newsample.mdb C:\PS>Get-MdbTable TableName TableType Description --------- --------- ----------- table1 TABLE table2 TABLE table3 TABLE C:\PS>Get-MdbColumn -TableName table1|ft -auto TableName Pos ColumnName DataType AliasType Size NotNull Default PKey AutoInc --------- --- ---------- -------- --------- ---- ------- ------- ---- ------- table1 1 a INTEGER int YES YES table1 2 b VARCHAR string 255 table1 3 c BIT yesno YES C:\PS>Get-MdbIndex |ft -auto TableName IndexName Primary Unique Position ColumnName Collation --------- --------- ------- ------ -------- ---------- --------- table1 PK YES YES 1 a ASC table2 Index_7BC68A99_2CED_49DE YES YES 1 ID ASC table3 PK_table3 YES YES 1 col1 ASC table3 PK_table3 YES YES 2 col2 ASC C:\PS>$list = new-object collections.arraylist C:\PS>$list.add(@(1,'colb1', $true)) C:\PS>$list.add(@(2,'colb2', $false)) C:\PS>$list.add(@(3,'colb3', $true)) C:\PS>Invoke-MdbBatch 'Insert Into table1 (a, b, c) Values (?, ?, ?)' $list C:\PS>${MdbCommand.BatchTotalRecordsAffected} 3 C:\PS>Add-MdbQuery InsertTable1 'Insert Into Table1 (a, b, c) Values (?, ?, ?)' C:\PS>Get-MdbQuery | ft -wrap QueryName QueryType SQL --------- --------- --- InsertTable1 ACTION INSERT INTO Table1 ( a, b, c ) C:\PS>Invoke-MdbQuery InsertTable1 -Value 4,'colb4',$false C:\PS>Invoke-Mdb 'Select a, b, c From table1 Where a > ?' 1 | ft -auto a b c - - - 2 colb2 False 3 colb3 True 4 colb4 False C:\PS>try >> { >> Start-MdbTransaction >> >> Invoke-Mdb "Update table1 Set b = 'colb_change' Where a = 1" >> >> # processing >> >> Complete-MdbTransaction >> } >> catch >> { >> Write-Warning "$_" >> Undo-MdbTransaction >> } C:\PS>Start-MdbConsole mdb> select * from table1 ...> / a b c - - - 1 colb1 True 2 colb2 False 3 colb3 True 4 colb4 False mdb> .show autosize : on echo : off headers : on nullvalue : "" width : wrap : on mdb> mdb> .help .autosize ON|OFF Like Format-Table AutoSize parameter .begin Start transaction .columns ?TABLE? List columns .commit Commit transaction .databases Show database Info .echo ON|OFF Turn command echo on or off .exit Exit this console .headers ON|OFF Turn display of headers on or off .help Show this message .indices ?T? ?C? ?I? List indices .nullvalue STRING Print STRING in place of NULL values .quit Exit this console .rollback Rollback transaction .show Show the current values for various settings .tables ?TABLE? List tables .views ?VIEW? List querys and procedures .width NUM1 NUM2 ... Set column widths (If ".width" Then clear widths) .wrap ON|OFF Like Format-Table Wrap parameter ; or / or GO Enter SQL statements terminated mdb> mdb> .quit C:\PS> C:\PS>Use-MdbAliasCommand -Prefix mdb- C:\PS>get-alias mdb-* CommandType Name Definition ----------- ---- ---------- Alias mdb-begin Start-MdbTransaction Alias mdb-close Close-Mdb Alias mdb-columns Get-MdbColumn ..................................... C:\PS>Use-MdbDotCommand C:\PS>get-alias .* CommandType Name Definition ----------- ---- ---------- Alias .begin Start-MdbTransaction Alias .close Close-Mdb Alias .columns Get-MdbColumn Alias .commit Complete-MdbTransaction Alias .console Start-MdbConsole ..................................... C:\PS>Close-Mdb C:\PS>.mdb sample1.mdb C:\PS>.databases C:\PS>.columns C:\PS>.querys C:\PS>.execute 'select * from table1' C:\PS>.quit
Randomコマンドレット Out-Printer 4/236
こんにちは、「Randomコマンドレット」4回目です。
New-Item で関数作成
今回は、New-Item で関数を作成します。
PS (1) > New-Item -Path function:Get-RndCmdlet -Value `
>> {gcm -co cmdlet | random}
>>
CommandType Name Definition ----------- ---- ---------- Function Get-RndCmdlet gcm -co cmdlet | random
できました。
Get-Item で関数を取得します。
PS (2) > Get-Item -LiteralPath Function:\Get-RndCmdlet
CommandType Name Definition ----------- ---- ---------- Function Get-RndCmdlet gcm -co cmdlet | random
これを変数に入れて、
PS (3) > $rndcmd = Get-Item -LiteralPath Function:\Get-RndCmdlet
(&) 呼び出し演算子を前につけて、実行します。
PS (4) > & $rndcmd
CommandType Name Definition ----------- ---- ---------- Cmdlet Out-Printer Out-Printer [[-Name] <Strin...
Out-Printer コマンドレットです。プリンターで文字を印刷します。
先ほど取得した Get-RndCmdlet 関数の変数を調べてみます。
PS (5) > $rndcmd | gm
TypeName: System.Management.Automation.FunctionInfo Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() PSDrive NoteProperty System.Management.Automation.PSDriveInf... PSIsContainer NoteProperty System.Boolean PSIsContainer=False PSPath NoteProperty System.String PSPath=Microsoft.PowerShe... PSProvider NoteProperty System.Management.Automation.ProviderIn... CmdletBinding Property System.Boolean CmdletBinding {get;} CommandType Property System.Management.Automation.CommandTyp... DefaultParameterSet Property System.String DefaultParameterSet {get;} Definition Property System.String Definition {get;} Description Property System.String Description {get;set;} Module Property System.Management.Automation.PSModuleIn... ModuleName Property System.String ModuleName {get;} Name Property System.String Name {get;} Options Property System.Management.Automation.ScopedItem... OutputType Property System.Collections.ObjectModel.ReadOnly... Parameters Property System.Collections.Generic.Dictionary`2... ParameterSets Property System.Collections.ObjectModel.ReadOnly... ScriptBlock Property System.Management.Automation.ScriptBloc... Visibility Property System.Management.Automation.SessionSta... HelpUri ScriptProperty System.Object HelpUri {get=try...
関数は、System.Management.Automation.FunctionInfo 型であることが分かります。
コマンドを使って関数を作ったのですが、関数もオブジェクトの一つという感じです。
本題の、Out-Printer のヘルプを見ます。
PS (6) > man Out-Printer
名前 Out-Printer 概要 プリンターに出力を送ります。 構文 Out-Printer [[-Name] <string>] [-InputObject <psobject>] [<CommonParamete rs>] 説明 Out-Printer コマンドレットは、既定のプリンター、または代替プリンターが指定 されている場合にはその代替プリンターに出力を送ります。 関連するリンク Online version: http://go.microsoft.com/fwlink/?LinkID=113367 Out-Host Out-Null Out-String Out-File Out-Default ・・・
短いです。
サンプルを見てみます。
PS (7) > man Out-Printer -Examples
-------------------------- 例 2 -------------------------- C:\PS>"Hello, World" | out-printer -name "\\Server01\Prt-6B Color" 説明 ----------- このコマンドにより、Server01 の "Prt-6B Color" プリンターで "Hello, World" と印刷されます。このコマンドは 、Name パラメーターを使用して代替プリンターを指定します。パラメーター名は オプションであるため、省略できます。
サンプル実行
使っている PC に入っているプリンターを調べます。
PS (8) > get-wmiobject win32_printer
Location : Name : Microsoft XPS Document Writer PrinterState : 0 PrinterStatus : 3 ShareName : SystemName : XXXXX-PC Location : Name : Fax PrinterState : 0 PrinterStatus : 3 ShareName : SystemName : XXXXX-PC
Windows 7 のデフォルトのままで、プリンターは繋いでいません。(というか、プリンターが無い)
それでも、2つ入っています。
(*)SystemNameは、自分の名前が入っているので、モザイクXXXXXにしました。
今回は、XPS で出力します。
打ち間違えると嫌なので、プリンター名を抽出します。
変数に入れます。
PS (9) > $PrinterNames = get-wmiobject win32_printer | % {$_.Name}
PS (10) > $PrinterNames
Microsoft XPS Document Writer
Fax
2つ入りました。
これは、配列なので、最初の一つを取得します。
PS (11) > $PrinterName = $PrinterNames[0]
PS (12) > $PrinterName
Microsoft XPS Document Writer
できました。
では、0 から 100 までの数値を印刷(というかファイル出力)します。
PS (13) > 0..100 | Out-Printer $PrinterName
〜 XPS のファイル名設定ダイアログがでます 〜
XPS ファイルに 0 〜 100 が出力されました。
これで完了です。
New-Item でパラメータ付きの関数を作成
最初に、New-Item で関数を作りましたが、今度は、パラメーター付きの
関数を作ります。
PS (14) > new-item -Path function:Out-HelpToPrinter -Value {
>> param(
>> [string]$Name,
>> [string]$Printer
>> )
>> Get-Help -Full -Name $Name | Out-Printer -Name $Printer
>> }
>>
CommandType Name Definition ----------- ---- ---------- Function Out-HelpToPrinter ...
Get-Command にパイプラインで fl をつけて中身を見ます。
PS (15) > gcm Out-HelpToPrinter | fl
Name : Out-HelpToPrinter CommandType : Function Definition : param( [string]$Name, [string]$Printer ) Get-Help -Full -Name $Name | Out-Printer -Name $Printer
Get-Help と help と man の関係
この関数は、HELP の例3と、ほとんど同じです。 man では、改ページが入るので、
ここでは、Get-Help を使っています。
ちなみに、man は、Get-Help を使った関数 help の エイリアスです。かなりややこしい。
コマンド | 内容 |
---|---|
Get-Help | コマンドレット本体です。改ページしません。 |
help | Get-Help を使った関数です。more を使って改ページします。 |
man | help 関数の エイリアスです。 |
PowerShellでは、"Get-"を省略できますが、この場合、help 関数が先に実行されます。
せっかくなので、Out-Printer の HELP を印刷(というかファイル出力)します。
PS (16) > Out-HelpToPrinter -Name Out-Printer -Printer $PrinterName
〜 XPS のファイル名設定ダイアログがでます 〜
中を見てみるとまあまあキレイです。
Acrobatなどあれば、PDFに出力してみたいかも。
Out-Printer
- 文字列を指定のプリンターに印刷します。
- プリンターを指定しない場合、既定のプリンターで印刷します。
- Out-Printer [[-Name]
] [-InputObject ] [ ]
今日のコマンド
PS (1) > New-Item -Path function:Get-RndCmdlet -Value `
>> {gcm -co cmdlet | random}
>>
PS (2) > Get-Item -LiteralPath Function:\Get-RndCmdlet
PS (3) > $rndcmd = Get-Item -LiteralPath Function:\Get-RndCmdlet
PS (4) > & $rndcmd
PS (5) > $rndcmd | gm
PS (6) > man Out-Printer
PS (7) > man Out-Printer -Examples
PS (8) > get-wmiobject win32_printer
PS (9) > $PrinterNames = get-wmiobject win32_printer | % {$_.Name}
PS (10) > $PrinterNames
PS (11) > $PrinterName = $PrinterNames[0]
PS (12) > $PrinterName
PS (13) > 0..100 | Out-Printer $PrinterName
PS (14) > new-item -Path function:Out-HelpToPrinter -Value {
>> param(
>> [string]$Name,
>> [string]$Printer
>> )
>> Get-Help -Full -Name $Name | Out-Printer -Name $Printer
>> }
PS (15) > gcm Out-HelpToPrinter | fl
PS (16) > Out-HelpToPrinter -Name Out-Printer -Printer $PrinterName
Randomコマンドレット Register-ObjectEvent 3/236
こんにちは、「Randomコマンドレット」3回目です。
PS (1) > function Get-RandomCmdlet
>> {
>> Get-Command -CommandType cmdlet | Get-Random
>> }
>>
今回は関数を作ります。
PS (2) > Get-Command -CommandType function -Name Get-RandomCmdlet
CommandType Name Definition ----------- ---- ---------- Function Get-RandomCmdlet ...
できてます。
PS (3) > Get-Command -CommandType function -Name Get-RandomCmdlet | fl
Name : Get-RandomCmdlet CommandType : Function Definition : Get-Command -CommandType cmdlet | Get-Random
パイプラインで fl をつけると、関数の中身が見れます。
ではランダムに抽出してみます。
PS (4) > Get-RandomCmdlet
CommandType Name Definition ----------- ---- ---------- Cmdlet Register-ObjectEvent Register-ObjectEvent [-InputObject]...
ちょっとややこしいのが出ました。
とりあえず、実行してみます。
PS (5) > Register-ObjectEvent
コマンド パイプライン位置 1 のコマンドレット Register-ObjectEvent 次のパラメーターに値を指定してください: InputObject: EventName: Register-ObjectEvent : 引数が空の文字列であるため、パラメーター 'EventName' にバインドできませ ん。 発生場所 行:1 文字:21 + Register-ObjectEvent <<<< + CategoryInfo : InvalidData: (:) [Register-ObjectEvent]、ParameterBindingValidat ionException + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft .PowerShell.Commands.RegisterObjectEventCommand
エラーが表示されましたので、InputObject と EventName のパラメーターで、リターンキーを押しました。
結果はエラー。EventName が必須です。
ヘルプを見ます。
PS (6) > man Register-ObjectEvent -full
名前 Register-ObjectEvent 概要 Microsoft .NET Framework オブジェクトによって生成されたイベントをサブスク ライブします。 構文 Register-ObjectEvent [-InputObject] <psobject> [-EventName] <string> [[-S ourceIdentifier] <string>] [[-Action] <scriptblock>] [-Forward] [-Message Data <psobject>] [-SupportEvent] [<CommonParameters>] 説明 Register-ObjectEvent コマンドレットは、ローカル コンピューターまたはリモー ト コンピューター上の .NET Framewor k オブジェクトによって生成されたイベントをサブスクライブします。 サブスクライブされたイベントが発生すると、セッションのイベント キューに追 加されます。イベント キューのイベントを取得するには、Get-Event コマンドレットを使用します。 Register-ObjectEvent のパラメーターを使用してイベントのプロパティ値を指定 し、キューのイベントを識別しやすくすることができます 。Action パラメーターを使用して、サブスクライブしたイベントが発生したとき に実行するアクションを指定し、Forward パラメーターを使用し てローカル セッションのイベント キューにリモート イベントを送信することも できます。 イベントをサブスクライブするとき、イベント サブスクライバーがセッションに 追加されます。セッションのイベント サブスクライバーを取得するには、Ge t-EventSubscriber コマンドレットを使用します。サブスクリプションをキャンセ ルするには、Unregister-Event コマンド レットを使用して、セッションからイベント サブスクライバーを削除します。 ・・・
長いです。サンプルのみ抽出します。
PS (7) > man Register-ObjectEvent -Examples
・・・ -------------------------- 例 4 -------------------------- C:\PS>$timer = New-Object Timers.Timer C:\PS> $timer.Interval = 500 C:\PS> $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed -sourceIdentifier Timer.Random -Action {$random = Get-Random -Min 0 -Max 100} C:\PS> $job.gettype().fullname System.Management.Automation.PSEventJob C:\PS> $job | format-list -property * State : Running Module : __DynamicModule_6b5cbe82-d634-41d1-ae5e-ad7fe8d57fe0 StatusMessage : HasMoreData : True Location : Command : $random = Get-Random -Min 0 -Max 100 JobStateInfo : Running Finished : System.Threading.ManualResetEvent InstanceId : 88944290-133d-4b44-8752-f901bd8012e2 Id : 1 Name : Timer.Random ChildJobs : {} ... C:\PS> $timer.Enabled = $true C:\PS> & $job.module {$random} 60 C:\PS> & $job.module {$random} 47 説明 ----------- この例は、イベントの登録で Action を指定した場合に作成される PSEventJob オ ブジェクトの動的モジュールを使用する方法を示していま す。 最初のコマンドは New-Object コマンドレットを使用してタイマー オブジェクト を作成します。2 番目のコマンドは、タイマーの間隔を 500 (ミリ秒) に設定します。 3 番目のコマンドは、Register-ObjectEvent コマンドレットを使用して、タイマ ー オブジェクトの Elapsed イベントを登録 します。このコマンドには、イベントを処理するアクションが指定されています。 タイマーの間隔が経過するたびに、イベントが発生し、このアクションに指定さ れたコマンドが実行されます。ここでは、Get-Random コマンドレットによって、0 〜 100 の乱数が生成されて、$random 変数に保存 されます。 Register-ObjectEvent コマンドに Action パラメーターを指定すると、そのアク ションを表す PSEventJob オブジェ クトが返されます。このコマンドは、ジョブ オブジェクトを $job 変数に保存し ます。 Register-ObjectEvent コマンドレットが返す PSEventJob オブジェクトも、イベ ント サブスクライバーの Action プロパティで使用できます。詳細については、「Get-EventSubscriber」を参照し てください。 4 番目のコマンドは、$job 変数に PSEventJob オブジェクトが格納されているこ とを示しています。5 番目のコマンドは、Format- List コマンドレットを使用して、PSEventJob オブジェクトのプロパティをすべて 一覧表示します。 PSEventJob には Module プロパティが存在し、そのプロパティに、アクションを 実装する動的スクリプト モジュールが含まれています。 6 番目のコマンドは、タイマーを有効にします。 残りのコマンドは、呼び出し演算子 (&) を使用し、モジュール内のコマンドを呼 び出して、$random 変数の値を表示します。呼び出し演算子を使用 すると、エクスポートされないコマンドを含め、モジュール内のコマンドを自由に 呼び出すことができます。ここでは、Elapsed イベントの発生時に生成 される乱数を表示しています。 モジュールの詳細については、「about_Modules」を参照してください。 ・・・
色々ありますが、例1と例2は、プロセス関連、例3は、リモート関連で
今のところ使わなさそうです。
例4は、タイマー関連で、ランダムを使うので、これをやります。(偶然です)
サンプル実行
PS (8) > $timer = New-Object Timers.Timer
PS (9) > $timer.Interval = 500
PS (10) > $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed `
>> -sourceIdentifier Timer.Random -Action {$random = Get-Random -Min 0 -Max 100}
>>
長いので (`) バッククォートで改行しています。
PS (11) > $job.gettype().fullname
System.Management.Automation.PSEventJob
PS (12) > $job | format-list -property *
State : NotStarted Module : __DynamicModule_4f7c3558-f8b0-43a3-9f13-074a20e8c47a StatusMessage : HasMoreData : False Location : Command : $random = Get-Random -Min 0 -Max 100 JobStateInfo : NotStarted Finished : System.Threading.ManualResetEvent InstanceId : a8a5cbeb-d862-4652-8968-1b4114d050c3 Id : 1 Name : Timer.Random ChildJobs : {} Output : {} Error : {} Progress : {} Verbose : {} Debug : {} Warning : {}
タイマーを有効にします。
PS (13) > $timer.Enabled = $true
ランダムです。
PS (14) > & $job.module {$random}
35
ランダムです。
PS (15) > & $job.module {$random}
95
ランダムです。
PS (16) > & $job.module {$random}
71
タイマーを止めます。
PS (17) > $timer.Enabled = $false
止めると、結果が変わりません。
PS (18) > & $job.module {$random}
93
PS (19) > & $job.module {$random}
93
サンプル検証
タイマー変数を gm (Get-Member の Alias)で詳しく見てみます。
PS (20) > $timer | gm
TypeName: System.Timers.Timer Name MemberType Definition ---- ---------- ---------- Disposed Event System.EventHandler Disposed(System.Object, System.Eve... Elapsed Event System.Timers.ElapsedEventHandler Elapsed(System.Objec... BeginInit Method System.Void BeginInit() Close Method System.Void Close() CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type reque... Dispose Method System.Void Dispose() EndInit Method System.Void EndInit() Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() Start Method System.Void Start() Stop Method System.Void Stop() ToString Method string ToString() AutoReset Property System.Boolean AutoReset {get;set;} Container Property System.ComponentModel.IContainer Container {get;} Enabled Property System.Boolean Enabled {get;set;} Interval Property System.Double Interval {get;set;} Site Property System.ComponentModel.ISite Site {get;set;} SynchronizingObject Property System.ComponentModel.ISynchronizeInvoke Synchronizing...
$timer 変数は、System.Timers.Timer 型であることがわかります。
(8)では、"Timers.Timer" となっていましたが、PowerShell では、"System." を
省略することができます。サンプルは省略しないで欲しいですが・・・
さて、このTimer 型には、Disposed とElapsed のイベント(Event)を持っています。
Disposed は、オブジェクトを破棄するときに発生します。
Elapsed は、google 翻訳で調べると、"経過"と出ましたので、タイマーで
時間が来たらイベントが発生することになります。
PS (21) > start "http://translate.google.com/#en|ja|Elapsed"
パラメーターを使った関数を作ってみます。
(1)で関数を作ったので、ここでは、パラメーターを使った関数を作ってみます。
PS (22) > function Open-GoogleTranslateEnglishToJapanese
>> {
>> param([string]$word)
>> start "http://translate.google.com/#en|ja|$word"
>> }
>>
パラメーターは、param() の中に記述します。[string] は System.String 型の
省略です。
PS (23) > New-Alias en2ja Open-GoogleTranslateEnglishToJapanese
そして関数に対して、Alias を作成します。
PS (24) > en2ja Elapsed
これで、分からない単語を調べれらます。(Elapsed は知らなかった)
Register-ObjectEvent の処理
Register-ObjectEvent コマンドレットは、Timer 型の Elapsed イベントを
登録しています。
Timer は、Interval が 500 なので、500 ミリ秒(0.5 秒)に1回イベントを発生します。
sourceIdentifier パラメーターは、シェル内で一意になる名称で、Timer.Random は
適当な名称です。
このパラメーターは、文字列なので、"Timer.Random" と書けますが、(") は、これもまた
省略できます。省略だらけです。
Action パラメーターの中身=スクリプトブロック
残るは、Action パラメーターです。
中身は、0〜99 までの値を $random 変数に代入します。
PS (25) > $random = Get-Random -Min 0 -Max 100
PS (26) > $random
26
PS (27) > $random
26
代入された値は変わりません。もう一度代入します。
PS (28) > $random = Get-Random -Min 0 -Max 100
PS (29) > $random
6
これで変わります。
Action の後に{}で閉じられていますが、これは、HELP にもあるように、
スクリプトブロックです。
以下でスクリプトブロックのヘルプが見れます。
PS (30) > man about_script_block
TechNet はここです。http://technet.microsoft.com/ja-jp/library/dd315277.aspx
先ほどの代入をスクリプトブロックで記述してみます。
PS (31) > $sb = {$random = Get-Random -Min 0 -Max 100}
実行は、(&) 呼び出し演算子を前につけます。
PS (32) > & $sb
結果なし
この場合、代入して終わりになるので、$random 変数を出力するようにします。
PS (33) > $sb = {$random = Get-Random -Min 0 -Max 100;$random}
(;) セミコロンは、コマンドが一旦そこで終了し、次のコマンドを実行します。
この場合、$random を表示します。
実行してみます。
PS (34) > & $sb
28
PS (35) > & $sb
74
これで、1回ずつ実行されるので結果が異なります。
ということで、0.5 秒に1回ランダムな値を $random 変数に設定していることに
なります。
モジュール内の呼び出し方法
さて、(14) は何をしているでしょう。
構成は、(&) 呼び出し演算子 | モジュール | スクリプトブロック となっています。
これは、トッピック名が英語ですが、 about_command_precedence に記載されています。
PS (36) > man about_command_precedence
・・・ インポート元がモジュールであるコマンドの場合は、次の形式を使用して実行で きます。 & <PSModuleInfo-object> <command> たとえば、FileCommands モジュールの Add-File コマンドレットを実行するに は、次のコマン ド シーケンスを使用します。 $FileCommands = get-module -name FileCommands & $FileCommands Add-File ・・・
このあたりです。
先ほどもありましたが、{$randam} で、モジュール内の $random を出力をするように
命令しています。
$randam 変数の値は0.5 秒ごとに変わるので、(14) (15) (16) の値が変わっています。
かなり素早く (14) を連打すると、同じ値が表示されるかも、です。
HELP の例では、ここまででしたが、後始末をしておきます。
PS (37) > Unregister-Event -SourceIdentifier Timer.Random
PS (38) > $job | Remove-Job
応用編(音声でしゃべるので注意してください。)
音声ラーメンタイマーを作成したいと思います。
このサイトを参考にしました。
powershell.com | Power Tips » Text-to-Speech
http://powershell.com/cs/blogs/tips/archive/2011/10/06/text-to-speech.aspx
Interval を、3分にします。
PS (39) > $timer = New-Object Timers.Timer
PS (40) > $timer.Interval = 1000 * 60 * 3
PS (41) > $text = "ramen dekitayo"
PS (42) > $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed `
>> -sourceIdentifier Timer.Ramen -Action {
>> $object = New-Object -ComObject SAPI.SpVoice
>> $object.Speak($text) | Out-Null
>> }
>>
SAPI.SpVoice というCom オブジェクトを利用します。
ここで、タイマーを ON にします。
PS (43) > $timer.Enabled = $true
〜3分間〜
3分経つとシャベリます。
後始末して、終わりです。
PS (44) > $timer.Enabled = $false
PS (45) > Unregister-Event -SourceIdentifier Timer.Ramen
PS (46) > $job | Remove-Job
$false にしないと、何回もシャベリますので注意してください。
Register-ObjectEvent
- オブジェクトのイベントを登録します。
- System.Timers.Timer 型を登録すると、時間経過で値を変更できます。
- Register-ObjectEvent [-InputObject]
[-EventName] [[-SourceIdentifier] ] [[-Action] ] [-Forward] [-MessageData ] [-SupportEvent] [ ]
今日のコマンド
PS (1) > function Get-RandomCmdlet
>> {
>> Get-Command -CommandType cmdlet | Get-Random
>> }
>>
PS (2) > Get-Command -CommandType function -Name Get-RandomCmdlet
PS (3) > Get-Command -CommandType function -Name Get-RandomCmdlet | fl
PS (4) > Get-RandomCmdlet
PS (5) > Register-ObjectEvent
PS (6) > man Register-ObjectEvent -full
PS (7) > man Register-ObjectEvent -Examples
PS (8) > $timer = New-Object Timers.Timer
PS (9) > $timer.Interval = 500
PS (10) > $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed `
>> -sourceIdentifier Timer.Random -Action {$random = Get-Random -Min 0 -Max 100}
>>
PS (11) > $job.gettype().fullname
PS (12) > $job | format-list -property *
PS (13) > $timer.Enabled = $true
PS (14) > & $job.module {$random}
PS (15) > & $job.module {$random}
PS (16) > & $job.module {$random}
PS (17) > $timer.Enabled = $false
PS (18) > & $job.module {$random}
PS (19) > & $job.module {$random}
PS (20) > $timer | gm
PS (21) > start "http://translate.google.com/#en|ja|Elapsed"
PS (22) > function Open-GoogleTranslateEnglishToJapanese
>> {
>> param([string]$word)
>> start "http://translate.google.com/#en|ja|$word"
>> }
>>
PS (23) > New-Alias en2ja Open-GoogleTranslateEnglishToJapanese
PS (24) > en2ja Elapsed
PS (25) > $random = Get-Random -Min 0 -Max 100
PS (26) > $random
PS (27) > $random
PS (28) > $random = Get-Random -Min 0 -Max 100
PS (29) > $random
PS (30) > man about_script_block
PS (31) > $sb = {$random = Get-Random -Min 0 -Max 100}
PS (32) > & $sb
PS (33) > $sb = {$random = Get-Random -Min 0 -Max 100;$random}
PS (34) > & $sb
PS (35) > & $sb
PS (36) > man about_command_precedence
PS (37) > Unregister-Event -SourceIdentifier Timer.Random
PS (38) > $job | Remove-Job
PS (39) > $timer = New-Object Timers.Timer
PS (40) > $timer.Interval = 1000 * 60 * 3
PS (41) > $text = "ramen dekitayo"
PS (42) > $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed `
>> -sourceIdentifier Timer.Ramen -Action {
>> $object = New-Object -ComObject SAPI.SpVoice
>> $object.Speak($text) | Out-Null
>> }
>>
PS (43) > $timer.Enabled = $true
PS (44) > $timer.Enabled = $false
PS (45) > Unregister-Event -SourceIdentifier Timer.Ramen
PS (46) > $job | Remove-Job
Randomコマンドレット Write-Verbose 2/236
こんにちは、PowerShell「Randomコマンドレット」2回目です。
PS (1) > $commands = Get-Command -CommandType cmdlet
今回は変数を使います。
PS (2) > $commands
CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Computer Add-Computer [-DomainName] <String> [-Credential... Cmdlet Add-Content Add-Content [-Path] <String[]> [-Value] <Object[... Cmdlet Add-History Add-History [[-InputObject] <PSObject[]>] [-Pass... Cmdlet Add-Member Add-Member [-MemberType] <PSMemberTypes> [-Name]... Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String[]> [-PassThru] [-Ve... Cmdlet Add-Type Add-Type [-TypeDefinition] <String> [-Language <... Cmdlet Checkpoint-Computer Checkpoint-Computer [-Description] <String> [[-R... Cmdlet Clear-Content Clear-Content [-Path] <String[]> [-Filter <Strin... Cmdlet Clear-EventLog Clear-EventLog [-LogName] <String[]> [[-Computer... Cmdlet Clear-History Clear-History [[-Id] <Int32[]>] [[-Count] <Int32... Cmdlet Clear-Item Clear-Item [-Path] <String[]> [-Force] [-Filter ... Cmdlet Clear-ItemProperty Clear-ItemProperty [-Path] <String[]> [-Name] <S... Cmdlet Clear-Variable Clear-Variable [-Name] <String[]> [-Include <Str... Cmdlet Compare-Object Compare-Object [-ReferenceObject] <PSObject[]> [... ・・・
$commands変数に、コマンドがABC順に格納されています。
件数を数えると、やはり、236個あります。
PS (3) > $commands.count
236
ではランダムに抽出します。
PS (4) > $commands | Get-Random
CommandType Name Definition ----------- ---- ---------- Cmdlet Write-Verbose Write-Verbose [-Message] <String> [-Verbose] [-D...
とりあえず、実行してみます。
PS (5) > Write-Verbose
コマンド パイプライン位置 1 のコマンドレット Write-Verbose 次のパラメーターに値を指定してください: Message: random
エラーが表示されましたので、Messegeパラメーターに"random"を入力しました。
結果は無し。なんでしょう。
PS (6) > man Write-Verbose
名前 Write-Verbose 概要 テキストを詳細メッセージ ストリームに書き込みます。 構文 Write-Verbose [-Message] <string> [<CommonParameters>] 説明 Write-Verbose コマンドレットは、テキストを Windows PowerShell の詳細メッセージ ストリームに 書き込みます。通常、詳細メッセージ ストリームを使用し て、コマンドのデバッグに使用されるコマンド処理に関する情報を送付します。 既定では、詳細メッセージ ストリームは表示されませんが、$VerbosePreference 変数の値を変更す るか、またはいずれかのコマンドで Verbose 共通パラメーターを使 用することで、詳細メッセージ ストリームを表示できます。 関連するリンク Online version: http://go.microsoft.com/fwlink/?LinkID=113429 Write-Error Write-Warning about_Preference_Variables 注釈 例を参照するには、次のように入力してください: "get-help Write-Verbose -examples". 詳細を参照するには、次のように入力してください: "get-help Write-Verbose -detailed". 技術情報を参照するには、次のように入力してください: "get-help Write-Verbose -full".
デバック用に利用すると書いてます。詳しくHELPを見るには、-fullをつけます。
PS (7) > man Write-Verbose -full
名前 Write-Verbose ・・・ パラメーター -Message <string> 表示するメッセージを指定します。このパラメーターは必須です。Verbose-Message に対してメ ッセージ文字列をパイプ処理することもできます。 必須 true 位置 1 既定値 パイプライン入力を許可する true (ByValue) ワイルドカード文字を許可する false <CommonParameters> このコマンドレットは、次の共通パラメーターをサポートします: Verbose、 Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、 OutBuffer、および OutVariable。詳細については、 「get-help about_commonparameters」と入力してヘルプを参照してください。 入力 System.String パイプを使用してメッセージを含む文字列を Write-Verbose に渡すことができます。 出力 なし Write-Verbose は、詳細メッセージ ストリームに対してのみ書き込みを行います。 メモ -------------------------- 例 1 -------------------------- C:\PS>Write-Verbose -message "Searching the Application Event Log." C:\PS> Write-Verbose -message "Searching the Application Event Log." -verbose 説明 ----------- これらのコマンドは、Write-Verbose コマンドレットを使用して、ステータス メッセージを表示しま す。既定では、メッセージは表示されません。 2 番目のコマンドでは、Verbose 共通パラメーターが使用されています。これにより、$VerbosePrefe rence 変数の値とは無関係に、詳細メッセージが表示されます。 -------------------------- 例 2 -------------------------- C:\PS>$VerbosePreference = "Continue" C:\PS> Write-Verbose "Copying file $filename" 説明 ----------- これらのコマンドは、Write-Verbose コマンドレットを使用して、ステータス メッセージを表示しま す。既定では、メッセージは表示されません。 1 番目のコマンドは、"Continue" の値を $VerbosePreference ユーザー設定変数に代入します。既定 値の "SilentlyContinue" は、詳細メッ セージを抑止します。 2 番目のコマンドは詳細メッセージを書き込みます。 関連するリンク Online version: http://go.microsoft.com/fwlink/?LinkID=113429 Write-Error Write-Warning about_Preference_Variables
色々書いてます。
Messageパラメーターは、必須で文字列を入力する必要があると書いてます。
(5)でエラーになったのは、そのせいですね。
HELPで、サンプルだけ抽出するには、-Examples をつけます。
PS (8) > man Write-Verbose -Examples
・・・(7)の例1、例2のみが出力されます・・・
Write-Verboseコマンドレットは、$VerbosePreference ユーザー設定変数の
値によって、出力されたり、されなかったりが決まるとのことですので、
$VerbosePreferenceを調べます。
そのまま入力してみます。
PS (9) > $VerbosePreference
SilentlyContinue
PowerShellは、値(プロパティ、property)を持っていると表示する性質があります。
詳しく見る場合、Get-Memberを使います。
PS (10) > $VerbosePreference|Get-Member
TypeName: System.Management.Automation.ActionPreference Name MemberType Definition ---- ---------- ---------- CompareTo Method int CompareTo(System.Object target) Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() GetTypeCode Method System.TypeCode GetTypeCode() ToString Method string ToString(), string ToString(string format, Sy value__ Property System.Int32 value__ {get;set;}
$VerbosePreference変数は、System.Management.Automation.ActionPreference型であることが分かります。
変数は、Get-Variableで内容を見ることができます。
PS (11) > Get-Variable VerbosePreference
Name Value ---- ----- VerbosePreference SilentlyContinue
注意としては、Get-Variableの引数に、$は必要ありません。
さらに詳しく見るには、パイプラインで fl をつけます。
ちなみに、flは、Format-Listコマンドレットのエイリアスです。
PS (12) > Get-Variable VerbosePreference | fl
Name : VerbosePreference Description : 詳細メッセージが配信された場合の動作を指定します。 Value : SilentlyContinue Visibility : Public Module : ModuleName : Options : None Attributes : {System.Management.Automation.ArgumentTypeConverterAttribute}
では、HELPの例の内容を実行します。
PS (13) > Write-Verbose -message "Searching the Application Event Log."
結果なし。
PS (14) > Write-Verbose -message "Searching the Application Event Log." -verbose
詳細: Searching the Application Event Log.
出ました。黄色です。
$VerbosePreferenceの値を変更します。
PS (15) > $VerbosePreference = "Continue"
PS (16) > Write-Verbose "Copying file $filename"
詳細: Copying file
出ました。黄色です。しかし$filenameの部分が出ません。
$filenameを設定します。
PS (17) > $filename = "C:\Windows\System32\WindowsPowerShell\v1.0\types.ps1xml"
PS (18) > Write-Verbose "Copying file $filename"
詳細: Copying file C:\Windows\System32\WindowsPowerShell\v1.0\types.ps1xml
出ました。黄色です。$filename は、設定した値に変換されています。
(11)で見たように、Get-Variable を実行すると、値が Continue に変わっています。
PS (19) > Get-Variable VerbosePreference
Name Value ---- ----- VerbosePreference Continue
変更します。
PS (20) > $VerbosePreference = "Silently"
列挙値が無効なため、値 "Silently" を型 "System.Management.Automation.ActionPreference" に変換で きません。次のいずれかの列挙値を指定し、再試行してください。有効な列挙値: "SilentlyContinue、Stop、 Continue、Inquire"。 発生場所 行:1 文字:19 + $VerbosePreference <<<< = "Silently" + CategoryInfo : MetadataError: (:) []、ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
エラーが出ました。赤色です。
SilentlyContinue、Stop、Continue、Inquire が有効な列挙値とのことです。
もう一度、$VerbosePreference を調べます。
PS (21) > $VerbosePreference | Get-Member
TypeName: System.Management.Automation.ActionPreference Name MemberType Definition ---- ---------- ---------- CompareTo Method int CompareTo(System.Object target) Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() GetTypeCode Method System.TypeCode GetTypeCode() ToString Method string ToString(), string ToString(strin value__ Property System.Int32 value__ {get;set;}
GetType()メソッドを実行すると、列挙(System.Enum)であることが分かります。
PS (22) > $VerbosePreference.GetType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True ActionPreference System.Enum
Get-Member(エイリアス gm)に、staticパラメータをつけて実行すると、有効な列挙値が表示されます。
PS (23) > [System.Management.Automation.ActionPreference] | gm -static
TypeName: System.Management.Automation.ActionPreference Name MemberType Definition ---- ---------- ---------- Equals Method static bool Equals(System.Object objA,... Format Method static string Format(type enumType, Sy... GetName Method static string GetName(type enumType, S... GetNames Method static string[] GetNames(type enumType... GetUnderlyingType Method static type GetUnderlyingType(type enu... GetValues Method static array GetValues(type enumType) IsDefined Method static bool IsDefined(type enumType, S... Parse Method static System.Object Parse(type enumTy... ReferenceEquals Method static bool ReferenceEquals(System.Obj... ToObject Method static System.Object ToObject(type enu... Continue Property static System.Management.Automation.Ac... Inquire Property static System.Management.Automation.Ac... SilentlyContinue Property static System.Management.Automation.Ac... Stop Property static System.Management.Automation.Ac...
でました。
"SilentlyContinue"と文字列で設定していましたが、以下の入力と同じです。
列挙値は"SilentlyContinue"のように省略できます。
PS (24) > $VerbosePreference = [System.Management.Automation.ActionPreference]::SilentlyContinue
PS (25) > $VerbosePreference
SilentlyContinue
変更されています。
VerbosePreference以外のユーザー設定変数も見てみます。
PS (26) > variable *Preference
Name Value ---- ----- ConfirmPreference High DebugPreference SilentlyContinue ErrorActionPreference Continue ProgressPreference Continue VerbosePreference SilentlyContinue WarningPreference Continue WhatIfPreference False
色々あります。
以下のコマンドで、説明を読むことができます。
PS (27) > variable *Preference | select Name, Value, Description | ft -AutoSize -Wrap
Name Value Description ---- ----- ----------- ConfirmPreference High 確認を要求する時期を指定します。操作の ConfirmImpact が $ConfirmPreference 以上 の場合は、確認が要求されます。$ConfirmPreference が None の場合、操作が確認され るのは Confirm が指定されたときのみです。 DebugPreference SilentlyContinue デバッグ メッセージが配信された場合に行う動作を指定します。 ErrorActionPreference Continue エラー メッセージが配信された場合に行う動作を指定します。 ProgressPreference Continue 進行状況記録が配信された場合の動作を指定します。 VerbosePreference SilentlyContinue 詳細メッセージが配信された場合の動作を指定します。 WarningPreference Continue 警告メッセージが配信された場合の動作を指定します。 WhatIfPreference False true の場合は、すべてのコマンドに対して WhatIf が有効と見なされます。
HELPには、HelpFileという色々なトピックごとのヘルプが読めます。
ユーザー設定変数は、about_Preference_Variablesで読めます。
トピック名は英語なので、なかなかすぐ思いつかないですが。
PS (28) > man about_Preference_Variables
トピック ユーザー設定変数 簡易説明 Windows PowerShell の動作をカスタマイズする変数 詳細説明 Windows PowerShell には、その動作をカスタマイズするための一連の 変数が用意されています。これらの "ユーザー設定変数" は、GUI ベースのシステムのオプションと同様に機能します。 ユーザー設定変数は、Windows PowerShell の動作環境およびその環境 で実行されるすべてのコマンドに影響します。多くの場合、コマンド レットには、特定のコマンドのユーザー設定動作を上書きするための パラメーターがあります。 ユーザー設定変数およびその既定値の一覧を次の表に示します。 変数 既定値 -------- ------------- $ConfirmPreference High $DebugPreference SilentlyContinue $ErrorActionPreference Continue $ErrorView NormalView $FormatEnumerationLimit 4 $LogCommandHealthEvent False (ログに記録しない) $LogCommandLifecycleEvent False (ログに記録しない) $LogEngineHealthEvent True (ログに記録する) $LogEngineLifecycleEvent True (ログに記録する) $LogProviderLifecycleEvent True (ログに記録する) $LogProviderHealthEvent True (ログに記録する) $MaximumAliasCount 4096 $MaximumDriveCount 4096 $MaximumErrorCount 256 $MaximumFunctionCount 4096 $MaximumHistoryCount 64 $MaximumVariableCount 4096 $OFS (空白文字 (" ")) $OutputEncoding ASCIIEncoding オブジェクト $ProgressPreference Continue $PSEmailServer (なし) $PSSessionApplicationName WSMAN $PSSessionConfigurationName http://schemas.microsoft.com/powershell/microsoft.powe rshell $PSSessionOption (下記参照) $VerbosePreference SilentlyContinue $WarningPreference Continue $WhatIfPreference 0 ・・・
色々書いてます。
Webではこちらで見れます。http://technet.microsoft.com/ja-jp/library/dd347731.aspx
Write-Verbose
- デバック用に文字列を出力する
- $VerbosePreference ユーザー設定変数の値によって出力されるかどうか決まる。
- $VerbosePreference の規定値は、SilentlyContinue で、出力されない。
- $VerbosePreference を、Continue に変えると出力される。
- ただし、Verboseパラメーターを付けると、強制的に出力される
- Write-Verbose [-Message]
[ ]
- Write-Verbose [-Message]
今日のコマンド
PS (1) > $commands = Get-Command -CommandType cmdlet
PS (2) > $commands
PS (3) > $commands.count
PS (4) > $commands | Get-Random
PS (5) > Write-Verbose
PS (6) > man Write-Verbose
PS (7) > man Write-Verbose -full
PS (8) > man Write-Verbose -Examples
PS (9) > $VerbosePreference
PS (10) > $VerbosePreference|Get-Member
PS (11) > Get-Variable VerbosePreference
PS (12) > Get-Variable VerbosePreference | fl
PS (13) > Write-Verbose -message "Searching the Application Event Log."
PS (14) > Write-Verbose -message "Searching the Application Event Log." -verbose
PS (15) > $VerbosePreference = "Continue"
PS (16) > Write-Verbose "Copying file $filename"
PS (17) > $filename = "C:\Windows\System32\WindowsPowerShell\v1.0\types.ps1xml"
PS (18) > Write-Verbose "Copying file $filename"
PS (19) > Get-Variable VerbosePreference
PS (20) > $VerbosePreference = "Silently"
PS (21) > $VerbosePreference|Get-Member
PS (22) > $VerbosePreference.GetType()
PS (23) > [System.Management.Automation.ActionPreference] | gm -static
PS (24) > $VerbosePreference = [System.Management.Automation.ActionPreference]::SilentlyContinue
PS (25) > $VerbosePreference
PS (26) > variable *Preference
PS (27) > variable *Preference | select Name, Value, Description | ft -AutoSize -Wrap
PS (28) > man about_Preference_Variables
Randomコマンドレット Get-Random 1/236
こんにちは、「Randomコマンドレット」を始めます。
PS (1) > gcm -co cmdlet | random
CommandType Name Definition ----------- ---- ---------- Cmdlet Out-String Out-String [-Stream] [-Width <Int32>] [-InputObj...
PowerShell には、236のコマンドレットと呼ばれるコマンドがあるので、
これをランダムに見ていこうと思います。
(1)のコマンドを入力すると、236のうち1つ選ばれて出力されます。
PS (2) > out-string
ランダムの結果、Out-String が選ばれました。
これを実行してみると、何も出力されませんでした。なんでしょう。
PS (3) > Get-Command -CommandType cmdlet | Get-Random
CommandType Name Definition ----------- ---- ---------- Cmdlet Disable-ComputerRestore Disable-ComputerRestore [-Drive] <String[]> [-Ve...
(1)は、(3)の省略した記述になります。
省略 | そのまま | 説明 |
---|---|---|
gcm | Get-Command | これは、エイリアス(alias)です。 |
-co | -CommandType | パラメータは、ある程度、省略できます。 |
random | Get-Random | コマンドは、"Get-"を省略できます。 |
今度は、ランダムの結果、Disable-ComputerRestore が選ばれました。
これは、なんでしょう?使ったこと無いですね。
PS (4) > man Disable-ComputerRestore
名前 Disable-ComputerRestore 概要 指定したファイル システム ドライブのシステム復元機能を無効にします。 構文 Disable-ComputerRestore [-Drive] <string[]> [-Confirm] [-WhatIf] [<CommonParameters>] ・・・
PowerShellの中で、ヘルプが読めます。
Webで検索すると、MSのTechNetのオンラインヘルプがすぐに出てきます。
(検索結果)http://technet.microsoft.com/ja-jp/library/dd347710.aspx
さて、Randomコマンドレットなので、1回目は、Get-Randomを調べます。
PS (5) > help Get-Random
名前 Get-Random 概要 ランダムな数値を取得するか、オブジェクトをコレクションからランダムに選択します。 構文 Get-Random [-InputObject] <Object[]> [-Count <int>] [-SetSeed <int>] [<CommonParameters>] Get-Random [[-Maximum] <Object>] [-Minimum <Object>] [-SetSeed <int>] [<CommonParameters>] 説明 Get-Random コマンドレットは、ランダムに選択された数値を取得します。オブジェクトのコレクションを Get-Random に送ると、ランダムに選択された 1 つまたは複数のオブジェクトをコレクションから取得します。 パラメーターまたは入力のない Get-Random コマンドは、0 (ゼロ) 〜 Int32.MaxValue (0x7FFFFFFF、 2,147,483,647) のランダムに選択された 32 ビット符号なし整数を返します。 Get-Random のパラメーターを使用すると、シード数、最小値と最大値、および送られたコレクションから 返されるオブジェクトの数を指定できます。 ・・・
色々書いてます。
早速やってみます。
まずは、そのまま。0〜2,147,483,647までの間でランダムな値が返ってきます。
PS (6) > Get-Random
904529694
PS (7) > Get-Random
1568636065
PS (8) > Get-Random
1361652924
次は、最少と、最大を決めて。
PS (9) > Get-Random -Minimum 1 -Maximum 100
85
PS (10) > Get-Random -Minimum 1 -Maximum 100
86
PS (11) > Get-Random -Minimum 1 -Maximum 100
80
PS (12) > Get-Random -Minimum 1 -Maximum 100
63
PS (13) > Get-Random -Minimum 1 -Maximum 100
26
次は、「オブジェクトをコレクションからランダム」ってことで
配列から一つ選びます。
1..100 は、1から100までの配列を作成します。
PS (14) > 1..100 | Get-Random
92
PS (15) > 1..100 | Get-Random
48
PS (16) > 1..100 | Get-Random
9
SetSeedパラメーターも試してみます。
同じ値が返ってきます。(使わなさそう・・・)
PS (17) > Get-Random -Minimum 1 -Maximum 101 -SetSeed 1
25
PS (18) > 1..100 | Get-Random -SetSeed 1
85
PS (19) > 1..100 | Get-Random -SetSeed 1
85
PS (20) > 1..100 | Get-Random -SetSeed 1
85
Get-Randomを調べるには、先ほどのhelp もしくは man もしくは Get-Helpを呼び出すと、
PowerShell内のヘルプが読めます。
もう一つは、Get-Commandで、詳しい内容を取得できます。
PS (21) > Get-Command -Name Get-Random
CommandType Name Definition ----------- ---- ---------- Cmdlet Get-Random Get-Random [[-Maximum] <Object>] [-SetSeed <Null...
ほとんど途切れてしまうので、後ろにパイプラインで fl をつけると全部みれます。
PS (22) > Get-Command -Name Get-Random | fl
Name : Get-Random CommandType : Cmdlet Definition : Get-Random [[-Maximum] <Object>] [-SetSeed <Nullable`1>] [-Minimum <Object>] [-Verbose] [-Debug] [-E rrorAction <ActionPreference>] [-WarningAction <ActionPreference>] [-ErrorVariable <String>] [-Warni ngVariable <String>] [-OutVariable <String>] [-OutBuffer <Int32>] Get-Random [-InputObject] <Object[]> [-SetSeed <Nullable`1>] [-Count <Int32>] [-Verbose] [-Debug] [- ErrorAction <ActionPreference>] [-WarningAction <ActionPreference>] [-ErrorVariable <String>] [-Warn ingVariable <String>] [-OutVariable <String>] [-OutBuffer <Int32>] Path : AssemblyInfo : DLL : C:\Windows\assembly\GAC_MSIL\Microsoft.PowerShell.Commands.Utility\1.0.0.0__31bf3856ad364e35\Microso ft.PowerShell.Commands.Utility.dll HelpFile : Microsoft.PowerShell.Commands.Utility.dll-Help.xml ParameterSets : {[[-Maximum] <Object>] [-SetSeed <Nullable`1>] [-Minimum <Object>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-WarningAction <ActionPreference>] [-ErrorVariable <String>] [-WarningVariable <String>] [-OutVariable <String>] [-OutBuffer <Int32>], [-InputObject] <Object[]> [-SetSeed <Nullab le`1>] [-Count <Int32>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-WarningAction <Actio nPreference>] [-ErrorVariable <String>] [-WarningVariable <String>] [-OutVariable <String>] [-OutBuf fer <Int32>]} ImplementingType : Microsoft.PowerShell.Commands.GetRandomCommand Verb : Get Noun : Random
長いですね。
Get-Randomには、2種類の使い方がありました。
- ランダムな数値を返す
- 指定がなければ、0〜2,147,483,647
- 指定があれば、その範囲で返す。例えば1〜100 (-min 1 -max 100)
- オブジェクトをコレクションからランダムに返す
- 1から100の配列から1つ返す
- Get-Commamnd -CommandType cmdlet の結果から1つ返す
これは、パラメータセットと言って、1つのコマンドレットに2種類の使い方が
定義されています。
それぞれ名前が付いていて、以下で調べることができます。
PS (23) > Get-Command -Name Get-Random | % {$_.parametersets}
・・・長い
PS (24) > Get-Command -Name Get-Random | % {$_.parametersets}| % {$_.tostring()}
[[-Maximum] <Object>] [-SetSeed <Nullable`1>] [-Minimum <Object>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-WarningAction <ActionPreference>] [-ErrorVariable <String>] [-WarningVariable <String>] [-OutVariable <String>] [-Ou tBuffer <Int32>] [-InputObject] <Object[]> [-SetSeed <Nullable`1>] [-Count <Int32>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference> ] [-WarningAction <ActionPreference>] [-ErrorVariable <String>] [-WarningVariable <String>] [-OutVariable <String>] [-O utBuffer <Int32>]
PS (25) > Get-Command -Name Get-Random | % {$_.parametersets}| % {$_.name}
RandomNumberParameterSet RandomListItemParameterSet
Get-Random
- ランダムな数値を返す (ランダムナンバーパラメータセット)
- 指定がなければ、0〜2,147,483,647
- 指定があれば、その範囲で返す。例えば1〜100 (-min 1 -max 100)
- RandomNumberParameterSet
- Get-Random [[-Maximum]
- オブジェクトをコレクションからランダムに返す (ランダムリストアイテムパラメータセット)
- 1から100の配列から1つ返す
- Get-Commamnd -CommandType cmdlet の結果から1つ返す
- RandomListItemParameterSet
- Get-Random [-InputObject]
[-Count ] [-SetSeed ] [ ]
今日のコマンド
PS (1) > gcm -co cmdlet | random
PS (2) > out-string
PS (3) > Get-Command -CommandType cmdlet | Get-Random
PS (4) > man Disable-ComputerRestore
PS (5) > help Get-Random
PS (6) > Get-Random
PS (7) > Get-Random
PS (8) > Get-Random
PS (9) > Get-Random -Minimum 1 -Maximum 100
PS (10) > Get-Random -Minimum 1 -Maximum 100
PS (11) > Get-Random -Minimum 1 -Maximum 100
PS (12) > Get-Random -Minimum 1 -Maximum 100
PS (13) > Get-Random -Minimum 1 -Maximum 100
PS (14) > 1..100 | Get-Random
PS (15) > 1..100 | Get-Random
PS (16) > 1..100 | Get-Random
PS (17) > Get-Random -Minimum 1 -Maximum 101 -SetSeed 1
PS (18) > 1..100 | Get-Random -SetSeed 1
PS (19) > 1..100 | Get-Random -SetSeed 1
PS (20) > 1..100 | Get-Random -SetSeed 1
PS (21) > Get-Command -Name Get-Random
PS (22) > Get-Command -Name Get-Random | fl
PS (23) > Get-Command -Name Get-Random | % {$_.parametersets}
PS (24) > Get-Command -Name Get-Random | % {$_.parametersets}| % {$_.tostring()}
PS (25) > Get-Command -Name Get-Random | % {$_.parametersets}| % {$_.name}