先月2月のWindowsUpdateか1月のものか定かではありませんが、WindowsStartメニューが切り替わって、正直なんか使いづらいのです。
デスクトップPCもそのうち切り替わってめんどくさっとか思っていたのですが、いつまでたってもメイン以外のPCのスタートメニューは昔のままです。まぁそうはいっても使いづらいですが。
気になったときにバージョンを確認しても違いは無いようですが、何なんでしょうこの違いは…。
設定>個人用設定>スタート
の設定項目も同じバージョンで違ってるし(笑)
メモやら記録やら
先月2月のWindowsUpdateか1月のものか定かではありませんが、WindowsStartメニューが切り替わって、正直なんか使いづらいのです。
デスクトップPCもそのうち切り替わってめんどくさっとか思っていたのですが、いつまでたってもメイン以外のPCのスタートメニューは昔のままです。まぁそうはいっても使いづらいですが。
気になったときにバージョンを確認しても違いは無いようですが、何なんでしょうこの違いは…。
設定>個人用設定>スタート
の設定項目も同じバージョンで違ってるし(笑)
最近動けばいいやと、powershellでスクリプトで処理させていると結構楽しくなってきます。
使うほどに気になるのは、細かいところで、エラー処理とか出力内容とか。
ファイルのタイムスタンプ操作で設定前と設定後の値を表示させていたのですが、表示方法をもう少し何とかならないかと。
どうせならpowershell風なテーブル表形式でもと思ったら、結構厄介。
オブジェクトのメンバ変数なら配列に入っていればそれなりになるはずだけど…そうでない場合は?という事で連想配列の配列で対応してみる。
助長ではあるもののこんな感じかな?
$vals = @()
$vals += [ValsClass]::new("new", $CreateTime, $LastWriteTime)
$vals += (@{Name="old"; CreateTime=(Get-ItemProperty $To).CreationTime; LastWriteTime=(Get-ItemProperty $To).LastWriteTime})
$vals += (@{Name="from"; CreateTime=$CreateTime; LastWriteTime=$LastWriteTime})
この配列を表示させるとこんな感じに。
Name Value ---- ----- LastWriteTime 26/03/10 21:58:57 CreateTime 26/03/05 17:21:03 Name old LastWriteTime 26/03/05 17:21:08 CreateTime 26/03/05 17:21:03 Name from
これをSelect-Object * | Format-Table すると
LastWriteTime CreateTime Name
------------- ---------- ----
26/03/10 21:58:57 26/03/05 17:21:03 old
26/03/05 17:21:08 26/03/05 17:21:03 from
[orderd]にしないと連想配列内の順序が保たれなくなるから、ですが、実装の処理上、末尾が最初にくる感じになってるみたいですね。
なので、連想配列の順序を保つために[orderd]@{}形式で配列に格納して表示させると
Name Value
---- -----
Name old
CreateTime 26/03/05 17:21:03
LastWriteTime 26/03/10 22:11:10
Name from
CreateTime 26/03/05 17:21:03
LastWriteTime 26/03/05 17:21:08
良い感じがしますが、これをSelect-Object * | Format-Tableさせてみると
Count IsReadOnly Keys Values IsFixedSize SyncRoot
----- ---------- ---- ------ ----------- --------
3 False {Name, CreateTime, LastWriteTime} {old, 26/03/05 17:21:03, 26/03/10 22:11:10} False {[Name, ol…
3 False {Name, CreateTime, LastWriteTime} {from, 26/03/05 17:21:03, 26/03/05 17:21:08} False {[Name, fr…
となってしまいまいました。Select-Object *の状態をみてみると
Count : 3
IsReadOnly : False
Keys : {Name, CreateTime, LastWriteTime}
Values : {old, 26/03/05 17:21:03, 26/03/10 22:11:10}
IsFixedSize : False
SyncRoot : {[Name, old], [CreateTime, 26/03/05 17:21:03], [LastWriteTime, 26/03/10 22:11:10]}
IsSynchronized : False
Count : 3
IsReadOnly : False
Keys : {Name, CreateTime, LastWriteTime}
Values : {from, 26/03/05 17:21:03, 26/03/05 17:21:08}
IsFixedSize : False
SyncRoot : {[Name, from], [CreateTime, 26/03/05 17:21:03], [LastWriteTime, 26/03/05 17:21:08]}
IsSynchronized : False
といった感じのオブジェクトになっています。これをいい感じにSelectなんとかしてFormatなんとかする方法が無さそうだったので、別の切り口を試してみました。
さらに助長になりそうですが、クラスを定義してオブジェクトの配列にしてみます。
class ValsClass{
$Name
$CreationTime
$LastWriteTime
ValsClass($Name, $CreationTime, $LastWriteTime){
$this.Name = $Name
$this.CreationTime = $CreationTime
$this.LastWriteTime = $LastWriteTime
}
}
$vals = @()
$vals += [ValsClass]::new("old", (Get-ItemProperty $To).CreationTime, (Get-ItemProperty $To).LastWriteTime)
:
$vals += [ValsClass]::new("new", (Get-ItemProperty $To).CreationTime, (Get-ItemProperty $To).LastWriteTime)
これを表示させてみると
Name CreationTime LastWriteTime
---- ------------ -------------
old 26/03/05 17:21:03 26/03/11 00:16:58
new 26/03/05 17:21:03 26/03/05 17:21:08
となってSelectなんとかとかFormatなんとかせず、目的の形で出力できました。
PSObjectとしてやったらもっとスマートな感じになりそうですが、とりあえずこれでいいか。
昨日ボツネタの愚痴を書いたわけですが、ようやく解決しました。
なんとなくPowerShellのHistoryと実際の履歴は別物というのは感じていたのですが、ドキュメントを読み進めていくと、どのように動いているのかが分かりました。
分かったうえで、最初はC#を経由して触らないとダメかな?と考えてヘルパーとしてスクリプトモジュール(.psm1)でも作っておくのが便利かな?とか。
でも、もっと単純でした。
[Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory()
を呼び出すだけで単純にPowerScriptのコンソール内で動いているPSReadLineの履歴に入れることができました。
これで、一連の動作内でまとめたスクリプト内で呼び出している内容を履歴に入れて、部分的に再実行させることがしやすくなりました。デメリットとしては不要な履歴が追記されるので履歴のトルグで遡るときに邪魔になりますが、現段階では処理を取りまとめただけなのでデメリットを感じることは無いでしょう。
このメソッドの実装はあくまでPSReadLineの履歴に記録されるだけなので、PowerShellのHistoryには干渉していないので、そこまで反映させる場合は別途Set-Historyなどを行う必要があるでしょう。
ただし、(Get-PSReadLineOption).HistorySavePathには保存されているようなので、それを回避する場合はもっと何か考えないとダメかも。
あと、コンソール以外の実行状態(VisualStudioCodeのコンソールとか)だとPSReadLineが実装が違っていてエラーがでたり、するのかな?
まぁスッキリできたと。
ボツネタというか、四方八方試した感じだとダメそうという結果に…
コマンドライン履歴って便利だなぁと感じる一方、欲が出ると際限のない欲にかられる機能と思われますが、それでもPowerShellで結構いい感じに便利にはなってると思います。
ふとしたタイミングで[F2]キーを押して入力履歴が表示されてなんかスゴっ!とか思ったり。
それでなくても補完機能もそれなりに便利な感じで、ある定型の一連の処理があったとき、
PS > 出力ディレクトリの設定 T:\
PS > 加工処理するファイル群 C:\User\siriuth\documents\シーン1_*
PS > 加工処理するファイル群 C:\User\siriuth\documents\シーン2_*
PS > 加工処理するファイル群 C:\User\siriuth\documents\シーン3_*
なーんて処理をし続けてても、「出」と入力するだけで
PS > 出力ディレクトリの設定 T:\
と補完候補が表示された状態になるのはとても便利だったりします。
スクリプトに日本語を使っちゃうのはどうかとは思いますが(笑)
で、いろいろと作業が増えてくるとこいつらの処理の前後にどんどん作業が追加されていくわけです。臨機応変というより気分によったり状況に応じて。
そうするといくつかの処理を一纏めにしたり分割したりを繰り返していくわけですが、そうすると、アンカーの時間設定などが引数として内部に隠れてたりするわけです。
その値だけを微調整したいなぁ…なんて時に、コマンドラインの履歴で、例えば[↑]キーを押して表示されると便利だなぁ…と、思って調べてみると「Add-History」とか「Set-History」とかあるわけです。
時間ができたので色々やってみたのですが…惜しいところまではいくんですよ(笑)Get-Historyとかで表示させると確かにHistoryには載っている。ただ、コマンドラインの[↑]とか[↓]とか押しても反応しない…(Get-PSReadLineOption).HistorySavePathのファイルを見ても追記されていない。まぁそうだよねぇw
で、PSReadLineの方を見てみると、なんか色々できそうな上に拡張もできそうという事実。
でもそうじゃないんだ。今やりたいことは、、、、
という事であきらめてコピペできる様に表示させるだけで我慢しておこうかと思います😢
もうタルすぎる…
ちょいちょい地味に何かの処理がリアルタイム処理を邪魔してラグる…。
Windowsログを見る限りこれと言った痕跡はないものの、時刻設定などでエラーがチラホラ。
Wifiやルータ周りの設定を見直して、ルータなどの再起動は何度か行ってはいるものの、なぜか自動再接続されない状態になっていた。
このPC以外はこれと言った問題は無さそうなのですが…
で、とりあえず問題なさそうなので放置してたらセキュリティーアップデートがかかってて、終わった10分後ぐらいにラグ発生。ログには原因特定に至るものはないし…困った。
とりあえずネットワークから切り離してスタンドアローン状態にしましたが…なんだろうねぇ…このPCで初めての現象。
一番ありえそうなのが、昨日買ったUSB-HUBからノイズが出るようになって電波が不安定なのかな?
ラグるタイミングはWifiの接続が切断マークに変わったときに発生してるのを目撃したのだが…なぜかそのときは数十秒でWifi再接続されていた。わからんw