PowerShell -Part 3

■ このスレッドは過去ログ倉庫に格納されています
2018/10/09(火) 17:46:48.32ID:G4IJkzod
前スレ
【最強CUI】PowerShell -Part 2
http://mevius.5ch.net/test/read.cgi/tech/1480109402/
158デフォルトの名無しさん
垢版 |
2018/11/01(木) 21:15:55.85ID:PBz6MbCm
Ruby では、Enumerator::Lazy で、無限リストを遅延処理できる

(1..Float::INFINITY).lazy.map{ |n| n*2 }.first(5)
# => [2, 4, 6, 8, 10]

これをLazyなしだと、先に無限配列を実体化しようとして、フリーズする

(1..Float::INFINITY).map{ |n| n*2 }.first(5)
# => (実行が終わらない...)
159デフォルトの名無しさん
垢版 |
2018/11/01(木) 22:34:36.78ID:j6Caq374
>>158
Rubyの場合も、PowerShellのように、複数のモジュール(PowerShellの場合だとCmdletやスクリプト)をつなげば連動して遅延実行してくれるのでしょうか。
Rubyの方が遅延実行は先駆ということは書かれていたけど。

使うことはないけれども知識として。
160デフォルトの名無しさん
垢版 |
2018/11/01(木) 22:35:45.48ID:j6Caq374
その無限リストというのが、その話なのかな?
161158
垢版 |
2018/11/01(木) 23:09:51.35ID:PBz6MbCm
Ruby では、内部イテレータのEnumerable と、外部イテレータのEnumerator がある

Enumeratorをメソッドチェーンしている間は、リストが実体化されないから、
Enumeratorで続けていって、最後に実体化する

内部イテレータは、イテレータ自身が繰り返し制御を行う。
一方、外部イテレータは、ユーザーが繰り返し制御を行う

外部イテレータでは、2つの配列を1つずつ進めたり、カスタマイズできる
162デフォルトの名無しさん
垢版 |
2018/11/01(木) 23:16:50.68ID:j6Caq374
C#と同じような感じだね

今回はPowerShellで遅延実行すると同じく
実体化されずに次の処理に渡ることが分かったので
こんどはコマンドレットを作ってみようと思う。
163デフォルトの名無しさん
垢版 |
2018/11/02(金) 19:41:44.34ID:mjKfpvc8
19,000,000件、20項目のCSVをimpo-csvで読んで、
group-objectで8x8のクロス集計したら
どうも読んでいる途中でおかしくなったようだ。
原因を探らんと・・・・。
800万件では問題なかったんだが。
164デフォルトの名無しさん
垢版 |
2018/11/02(金) 22:59:49.69ID:KoqyjIsr
インポならオマエのチンポがおかしい
2018/11/03(土) 21:38:47.42ID:0juc4OvK
遅延実行と聞くとコマンドプロンプトのforが思い浮かぶね
しかし遅延実行じゃなくて困ったことはあるがその逆は無い
遅延実行じゃないほうって何かメリットあるの?
2018/11/04(日) 01:00:07.52ID:EZKDDV0E
遅延実行もsetlocalのオプションで即時展開できるやん
2018/11/07(水) 16:26:31.91ID:64s9hY5n
リモートデスクトップ接続元がわかる方法ないかな?
クライアントPC名、ログインユーザー名、ipを見たいんだけど…

調べたらPSTerminalServicesってモジュールで出来るらしい記事があったんだけどもうインストーラー配布してないみたいで手詰まりです。
2018/11/07(水) 16:30:58.01ID:Y6Npd9Sa
それPowershellと関係ないだろ
2018/11/07(水) 16:33:27.61ID:64s9hY5n
すいませんでした
2018/11/07(水) 17:01:30.70ID:lW8FLp9M
>>167
https://powershelladministrator.com/2015/12/01/get-logged-on-users-and-sessions/

Get-RDUserSession |fl *
で拾えるとは思うから接続元プロパティ名わかったらselect-object UserName,(接続元のプロパティ名)
とかやってみて
2018/11/07(水) 17:04:41.31ID:64s9hY5n
>>170
ありがとうございます!
早速使ってみたいと思います!

スレ汚しすいませんでした。
2018/11/07(水) 17:04:49.71ID:lW8FLp9M
>>168
PowershellとWindowsサービス管理用コマンドレットは関係有りまくり
173デフォルトの名無しさん
垢版 |
2018/11/07(水) 19:32:24.46ID:5rQxDZaK
たしかに
もともと、PowerShellが出てきた目的の世界だね
2018/11/07(水) 21:28:10.26ID:0cfzNL20
でもここはプログラム板なので
2018/11/07(水) 21:30:12.65ID:M3d0NYL/
>>174
Windows板にこのスレがない時点で意味ない
2018/11/08(木) 06:31:15.25ID:zJM3NQZE
Windows PowerShell Part5 https://mevius.5ch.net/test/read.cgi/win/1474175184/
2018/11/09(金) 13:01:36.92ID:V62EYj3k
FizzBuzz 42文字でかけた

1..100|%{"$_`r"+{fizz}[$_%3]+{buzz}[$_%5]}
2018/11/09(金) 20:47:10.72ID:V62EYj3k
>>177
キャリッジリターンで上書きしてるだけなのでやや反則か
文字列長は(数字桁+1)文字されてる
2018/11/11(日) 03:17:15.29ID:v3JXSoAX
>>177
シンプルで美しい
2018/11/11(日) 07:15:18.30ID:tAZC+CW3
スクリプトブロックに[0]添字で値参照て技があるのか配列なら分かるけどなんか不思議
2018/11/11(日) 10:05:51.56ID:3JRsWB+V
PowerShellは配列の扱いがかなり独特
単なる数値でも配列扱いすると要素1つだけの配列みたいに振舞う
$a = 1
$a[0] ⇒ 1
$a[1] ⇒ $null
まあ>>177はよく思いついたなって思う
2018/11/11(日) 10:15:59.49ID:xoHShG4l
まず{fizz}が文字列になるという部分から読めなかった
2018/11/11(日) 12:45:53.82ID:xpOIALoe
バグみたいな仕様だな
バグだな
2018/11/11(日) 15:05:07.40ID:msMOLK59
powershell -v 2だと動かないな
PowerShell 3.0で配列じゃない変数も要素を取得できるようになったから動く
バグではないっぽい
185デフォルトの名無しさん
垢版 |
2018/11/11(日) 18:49:56.37ID:/HpWdlpY
スクリプトブロックでしょ
2018/11/11(日) 19:06:06.81ID:Fk6I1vC1
事務の仕事で、ファイル処理とかテキスト処理のため、たまにPowerShellを使ってます
挙動の予測ができずトライアンドエラーをする機会がVBAなどより少し多くて
素人にはちょっと難しいのかなあと思ってたのですが
理解不能な技>>177を見て、使いこなせる自信がますます無くなりました
2018/11/11(日) 19:37:24.70ID:xpOIALoe
>>184
{abc}[0] #=>abc
これがわかんない
スクリプトブロックで囲むと、なんでabcはエラーにならないの?
普通にabcとやったらコマンドレットじゃないってエラー出るのに
2018/11/11(日) 19:39:58.14ID:JFNgNrbU
スクリプトブロックを文字列にキャストすると中身が実行されずに中のコードがそのまま文字列になる
つまり [string]{ fizz } が暗黙になされてるだけ
2018/11/11(日) 20:33:31.13ID:tAZC+CW3
その説明もピンと来ないが
&[fizz] や $hoge={Fizz};&$hoge
とすればちゃんとエラーになる。
未実行のスクリプトブロックは一種のヒア文字列扱いとなるということなんだろうか…
2018/11/11(日) 20:34:21.67ID:tAZC+CW3
&{fizz} だったすまん
2018/11/11(日) 20:43:37.28ID:tAZC+CW3
powershell -v 2のエラーメッセージ
"型 System.Management.Automation.ScriptBlock のオブジェクトにインデックスを付けることはできません。"
わかるw
2018/11/11(日) 21:03:13.85ID:xpOIALoe
{ abc def ghi} #=> abc def ghi
なんか{}でかこまれた部分がそのまま文字列になってる
なにこれぇ
2018/11/11(日) 21:26:24.30ID:v3JXSoAX
1..100|%{"$_`r"+{fizz}[$_%3]+{buzz}[$_%5]}

1..100 # 範囲演算子で1から100までのint[]を生成
|   # パイプ演算子
%   # Foreach-Object
{   # スクリプトブロック開始(%の引数)
"   # 文字列開始(二重引用符の中ではエスケープシーケンスが展開される)
$_   # パイプラインの入力を受け取る自動変数
`r   # Carriage returnのエスケープシーケンス。後に続く文字で前の文字を上書きする(なにもない場合上書き無し)
"   # 文字列終了→string型
+   # 加算演算子(左辺がstring型なので右辺をstring型にキャストする)
{   # スクリプトブロック開始
fizz  # コマンド/関数名fizzとして解釈されるがスクリプトブロック内なので実行されない
}   # スクリプトブロック終了→ScriptBlock型
[   # []演算子で左辺を要素数1の配列としてアクセスする。
$_%3 # 配列のインデックス。%(剰余)演算子でパイプラインの入力$_を3で割る
]   # 上の結果が0(→3の倍数)の場合のみスクリプトブロックの要素にアクセス、1以上の場合$null
+   # 加算演算子(左辺がstring型なので右辺をstring型にキャストする)。
{buzz}[$_%5] # fizzと同じ。結果としてstringが評価されコンソールに出力される
}   #スクリプトブロック終了。
2018/11/11(日) 21:55:09.88ID:JFNgNrbU
>>189
単にスクリプトブロック型のオブジェクトが中身の生コードを持ってるだけやろ
{fizz}.ToString() しても同じ
ToString()でどういう値を返すかはオブジェクトの種類によって違う
&やコンマやInvokeしたときに初めてスクリプトブロック型オブジェクトが持ってるコードが評価される
2018/11/11(日) 22:21:33.88ID:JFNgNrbU
ちょっと舌足らずだった
スクリプトブロック型はToString()したときに
内部に文字列としてもってる生コードを返すってことが言いたかった
実際ソースを読んでるわけじゃないけど
2018/11/11(日) 23:20:57.99ID:xpOIALoe
スクリプトブロックは&で評価されるまで中身何もチェックされないみたいですね
一応動作は理解しましたがなんていい加減な言語なんだろ
こんなのどこにも書いてないし今後仕様変わる可能性はありそうですね
ありがとうございました
2018/11/12(月) 00:58:57.83ID:3c4TyDT9
こんなのは常識的に理解できる範囲や
パイプラインを考慮した関数をちゃんと作ろうと思ったら頭おかしなるで
198デフォルトの名無しさん
垢版 |
2018/11/12(月) 06:17:57.42ID:gZOE16Sc
>>193
たいへんに、ありがとうごわす
2018/11/12(月) 20:33:57.05ID:kM9Cc8DJ
まさにシェル芸
200デフォルトの名無しさん
垢版 |
2018/11/12(月) 20:51:57.60ID:ZJicw3nv
しかし、以前に比べて
投稿される内容が良くなってきたね
かつては『○○と比べてなんら』とか
そういう投稿ばかりだったもんね。
2018/11/12(月) 21:10:04.82ID:AMbuBroP
シェル芸ならこんなところ

seq 100|sed 's/.*5$/Buzz/;3~3s/[0-9]*/Fizz/'
202デフォルトの名無しさん
垢版 |
2018/11/12(月) 23:49:46.46ID:ZJicw3nv
どちらにしても、見てもわからないね
2018/11/13(火) 05:49:15.96ID:xWZc78Mp
知恵を絞って短縮コードを目指すから、理解容易ではないのはまあ仕方ない
2018/11/13(火) 08:37:24.02ID:6YAdmBBQ
3.0からの文法でできるならだれか思いついてそうだったけど検索しても出てこないな
Anarchy GolfにはPowerShell無いし、StackExchangeで58byte、牟田口氏のコードで51byte

いろいろテクニックが載ってて面白い
what is your fave PoSh version of FizzBuzz? : PowerShell
https://www.reddit.com/r/PowerShell/comments/6r06hg/what_is_your_fave_posh_version_of_fizzbuzz/
code golf - Tips for golfing in PowerShell - Programming Puzzles & Code Golf Stack Exchange
https://codegolf.stackexchange.com/questions/191/tips-for-golfing-in-powershell?page=2&;tab=votes#tab-top
205デフォルトの名無しさん
垢版 |
2018/11/13(火) 18:05:14.16ID:hYk6FFU0
IDがバーベキューだね
2018/11/14(水) 08:50:21.40ID:PFpyL5+w
PowerShell Core 6.1.0で日本語が正しく表示されない現象について
https://blog.shibata.tech/entry/2018/11/13/202031
2018/11/14(水) 09:25:00.49ID:JBsUV7Ak
>>206
teratailの質問がトリガーでした
https://teratail.com/questions/157003
2018/11/14(水) 14:34:06.24ID:REddJKuq
PowerShell で全角文字を入力すると表示がおかしくなる問題について
https://blogs.technet.microsoft.com/askcorejp/2018/11/14/powershell-で全角文字を入力すると表示がおかしくなる問/
2018/11/14(水) 20:33:58.55ID:JBsUV7Ak
ISEは問題ないのに、普通のシェルがダメって何年放置されてるのだろう?
2018/11/14(水) 21:42:06.99ID:wbqNTVov
VSCodeでPowershellの色寂しくなった
211デフォルトの名無しさん
垢版 |
2018/11/15(木) 00:08:24.89ID:WLDbhFjW
>>209
2か月じゃないか?
2018/11/15(木) 00:38:25.77ID:RLOkjNth
何年も放置されてるぞ
213デフォルトの名無しさん
垢版 |
2018/11/15(木) 00:41:50.91ID:WLDbhFjW
>>212
6.0はOKで6.1がだめと書かれてる
6.1が出たのは2か月前じゃないの
2018/11/15(木) 04:26:11.58ID:eQKfIPvp
>>208はデスクトップ版Powershellの話Win10が出て3年かな
215デフォルトの名無しさん
垢版 |
2018/11/15(木) 10:35:40.03ID:3jZ436MI
オプションを展開させるうまい方法ってありますか?
たとえば、-WhatIfを付ける/付けないを場合分けしたいときなど。
HogeCmd fuga piyo $whatif
とやると、$whatifは普通の引数になってしまうのでNG。
eval方式(コマンド全体を文字列にしてInvoke-Expressionで呼び出す)もあるけれど、
できれば、オプションのところだけうまいこと展開できればいいな、と。
2018/11/15(木) 13:52:20.43ID:94uNwBee
スプラッティングでやるのが普通かな
2018/11/15(木) 15:12:55.02ID:8dkxddcr
>>216
それ何?
2018/11/15(木) 15:25:38.96ID:VchA8nRa
>>216
横からだが、スプラッティングというものを初めて知って非常に参考になった。ありがとう。
2018/11/15(木) 16:00:23.13ID:4BqFdJaY
>>216
勉強になりました
ありがとう
220デフォルトの名無しさん
垢版 |
2018/11/15(木) 17:07:06.05ID:n3jFLh1o
>>216
サンクス
2018/11/15(木) 21:27:16.74ID:cJYjGYCA
スプラッタのスプラッタ
2018/11/15(木) 22:18:43.81ID:sPg3U71k
>>221
よせよ
バケラッタを連呼する某アニメキャラを連想しちゃっただろ
2018/11/16(金) 05:17:03.39ID:7vBGbpbo
スプラピスプラッタ
2018/11/16(金) 10:51:17.32ID:0JdshTdX
Announcing General Availability of the Windows Compatibility Module 1.0.0
https://blogs.msdn.microsoft.com/powershell/2018/11/15/announcing-general-availability-of-the-windows-compatibility-module-1-0-0/
2018/11/16(金) 17:17:39.49ID:h/lypBab
実行ユーザーがSYSTEMな場合の
COMオブジェクト利用がうまくいかないのは回避策ないでしょうか
2018/11/16(金) 22:04:34.76ID:bUstU+hr
v6.1.1 Release of PowerShell Core
https://github.com/PowerShell/PowerShell/releases/tag/v6.1.1
2018/11/16(金) 22:06:57.09ID:bUstU+hr
v6.0.5 Release of PowerShell Core
https://github.com/PowerShell/PowerShell/releases/tag/v6.0.5
2018/11/16(金) 22:55:21.07ID:6qpmN5uX
資格情報・認証とか?

「powershell 資格情報」で検索して
229デフォルトの名無しさん
垢版 |
2018/11/17(土) 06:13:16.64ID:bZFmP2aX
>>225
excelとか使うとき普通に使えてるけど
何かうまくいことがあるの?
2018/11/17(土) 07:39:47.70ID:tSr/NeZx
>>229
普通の使い方してたらSYSTEMなんかで動かすことはないからサービスとかで動かしたいとかなんだろうと思う
いずれにせよ状況小出しにする奴の相手してもしょうがない
2018/11/17(土) 07:47:24.60ID:gKTWKNrR
タスクスケジューラで動かしたいのかも。いずれにせよ具体例を書いて欲しいものだ
2018/11/18(日) 00:15:47.54ID:L8Gt0pA8
>>221
スプラッターハウス以外思い浮かばないw
2018/11/19(月) 16:50:05.08ID:g2+fQFFI
WindowsCompatibilityモジュール試してみたけどFormat-table用の情報とか無いから一部コマンドレットの表示が微妙
いちいちモジュール読み込まんとダメだし
234デフォルトの名無しさん
垢版 |
2018/11/19(月) 17:10:55.17ID:9fApbElg
>>233
Fomat-Table、モジュールなしだと使えなかったの?
2018/11/19(月) 19:27:11.18ID:xl/gDTc+
>>234
いや、そこまでの問題じゃない
Format-Tableで優先表示するプロパティ情報がないだけ
Format-Tableしても要らんプロパティがでてきたりする
Select-objectとかしてあげれば問題ないよ
2018/11/19(月) 19:59:58.22ID:Qq88xGOU
暗黙のWrite-Host|ft
が効かず、明示的に書かんどダメな感じ?
237デフォルトの名無しさん
垢版 |
2018/11/19(月) 21:26:04.01ID:Gl33OQrV
投稿がまともになってきた
2018/11/23(金) 16:20:10.48ID:5fd0Mgpu
Effective PowerShell的な本ってないの?
普段、使う分には問題なく使えてると思う
でもより上手い書き方があるのでは、良いコーディング習慣を守れてるだろうか、と自問自答すると自信を持てない
人に見せるものでもなく、人のを見る機会もないからどうしても自己流になってしまう
2018/11/23(金) 22:10:45.37ID:ZSsoDLJq
本じゃないけど

PowerShell のコーディングスタイル
http://tech.guitarrapc.com/entry/2017/12/03/230119
2018/11/23(金) 22:36:58.28ID:b8tU0Ani
文法詳説はこの前出た貝殻本が扱ってたけど
読みにくい(演算子の説明が130ページくらいから始まる)
2018/11/24(土) 01:01:38.61ID:sK2Z8lS/
バイナリモジュールの情報少ないよなあ
github漁ってもあんまりないし
コマンドレット内でGet-Item呼び出す方法探すだけでだいぶ苦労した
結局ダサいやり方になったけど
2018/11/24(土) 02:06:29.51ID:mWKK19aP
powershell深いなあ。深すぎてちょっと目眩する時がある
2018/11/24(土) 03:37:58.44ID:BKTpjWqm
get-netadapterとか見たいに複数の結果を返すようなクラスが作りたいんだけど
どんな感じで書けばいいん?
思い浮かばねえorz
2018/11/24(土) 03:58:00.19ID:wk1txPAQ
>>243
Function内でWrite-outputでクラスを複数回出力するとか
クラスの配列を返せばいいよ
2018/11/24(土) 04:04:11.42ID:BKTpjWqm
>>244
ちと理解できてない
例えば、get-netadapterの内容を編集して結果をだすクラスを作るとして
インプットが複数なのでそれを都度かえしていくってことでいいのかな?
2018/11/24(土) 05:43:08.48ID:wk1txPAQ
>>245
まず作りたいのはクラスじゃなくてFunction(関数)かメソッドかコマンドレット(外部関数)だよね?
クラスは型であって入力と出力を持つものでは無いし

Get-netadapterも含めて一般的なコマンドレットの出力型は配列で
配列の各要素がクラスになってる

Get-netadapterの結果に編集を加える場合、
入力された値をforeach等で分解して
クラスにAdd-member等で要素(プロパティとか)を加えて毎回出力するとかする

もしくは配列の各要素がPSCustomObjectクラスの変数を作って
それを出力するとかする

サンプルに丁度よい関数とかあればいいけど一端探すのめんどいから割愛
Add-memberとかクラスのメンバーについてはググって調べて下さいな
2018/11/24(土) 09:11:34.28ID:kuH8s62I
この手の話題でクラスとインスタンスの区別をせずに語られるとすごくモヤモヤする
2018/11/24(土) 12:12:31.33ID:+C2yOPuj
PSVersion 5.1.17763.134
PSEdition Desktop
で Windows.Forms.Timer がちゃんと動いてくれぬ
Tickイベント内の変数の変更を保持してくれない?
2018/11/24(土) 12:54:26.03ID:BKTpjWqm
>>246
ごめん、違う
2018/11/24(土) 13:22:16.60ID:BKTpjWqm
途中で切れてしまった
コンストラクタに引数設定できるでしょ
その引数にget-netadapterの結果みたいなのを使う
で、その値で各プロパティの初期値みたいなのをセット
各引数付きのメソッドを実行すると、引数とプロパティを処理した結果を返すんだけども
get-netadapterみたいに複数がコンストラクタのインプットになるから、どうしたもんかと
やっぱ、無理なのかな
2018/11/24(土) 13:44:41.51ID:QuuVAkmI
UTF-8を標準出力に出力するexeの結果を処理したいのですが
特定の文字が入っていると文字コード変換に失敗します
例えば以下の文字列はこのように文字化けします
 「ホスト#01」⇒「ホスチE01」
 「ホスト02」⇒「ホスチE2」

正しくPowerShellで扱える文字列に直す方法をアドバイスいただけないでしょうか

## ソース
$src = [System.Text.Encoding]::UTF8
$dst = [System.Text.Encoding]::Default
$test = & 'C:\test\UTF8.exe'
$bytes = $dst.GetBytes($test)
$result = $dst.GetString([System.Text.Encoding]::Convert($src,$dst,$bytes))


UTF-8を標準出力に出力するサンプルexe(C#)
Console.OutputEncoding = new UTF8Encoding();
Console.WriteLine("ホスト#01\r\nホスト02");
2018/11/24(土) 14:43:41.10ID:2Kjdv9to
>UTF-8を標準出力
でぐぐったら
>これで、UTF-8 を使うアプリとの連携もばっちりだ。
そうだ
2018/11/24(土) 14:43:42.28ID:+C2yOPuj
>>251
PowerShellの内部でのエンコードはたしかUTF16じゃないかな
2018/11/24(土) 16:43:37.74ID:QuuVAkmI
>>252
このスレに書き込んで説明するために標準出力って持ってきたのですが
ググってるときは標準出力って思いつかずサイトに巡りあえませんでした
おかげでなんとかなりそうです
ありがとう

>>253
UTF16だという情報もみて変えてみたりもしたのですが、
余計文字化けがひどくなったのでどう対応すべきか悩んでました
255デフォルトの名無しさん
垢版 |
2018/11/25(日) 01:27:52.64ID:bdma9Nzw
文字コードなど、考えたこともない。
UTF-8 しか使わないし

どのOS・アプリでも内部的には、UTF-16 だろうけど、これを扱うことなどない
256デフォルトの名無しさん
垢版 |
2018/11/25(日) 01:44:12.14ID:fZE2Z+wN
http://altohumano.com/gt-r%e3%80%80%E8%B2%B7%E5%8F%96/
2018/11/25(日) 10:54:09.80ID:Vpi5v0vn
PowerShellの変数ってちゃんと型指定したほうがいいの?
2018/11/25(日) 19:55:30.63ID:aKGD81aI
パフォーマンス気にして型変換するなら、Powershell使うこと自体が不適
通常は勝手に型変換しないように型付ける

v3のビットシフト演算子が勝手にbyte型をint型にキャストするのマジ糞
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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