Powershellっぽくて、こういう話は好きです。
簡単に言えば、
$a = 1 |
は、
| $a = 1 ; $b = 2 |
って1行にも書けるよ。
てのと、
「,」と「+」は「,」が優先ねってだけの話だと思うのですが一見すると摩訶不思議にも思えるってところでしょうか。
まぁ、配列の区切りは「,」だけを使う人がほとんどでしょうから嵌る人はまずいないでしょうけど。
Powershellっぽくて、こういう話は好きです。
簡単に言えば、
$a = 1 |
| $a = 1 ; $b = 2 |
って1行にも書けるよ。
てのと、
「,」と「+」は「,」が優先ねってだけの話だと思うのですが一見すると摩訶不思議にも思えるってところでしょうか。
まぁ、配列の区切りは「,」だけを使う人がほとんどでしょうから嵌る人はまずいないでしょうけど。
イベントログのチェックをしています。
昇順に読んでチェックするのに日付でソートすりゃ良いのかと思ったのですが秒までしかないので同じタイミングで出力があるとソート後の並びが担保されない。
仕方がないのでソートせずに逆順にして読もうかと・・・。
正当な方法は無さげなので以下を参考にしてやってみた。
PS C:\> $a = 1,2,3 |
この2つは一見同じ結果に見えるが、$a = 1 とすると前者は
[System.Object[]] に 'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
発生場所 行:1 文字:1
+ $a + $b
+ ~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) []、RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
となる。
後者も一見良さそうに見えるが実際には多段階配列になってしまう。
$c = $a , $b |
どうすれば汎用的ですかね。
| $c = @() $c += $a | %{$_} $c += $b | %{$_} |
とか?
.NETクラスを使う?
連結も加算も「+」にしたので混乱を招く?
外側をダブルコーテーション、文字列をシングルコーテーションで囲むのが基本でしょうか。
|
外側囲み記号 |
属性 |
値の指定方法 |
値の囲み記号 |
例 |
結果 |
|
シングルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter 'employeeid -eq 479' |
〇 |
|
シングルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter 'employeeid -eq $id' |
〇 |
|
シングルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'employeeid -eq $($p.id)' |
X |
|
シングルコーテーション |
文字列 |
コンスタント |
ダブルコーテーション |
Get-ADUser -Filter 'samaccountname -eq "hoge_hoge"' |
〇 |
|
シングルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $account' |
〇 |
|
シングルコーテーション |
文字列 |
変数 |
ダブルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq "$account" ' |
X |
|
シングルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter 'samaccountname -eq $($p.account)' |
X |
|
ダブルコーテーション |
数値 |
コンスタント |
無し |
Get-ADUser -Filter "employeeid -eq 479" |
〇 |
|
ダブルコーテーション |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter "employeeid -eq $id" |
〇 |
|
ダブルコーテーション |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "employeeid -eq $($p.id)" |
〇 |
|
ダブルコーテーション |
文字列 |
コンスタント |
シングルコーテーション |
Get-ADUser -Filter "samaccountname -eq 'hoge_hoge' " |
〇 |
|
ダブルコーテーション |
文字列 |
変数 |
無し |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $account" |
X |
|
ダブルコーテーション |
文字列 |
変数 |
シングルコーテーション |
$account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$account' " |
〇 |
|
ダブルコーテーション |
文字列 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq $($p.account)" |
X |
|
ダブルコーテーション |
文字列 |
変数(プロパティ) |
シングルコーテーション |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter "samaccountname -eq '$($p.account)' " |
〇 |
|
波括弧 |
数値 |
コンスタント |
無し |
Get-ADUser -Filter {employeeid -eq 479} |
〇 |
|
波括弧 |
数値 |
変数 |
無し |
$id = 479 Get-ADUser -Filter {employeeid -eq $id} |
〇 |
|
波括弧 |
数値 |
変数(プロパティ) |
無し |
$p = 1 | select id , account $p.id = 479 ; $p.account = "hoge_hoge" Get-ADUser -Filter {employeeid -eq $($p.id)} |
X |
どうするんでしょうね。
Set-Aduserには Name パラメータが無いんですね。
GUIでは更新できるので何かしら方法はありそうなのですが。
そのうち調べてみましょう。
ActiveDirectoryに限った話ではないのだが、ActiveDirectoryのプロパティを扱っていて気付いた現象。
ActiveDirectoryには単一値を持つプロパティと配列を取るプロパティがある。
どちらになるかはMSの決めなので使う側からすると複数入れたいのに単一値プロパティだったり、一つしかないのに配列のプロパティだったりする。
そこで配列の場合も先頭の要素しか使わずに、複数必要な場合はカンマで区切って入れる運用とした。
実はこのプロパティが配列と単一値と混在すると意識していなかったのだが、たまたま以下の様なロジックでうまくいっていた。
$aに様々なプロパティが入ってきて、
| $b = if( $true ){ $a } |
$aがstringでも要素数1のstring配列でも$bにはstringが入ってくれた。
これを故有って以下の様に変えたら$bを使う場所でエラーが発生。
| if( $true) { $b = $a } |
$b の型がstringではないというエラーだった。
よくよく考えてみればこのエラーは理解できるのだが、そもそもじゃあなぜ変更前はうまくいっていたんだ?と逆に疑問に思った。
結局これはどういうことかというと、最初のロジックの動作は以下の様なイメージ。
| $b = $a | %{ $_ } |
要は値が詰めなおされている。
その際、$a の要素は1つなので$bの型は配列ではなく単なるstringになるのだ。
ここで、もう一つ今まで気づいていなかったことが発生。
$b にもともと値が入っていなければ最初のロジックで良いのだが、$bにもともと値が入っていて、ある条件の時だけ$aを設定したいといった時にこのロジックはうまくいかない。
どうも以下の様な動作をして$bの値をつぶしてしまうようだ。
| $b = if( $true ){ $a } else { $null } |
いままで結構Powershellを使ってきたがまだまだ気づいていないことがありますね。
結局今回のニーズでどのようなロジックがベストかは難しいところ。
以下の様なロジックを書いていたら、後から見た人にどちらかののIF文を削除される可能性もありそうですよね。
if( $hoge –eq $true ){ |
ニーズは結構ありそうなのですが。
やったことが無かった。
事前に振っておくと簡単なのだが出力時にソートするケースもあるのでSelectで振れると便利かも。
こんな感じ?
ベストではないかもしれないけど、まぁ使えそう。
$script:ctr = 0 |