2020年12月25日金曜日

◆Visual Studio CodeでPause

Visual Studio CodeでPauseを打ってEnterとかTabとか押すと勝手にFunctionが挿入されて閉口する。

2020年12月15日火曜日

◆noexitパラメータ

確か昔も嵌ったことがあってもしかするとどこかにメモしたのかもしれませんが再度。

start-process powershell.exe -Credential $cred -ArgumentList ("-command dir -noexit " )

このexitパラメータが効かなかったりするのだが、なぜかパラメータの先頭にするとOK。

2020年12月8日火曜日

2020年11月20日金曜日

◆配列宣言時に各要素の区切り文字を変えると動作が異なるのは何故か

https://ja.stackoverflow.com/questions/72053/%e9%85%8d%e5%88%97%e5%ae%a3%e8%a8%80%e6%99%82%e3%81%ab%e5%90%84%e8%a6%81%e7%b4%a0%e3%81%ae%e5%8c%ba%e5%88%87%e3%82%8a%e6%96%87%e5%ad%97%e3%82%92%e5%a4%89%e3%81%88%e3%82%8b%e3%81%a8%e5%8b%95%e4%bd%9c%e3%81%8c%e7%95%b0%e3%81%aa%e3%82%8b%e3%81%ae%e3%81%af%e4%bd%95%e6%95%85%e3%81%8b


Powershellっぽくて、こういう話は好きです。

簡単に言えば、

$a = 1
$b = 2


は、

$a = 1 ; $b = 2

って1行にも書けるよ。

てのと、

「,」と「+」は「,」が優先ねってだけの話だと思うのですが一見すると摩訶不思議にも思えるってところでしょうか。

まぁ、配列の区切りは「,」だけを使う人がほとんどでしょうから嵌る人はまずいないでしょうけど。

2020年11月10日火曜日

◆ファイルを逆順に読み込む

イベントログのチェックをしています。
昇順に読んでチェックするのに日付でソートすりゃ良いのかと思ったのですが秒までしかないので同じタイミングで出力があるとソート後の並びが担保されない。

仕方がないのでソートせずに逆順にして読もうかと・・・。

正当な方法は無さげなので以下を参考にしてやってみた。

http://munibus.hatenablog.com/entry/2014/08/13/061318

2020年10月28日水曜日

◆配列の連結

PS C:\> $a = 1,2,3
PS C:\> $b = 4,5,6
PS C:\> $a + $b
1
2
3
4
5
6
PS C:\> $a,$b
1
2
3
4
5
6

この2つは一見同じ結果に見えるが、$a = 1 とすると前者は

[System.Object[]] に 'op_Addition' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
発生場所 行:1 文字:1
+ $a + $b
+ ~~~~~~~
     + CategoryInfo          : InvalidOperation: (op_Addition:String) []、RuntimeException
     + FullyQualifiedErrorId : MethodNotFound

となる。

後者も一見良さそうに見えるが実際には多段階配列になってしまう。

$c = $a , $b
$c.count   #2になる
$c[0][0]     #1

どうすれば汎用的ですかね。

$c = @()
$c += $a |  %{$_}
$c += $b |  %{$_}

とか?

.NETクラスを使う?

連結も加算も「+」にしたので混乱を招く?

2020年10月22日木曜日

◆Get-ADUser フィルター(filter)の指定方法

外側をダブルコーテーション、文字列をシングルコーテーションで囲むのが基本でしょうか。

外側囲み記号

属性

値の指定方法

値の囲み記号

結果

シングルコーテーション

数値

コンスタント

無し

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

2020年10月13日火曜日

◆ActiveDirectory ユーザーの名前(name)を更新するには

どうするんでしょうね。

Set-Aduserには Name パラメータが無いんですね。

GUIでは更新できるので何かしら方法はありそうなのですが。

そのうち調べてみましょう。

2020年9月11日金曜日

◆ActiveDirectoryの配列、非配列のプロパティを同列に扱う

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 ){
    $b = if( $hoge –eq $true) { $a }
}

2020年8月31日月曜日

◆Select出力時に通し番号を振る

ニーズは結構ありそうなのですが。
やったことが無かった。

事前に振っておくと簡単なのだが出力時にソートするケースもあるのでSelectで振れると便利かも。

こんな感じ?

ベストではないかもしれないけど、まぁ使えそう。

$script:ctr = 0
dir | select @{name="項番";expression={$script:ctr+=1;$script:ctr}},name,length

2020年7月3日金曜日

◆管理者として実行する

以前メモしておいたものを実際に使う機会があったのでUPしておく。
かな~り昔にメモしておいたものなので今となってはもっとスマートなやり方があるのかもしれません。

$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = new-object Security.Principal.WindowsPrincipal $identity
if ($principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) -eq $false)
{
     $Args = '-noprofile -nologo -executionpolicy bypass -file "{0}"' -f
     $MyInvocation.MyCommand.Path
     $MyInvocation.MyCommand.Path
     Start-Process -FilePath 'powershell.exe' -ArgumentList $Args -Verb RunAs
     exit
}

#管理者として実行が必要な処理を以下に記述



上記の処理をスクリプトの先頭に記述しておくと自分自身を管理者実行で呼びなおしてくれるというもの。

これを独立させて、実行するスクリプトを引数で与えても良いのかもしれませんね。

2020年6月11日木曜日

◆Powershellのコンソールサイズをコマンドで変更する

画面のプロパティで変更するのは面倒なのでコマンドで変更する

mode 270,50                                                                                

と思ったけど違うなぁ・・・。

これ、基本的にはDOS窓用かな。
バッファサイズもこのサイズで上書きしちゃうので使えな~い。

プロファイルに以下の関数を突っ込んでおくかな。

function mySet-WinSize(
     $width = 270,
     $height = 50){

$windowsize = $host.UI.RawUI.WindowSize
$windowsize.width = $width
$windowsize.height = $height
$host.UI.RawUI.WindowSize = $windowsize

}

ここではバッファサイズはいじっていないので予めここで指定するサイズより大きなバッファサイズをプロパティで指定しておく。

2020年6月5日金曜日

◆URLエンコード

現場もだいぶ離れていたのと、もともとWEB系は苦手なので会社のWEBページをメンテナンスしろとか言われて右往左往している。

判りやすさ優先でHTMLのファイル名に日本語を付けたところ、ローカル環境では問題なかったがサーバー(Linux)に持っていったらリンク文字が化けているようでアクセスできない。

日本語以外のファイル名を付けるには修正量が多すぎるので思案していたところ、
URLエンコードすれば良いのに気が付いた。

いつもよく見ているのだが、まったく意識していないのでなかなか気づけなかった。

変換の仕方は至極簡単で、

Add-Type -AssemblyName System.Web しておいてから、

[System.Web.HttpUtility]::UrlEncode(“ほげほげ”)

そういえばPowerShellの勉強を始めたころ使ったなぁ・・・。

-----

ローカルでうまくいったので安心していたらサーバーにUPしたらエラーになる。

リンクをクリックすると

Not Found

The requested URL /kensaku/html/巨人.html was not found on this server.

てな感じに表示される。

明らかに日本語ファイル名部分が文字化けしているのでエンコードがうまく理解されないのかと調べたが全く分からず。

だいぶ、悩んだ結果、
リンクが「hogehoge.html」
実際のフィルが「hogehoge.HTML」となっているのが原因のようで小文字に統一したところ解決した。

「HTML」という文字列はエンコードに含めていなかったし、上記メッセージでも「.html」は普通に表示されていたので、ずーっと日本語部分だとばかり思っていた。

Not Foundだけのメッセージならもっと早く気付いたかもしれないが、このメッセージは迷わすなぁ・・・。
きっとここのメッセージの文字化けとNot Foundは因果関係がないのだろう。

2020年5月15日金曜日

◆VSCodeでターミナルの文字化けを直す

バージョン:1.45.1
「ファイル」「ユーザー設定」「設定」を開き、「左ペイン」から「テキストエディター」をクリック。
すこし上にスクロールすると「settings.jsonで編集」リンクがあるのでクリックして
以下の設定を追加(ただし、ソースによって直らないケースもまだあるなぁ・・・)
ソースがUTF8の時はBOM付きがよさげ、だが完ぺきというわけでもない。
ソースはSJISが無難か?
"terminal.integrated.shellArgs.windows": [
"-NoExit",
"chcp",
"65001"
        ],



2020年3月25日水曜日

◆実行ポリシー

Restrictedな環境でもps1ファイルを右クリックして「PowerShellで実行」が動くのは最初からでしたっけ?

2020年3月18日水曜日

◆上書きしないCopy

今更ながらCopy-Itemとかでファイルが既にある場合、上書きしないようにするにはどうするんでしたかね・・・。

2020年1月6日月曜日

◆PowerShell Coreをインストールしてみる

[PowerShell Core 入門]の記事を参考に入門してみようと思い、せっかくならとCentOS(on Hypre-V)でインストールしてみたがうまくいかない。

いかんせん、Linuxはド素人なので何が起きているのかもよく判らない。


とりあえず、以下のコマンド(直接ダウンロード)でインストールできた。

sudo yum install https://github.com/PowerShell/PowerShell/releases/download/v6.2.0/powershell-6.2.0-1.rhel.7.x86_64.rpm