PowerShell -Part 5

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 00:29:52.04ID:/MpReTiX
前スレ
PowerShell -Part 4
https://mevius.5ch.net/test/read.cgi/tech/1577862511/

次スレは>>980が立ててね!!
2021/09/29(水) 23:56:59.06ID:fF+iSaYJ
>>545
そこでcmd |vim -Es -c ':g/re/p'
>>574
sshもwinRMも気兼ねなく両方使えばいいのでは
unixとlinuxが接続先ならssh、rshにpwshを設定するのはあまり想定されてないのか設定がちょっと面倒

だとしても、両方標準でサポートしてるwinはやはりunix/linuxよりリモート向きOSだと思ってます
2021/10/01(金) 00:56:43.69ID:vAUcQRYE
適当なのを探すのが面倒でリマインダーアプリをpowershell(C#)辺りで作ろうかと思うんだが
UIをwinformにするかWeb系にするか迷ってる
2021/10/01(金) 01:47:02.72ID:9Tf9Sjyk
Windows.UI.Notificationsを使うという手も
https://den.dev/blog/powershell-windows-notification/
2021/10/03(日) 20:53:35.06ID:GJ3xKl9+
ver7.1のConvertFrom-Jsonで取得したPSCustomObject/Hashtableが
{ "name"="foo"; "count"=1}
となっていて、key名に"count"が使われている為、
$v.count
$v['count']
等の値の取得でエラーになってしまうんですが、どうにか取得する方法は無いですか?
自分にはjsonの原文をreplaceするぐらいしか方法が見つかりませんでした。orz
2021/10/03(日) 21:17:26.86ID:RfSUiDPv
どんなJSONを使ったのか書いてくれ
580578
垢版 |
2021/10/03(日) 21:20:02.89ID:GJ3xKl9+
すみません。別の理由でエラーが出てたみたいで、ちゃんと取得できました。
申し訳ないです。
2021/10/05(火) 14:45:19.45ID:Vzh0q/ov
名前被ってても普通に$hash.count/$hash["count"]で.Valuesのcountが引かれる筈だけど、それがハッシュの文法なので

むしろコレクションのpropertyのCountが隠されるのが問題、こちらが確実に欲しければ$hash.Values.Count等と書くのが安全

$hash.Keys.countも同じ値を返すけど、これはKeysからキー"count"を引いてるように読まれる可能性が高いので勧めない
2021/10/06(水) 13:37:05.91ID:Y3s6WLpv
>>581
$hash = @{Values = @{Count = -1}} とかだと、駄目だよね。

これ、本当に確実に取得するのは、わりと面倒なのかも。普通の使い方なら、
$hash.get_Count() とか、$hash.psbase.Count とかでいいとは思う。でも、

$hash | Add-Member ScriptMethod get_Count {-1} -Force

とかされると、get_Count() は使えなくなる。

$hash | Add-Member NoteProperty psbase @{Count = -1} -Force

とかはエラーになるけれど、

$psbase = New-Object Management.Automation.PSNoteProperty psbase, @{Count = -1}
$hash.psobject.Members.Add($psbase, $true)

とか強引に追加すると、妙なことになって、psbase.Count も使えなくなる。

本当に確実そうな方法は、(New-Object hashtable $hash).psbase.Count とか、
$hash.GetType().GetProperty('Count').GetValue($hash) とか?
583デフォルトの名無しさん
垢版 |
2021/10/14(木) 16:20:34.79ID:Zuo7IXnW
powershellのcd (Get-Childitem)には、CDPATHに相当するもの(か概念)って無いのでしょうか?
(行きたいディレクトリに簡単に行けなくて 不便を感じてるのですが)
2021/10/14(木) 17:12:51.73ID:F6GJrbHM
ZLocationがおすすめ
https://github.com/vors/ZLocation
585デフォルトの名無しさん
垢版 |
2021/10/14(木) 17:56:55.09ID:Zuo7IXnW
>>584 情報ありがとうございます
まぁたしかに 何でも「つくればある」のだから、自分なりに工夫してみようかと思いました
586デフォルトの名無しさん
垢版 |
2021/10/14(木) 18:22:20.84ID:Zuo7IXnW
>>583
ついでに言えば…Set-Location の間違いでした (笑) 使い始めて二日目なもので...
2021/10/14(木) 21:15:12.30ID:loydBA97
ディレクトリをSet-Locationしたら.NETのAPI側も合わせないとずれたままだぞ
だから次のような2行書いとく習慣付けるといいかも
カレントパス指定なんてめったに使わないけど
Set-Location -Path パス名
[IO.Directory]::SetCurrentDirectory((Get-Location).ProviderPath)
2021/10/14(木) 23:40:28.07ID:aRG2i7ze
それこそGetCurrentDirectory使うときだけの話だよな
対話的にSet-Location使う程度では必要ないだろう
べつに(pwd).Pathとかも渡せるし

CDPATH 
pwshでそんな移動しまくらないからワイには必要ないな
2021/10/15(金) 01:03:33.08ID:P3+DrVIB
適当に$CDPATH=Get-Locationとかやってりゃいいんじゃない?
2021/10/15(金) 22:58:53.33ID:KlL89mo2
v7.0.8
https://github.com/PowerShell/PowerShell/releases/tag/v7.0.8
v7.1.5
https://github.com/PowerShell/PowerShell/releases/tag/v7.1.5
2021/10/19(火) 14:42:15.67ID:1a7BUMOp
一旦powershellで作ったはいいものの
起動が遅くてバッチやvbsで作り直す
常駐物ならC#で書き直す
2021/10/19(火) 20:57:46.00ID:aBJ6lObS
一旦powershellで作ったのはいいものでした
2021/10/19(火) 21:23:11.41ID:90J0NSJZ
PowerShellの起動が遅いと思うような環境ならC#アプリの起動も遅そうな気がするんだが
2021/10/20(水) 12:22:16.87ID:yLBdcth0
>>593
バッチやvbsだとpowershellが起動するまでに処理が終わってるし
C#に関しては話にならんほど差が出る
powershellの起動の問題は.NETランタイム以外にあるんじゃないの
サクっと作れるのは評価するが本番運用ではとても使えない
2021/10/20(水) 12:56:45.87ID:ngUNbqNs
要件次第としか
2021/10/20(水) 13:47:15.88ID:CIRlmBOD
起動時間シビアに気にするような本番運用ばかりじゃないしな
2021/10/20(水) 20:57:29.51ID:3GaA8N5r
ネットワークが遅いのでは?
起動時にインターネット接続見に行くので、ネットワーク遅いと辛いことに
スクリプト実行するだけなら、noprofile, noninteractive付けると良いですよ
2021/10/20(水) 20:57:35.93ID:3tEv1Sl5
PowerShellの起動が遅い人はプロファイルで時間がかかる処理してるんじゃないの
2021/10/20(水) 21:53:25.89ID:U4hhSk0+
イニシャルローディング時間が遅いだけで初回限りの現象なのでは?
2021/10/20(水) 23:22:34.38ID:P5BDeiqM
ネットワーク見てたのchocolatyのプロファイル読んでたからでしたわw
2021/10/21(木) 04:01:48.12ID:ehpI/07M
ふざけんな
2021/10/21(木) 12:31:37.50ID:kkshIJkE
PowershellでExcel操作できるの素晴らしくて信者になりそう
VBAやったことないけどVScodeで書きにくいってだけで敬遠する
2021/10/21(木) 12:48:08.17ID:WbB1T+tY
流石にVBAの方が使いやすいぞ
でもpwshでやるのが好き
2021/10/21(木) 12:51:21.99ID:yR1RZl9g
ExelがインストールされてるならCOM経由で操作できると思うけど、インストールされてない環境ならC#用のライブラリ使う感じかな
2021/10/21(木) 12:52:01.86ID:yR1RZl9g
VBAは遅すぎてなぁ
2021/10/21(木) 19:59:19.64ID:9KFcOoVu
チャートぐらい.NETの機能で描けるしExcelもVBAもいらない
2021/10/21(木) 22:53:22.14ID:snz0FCDA
excelはやたら高度な因子分析機能やソルバ(非線形、進化的最適化)ついてるから侮れない
2021/10/21(木) 23:03:44.60ID:fjfGcsWO
チャート描くのが目的なら使わなくていいんじゃない?
Exelの資料を編集するのが目的なら、COMかライブラリ使うしかない
2021/10/22(金) 08:29:48.79ID:tVaBgZ6B
エクセルよくわからんけどA.xslxのあるセルの値をB.xlsxのある場所に移す簡単なプログラム依頼されてて、VBA使えばできるんだろうけどわざわざシートにバインドされたマクロ書くのが無駄に感じるからpowershellで済ませようとしている...ダメ?
2021/10/22(金) 09:07:19.52ID:RUjjkZxa
好きにしろ
611デフォルトの名無しさん
垢版 |
2021/10/22(金) 10:07:54.24ID:EjatPKif
.psファイルは普通のPCでは実行できないよ
2021/10/22(金) 10:55:51.24ID:/YA0OWyv
>>611
誰もポストスクリプトファイル実行する話なんかしてないけどね
2021/10/22(金) 13:06:34.54ID:SA+7zjBD
上の方にあるpowershellスクリプトをバッチファイル内に埋め込む方法使えば、普通のWindows 10 PCなら動かせますよ
ポストスクリプトも一応チューリング完全だから、実行系さえあれば動かせますねwww
2021/10/22(金) 20:46:03.99ID:6MiPd5ZV
あーウゼー
2021/10/22(金) 21:21:39.78ID:EVzz2nOu
>>611
拡張子間違ってるぞ
2021/10/22(金) 22:24:13.62ID:8L7RGAQS
VSCode の拡張機能・GrapeCity のExcel Viewer じゃ、ダメなのか?

他にも、Rainbow CSV とか
2021/10/22(金) 23:08:57.50ID:fpd3u34i
>>616
スレチ
2021/10/23(土) 00:12:21.69ID:pYmoDx9D
代替案を出しただけでスレチとか
世界征服したいですとか質問が来たらどうすんだ
2021/10/23(土) 07:48:25.45ID:YfqEVQfQ
バカじゃねぇの?
2021/10/23(土) 08:53:25.35ID:p7WIutVI
>>618
PSで解決できる案を出せばそれはスレの趣旨に沿うだろ
2021/10/23(土) 10:07:48.57ID:bwy1yWHL
PSで世界征服
2021/10/23(土) 10:22:51.64ID:LN9x/bbj
Excel入ってない環境で内容を確認するだけなら使えそう
同じ処理を繰り返し実行するならスクリプト作るのがベスト
CSVなら外部ライブラリ導入せずともpowershellだけで処理出来るし
心を込めた手作業派はスレチ
2021/10/23(土) 21:14:23.04ID:j/f4QfO8
powershellの方がVBより文法的に楽だろJK
2021/10/23(土) 21:31:40.91ID:Q4dm2fcp
シジルが気になる人はそれなりにいるんじゃないかな?
まぁ、俺もVBの文法は肌に合わなくて、どうしてもマクロじゃないとダメって時だけしか触りたくないけど
2021/10/23(土) 22:19:22.89ID:EHtNtO17
VBAマクロはGitとかの管理がしんどくてコードレビューも辛い
2021/10/23(土) 23:12:10.13ID:ChfdQawL
PowerShellでCOMのIDispatchな操作やるとオブジェクト参照リークしまくるから別の専用プロセスでやるよね?
627デフォルトの名無しさん
垢版 |
2021/10/24(日) 07:49:15.35ID:9JgQl7FC
連想配列を学習中なのですが…
$a = @{"a"=10 ; "b"=20; "c"=30 } などとして連想配列を作り
> $a.count
3 # たしかに要素数は 3

なのに
> $a.length
1

lengthは 1 になるのは何故? …っていうか、1って何の長さ?
普通の配列だと、要素数は lengthでも countでも同じなのに
2021/10/24(日) 07:57:43.39ID:l/N511if
>>626
別プロセスでもよいけど、スクリプトブロック内で参照するオブジェクト作って、ブロックの外側でGC呼び出すだけでも十分じゃない?
629デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:09:09.46ID:l/N511if
>>627
$a | Get-Member
すると表示されるプロパティには"length"は無いし,いっつもタブ補完してるからlengthプロパティ見たことなかったけど,確かに1って表示されるね
630デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:14:44.25ID:l/N511if
配列は
$a = 1,2,3
,$a | gm
するとCountがAliasPropertyでLengthがPropertyって出てくるね
2021/10/24(日) 08:17:36.78ID:j8yOk2Jj
New V3 Language Features
https://devblogs.microsoft.com/powershell/new-v3-language-features/

You can now use Count or Length on any object, even if it didn’t have the property.
If the object didn’t have a Count or Length property, it will will return 1 (or 0 for $null).
Objects that have Count or Length properties will continue to work as they always have.

PS> $a = 42
PS> $a.Count
1
2021/10/24(日) 08:23:20.00ID:l/N511if
なるほどー
勉強になりました。ありがとう
633デフォルトの名無しさん
垢版 |
2021/10/24(日) 08:28:32.82ID:9JgQl7FC
つまり lengthなんてのが無くても 1は返る…と.
たしかに tabキーでの補完は出なかったけれど
でも 配列には lengthあるし、個人的にはrubyでもlength使えてたので…うっかり書きそうな気はするが、
…とりあえず勉強になりました
2021/10/24(日) 08:29:58.92ID:l/N511if
>>600
pwshだと起動時に更新チェックしてますよ
環境変数でオフに出来るみたいだけど
2021/10/24(日) 08:35:16.11ID:l/N511if
自分もRuby使ってるから分かりますわー
powershellではプロパティを大文字始まりのCamelCaseで書く様にすると
慣れるの早くなると思います
2021/10/24(日) 08:46:22.73ID:JG8zeEOx
$a.Countで1が変えるよりエラーを返して欲しいな
637デフォルトの名無しさん
垢版 |
2021/10/24(日) 09:21:28.43ID:l/N511if
blogの記事読むとForEach-Objectした際に
列挙可能なものかそうでないかの判定を行わずに済ませるためみたいです
確かにv2の頃は出力が一個だけだった時のために@()でくくってましたわ
それよりもForEach-Objectの省略記法で
(ls).FullName
ができるの初めて知りました.これは便利
2021/10/24(日) 09:51:12.20ID:1SVJ9Wvp
>>631
なんでこんな余計な機能をつけるんだろうね
>>636が言うように素直にエラーにして欲しいわ
2021/10/24(日) 10:47:06.59ID:l/N511if
foreachできるかいちいち判定するより便利だし、よいと思うけどな
実際、自分で書くスクリプトはめっちゃ恩恵にあずかってる
2021/10/24(日) 11:21:20.50ID:7IRX6L2k
知ってれば便利だし、知らなくてもあまり害にならないからね
今回の質問のケースも調べる気がなく急いでたならCount使えばいい案件
シェル言語は厳格さより楽さ優先でいい
惜しむらくはPSがもっと普及していれば変な癖も含めて常識になるけど、そこまで至ってないところ
641sage
垢版 |
2021/10/24(日) 13:02:54.56ID:cIzJWM7z
こんな感じのコードでもエラーが出ない為と書いてあったね

$x = dir
for ($i = 0; $i –lt $x.Count; $i++)
{
$x[$i] …
}

$x.gettype() で調べると値が1つならSystem.IO.FileSystemInfo
2つ以上ならSystem.Arrayで配列
配列と1つの値で同じコードで出来るのは個人的には楽でいいと思う
2021/10/24(日) 15:45:25.76ID:dQwbGYLm
jQuery Object も、0, 1, 2以上でも、配列として同じ書き方ができる。
0でもエラーにならず、単にループしないだけ

0, 1, 2以上で、表現・型を変えるものは、大変
2021/10/24(日) 17:38:58.32ID:jz1DejpB
>>641
配列を期待してるのに1要素が返る場合に配列で返らないのは階層データ構造を作る場合とても困る
gcはいつも$hagelist = [string[]](gc hage.txt)
ってやってるわら
ハゲが一人だと配列にならないしハゲがいないと$nullになるし
要素数0、1、2以上で型が変わる仕様はいつ見ても気持ち悪い
2021/10/24(日) 18:40:57.32ID:1SVJ9Wvp
まあこの手の仕様はどっちが正解とかはないので結局は好き嫌いでしかないよね
個人的には単一の値と配列を同一に扱いたい時は@(…)で充分なような気がする
645デフォルトの名無しさん
垢版 |
2021/10/25(月) 07:12:04.32ID:UuRFLqCB
ForEach-Objectだと配列のネストをフラットにしてくれるけどforeachだとそうならないから
@()でくくるので全て解決ってことにはならないんじゃないかな
あと,エラー出してくれる動作の方が好みなら
Set-StrictMode -Version Latest
にするとエラーになりますよ
2021/10/25(月) 23:46:47.63ID:ahXaOei7
countが使えるから何だって感じ
外部テキストファイル扱う時は0バイト、1行のみ、複数行のテスト必須だな
2021/10/26(火) 00:05:31.73ID:lX9x28FW
そうしたければそうすればいいんじゃないかな?
俺は必須だとは思わないけど
2021/10/26(火) 09:37:37.38ID:t3bhaUes
いちいちバイト数や行数を調べるより
何も考えずに@()を使ったほうが分かりやすい
649デフォルトの名無しさん
垢版 |
2021/10/26(火) 11:39:01.57ID:lX9x28FW
配列に$nullや空文字列が含まれる場合のチェックはどのみち必要になるだろうからv3記法がスッキリ書けて嬉しい
@()で括るのは想定外の挙動になるのと、もうすでにもっと簡易な記法が言語サポートされてるんだから使う必要ない
650デフォルトの名無しさん
垢版 |
2021/10/28(木) 11:41:35.91ID:d18Bz9B/
powershelle初心者だけどこんなバッチファイルを書き換えたい場合どうやって置き換えたらいいかな?
%%j(2番目トークン)の参照方法が分からないので教えてください。

for /F "tokens=1-2" %%i in (%TBL%) do (
if "%1" == "%%i" (
set MSG=%%j
  )
)
651デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:37:45.38ID:ZmBUU4bO
対応が付きやすいようになるべく同じかきかたしたらこんな感じかな
Get-Content $env:TBL -Encoding Oem | ForEach-Object {
$a, $b = -split $_
if ( $args[0] -eq $a ) {
$msg = $b
}
}
652デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:38:27.35ID:ZmBUU4bO
半角スペースが消えちゃって見辛い(泣
653デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:57:14.68ID:d18Bz9B/
>>652
ForEach-ObjectはXargsの様なものだと認識してるのですが少し齧ったレベルだと動きがよく分かりませんね…
後で実際に動かしてみます!どうもありがとうございます
654653
垢版 |
2021/10/28(木) 16:19:34.64ID:rsKCMs1x
>>651でやりたい動きになりました!
本当にありがとうございます!
2021/10/28(木) 21:48:59.07ID:ZmBUU4bO
ForEach-Objectはパイプからの入力を逐次に処理するイメージなので、なるべくまとめて処理するxargsとは逆の動作かな
Get-Contentはオプションなしだと行区切りの配列を返すので
自動変数$_には一行文の文字列が入る
-split演算子は右辺のみだと右辺の文字列を空白区切りで配列にして返すので
先頭の2つを受け取って処理してると

バッチと違って、対話環境で一つずつ動作を確認しながら動かせるので
いろいろ試して見ると早く慣れると思う
2021/10/28(木) 22:57:28.09ID:BKXGS6EF
みんなForeach-objectってよく覚えてるよね
省略形の%ばっかり使ってて忘れがちだわ
2021/10/29(金) 09:10:35.42ID:354Lg8uj
vscodeでスクリプト書いてると略すなって怒られるからね
2021/10/29(金) 13:55:51.86ID:o1+BEtnt
ターミナルでポチポチ動かす時は%や?を使ってる
コマンドレットもlsやcdを使ってるし
スクリプトはvscで指摘されるし補完も効くからエイリアス使わないかな
2021/10/29(金) 14:41:44.53ID:+PKyqpbv
>>656
まあ% = foreach-objectが染み付いてれば書くのも読むのも%のが早くはある
文法忘れるぐらいの頻度でしか触らない人は何じゃこりゃ!?ってなるが
2021/10/29(金) 18:01:47.11ID:83FlvPlk
スクリプトで低速のforeach-objectなんて使わないから、
結局本名で書く機会なんて無い。
2021/10/29(金) 19:43:20.82ID:o1+BEtnt
俺は結構使ってるなあ
2021/10/29(金) 22:42:07.83ID:354Lg8uj
>>660
PSで書くからには速度気にするべきじゃないと思うけどな
なんならパイプが遅いし
2021/10/29(金) 22:52:08.43ID:AeZX10et
ボトルネックになるような場所に使うなってのは当然だが
使う場所が無いってのはどうなんだろ
2021/10/30(土) 00:33:36.76ID:AwW6Wn8r
早すぎる最適化は諸悪の根源定期
性能改善を覚えるとそれが目的化するんや
そこに山があるんや
2021/11/02(火) 01:45:01.96ID:MFLvMhie
ForEach-Objectとわざわざ書く

%自体を使わない

がごっちゃになってるな

>>656
これが既成事実になってる気がする
別にみんな覚えてないだろ
補完は覚えているに入りません
2021/11/02(火) 01:50:33.01ID:MFLvMhie
iwr や gciなども アイリアス元なんか覚えてない
2021/11/02(火) 01:51:33.79ID:MFLvMhie
>>660
バッチファイルのfor /f(だっけ?)だし使わないわけない
目的が違うとしか言いようがない
2021/11/02(火) 07:40:44.52ID:+RlBaHPb
>>667
いや実際使ってないな
スクリプトブロックを&とかで呼び出して回した方が早いし書きやすいし
2021/11/02(火) 07:45:59.56ID:BCReJeM/
gciは使わないなぁ
lsか、補完でエイリアス元を使うかどっちか
オプション指定が必要な時はget-childitemですね

invoke-restmethodはproxy指定しないといけないから、コマンド履歴から呼び出してる
本当によく使うならプロファイルに書くんだけど、そこまででもない
2021/11/02(火) 07:53:21.41ID:BCReJeM/
>>668
どういうこと?
$array.ForEach{}みたいなのはforeach()の方が早いと思うけど
スクリプトブロックで回すってのがわかんないので、教えてもらいたいです
2021/11/02(火) 18:18:01.02ID:xDEug3LM
>>670
$array | &{process{ 何か処理 }}
スクリプトブロックのprocess部はパイプから受け取ったオブジェクトを1つずつ処理するのでこれでループ処理書ける

良いところ
パイプから渡せる
当然begin部とend部も使える
動作速度は%どころかforeach文すら上回る

悪いところ
&で呼び出すとスコープ周りが面倒臭い(ドットソースで呼べばいいだけだが)
2021/11/02(火) 18:52:00.08ID:BCReJeM/
すげー!
見た目Foreach-Objectと大して変わんないように見えるけど、なんで早いんだろう?
673デフォルトの名無しさん
垢版 |
2021/11/02(火) 19:10:27.17ID:BCReJeM/
全然意味ない例だけど試してみた

PS C:\> Measure-Command { ls -Recurse c:\Qt | & { process{$_.fullname > $null} } }
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 196
Ticks : 51967700
TotalDays : 6.01478009259259E-05
TotalHours : 0.00144354722222222
TotalMinutes : 0.0866128333333333
TotalSeconds : 5.19677
TotalMilliseconds : 5196.77

PS C:\> Measure-Command { ls -Recurse c:\Qt | % {$_.fullname > $null} }
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 190
Ticks : 61909279
TotalDays : 7.16542581018519E-05
TotalHours : 0.00171970219444444
TotalMinutes : 0.103182131666667
TotalSeconds : 6.1909279
TotalMilliseconds : 6190.9279

確かに速いね!不思議
2021/11/02(火) 20:10:29.35ID:cNrRrDlB
裏を返せばforeachは毎回スコープの是正処理が走るから遅いということか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況