1 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:36:12.07 ID:LaQ04ZoE.net] 前スレ PowerShell -Part 5 https://mevius.5ch.net/test/read.cgi/tech/1615994992/ 次スレは>>980 が立ててね!!
477 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 20:50:06.93 ID:M3Mn448S.net] >>460 どこがどうヘンテコって思い込んでるんだ?
478 名前:デフォルトの名無しさん mailto:sage [2022/07/12(火) 00:36:46.01 ID:XdROtN2x.net] Perlなんかもヘンテコって思ってれば筋は通る
479 名前:デフォルトの名無しさん mailto:sage [2022/07/14(木) 22:41:31.83 ID:ztzbKaJ8.net] 久々にvbsで書いたらめっちゃ素直でスラスラ書けるわ Powershellはせめてレキシカルスコープで作り直してくれ クラス使えって?
480 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 10:39:19.02 ID:y/m5s/RL.net] VBSはクソだろ https://twitter.com/Benshi_Orator/status/1546400388680945665 (deleted an unsolicited ad)
481 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 12:26:17.41 ID:nJv/8gNm.net] >>470 psだってレキシカルスコープだよ どういう動作を求めてるのかはしらんけど
482 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:13:05.28 ID:Wgy0KDme.net] ダイナミックスコープだったような
483 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:20:06.85 ID:Wgy0KDme.net] PowerShellの悲しい点は、関数とスクリプトブロックが動的にスコープされることです。 しかし、私が驚いたもう1つの点は、変数が内部スコープ内でコピーオンライトとして動作することです。 $array=@("g") function foo() { $array += "h" Write-Host $array } & { $array +="s" Write-Host $array } foo Write-Host $array 出力は次のとおりです。 g s g h g これにより、動的スコープの苦痛が少し軽減されます。 しかし、どうすればコピーオンライトを回避できますか?
484 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 13:22:56.94 ID:Wgy0KDme.net] これの解決策 ([ref]$array).Value += "h" ちとうんこすぎるね
485 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 14:34:08.02 ID:ROJrTMPq.net] コピーオンライトじゃなくてローカル変数が新しく定義されてるだけでは 動的スコープが嫌ならGetNewClosure()を呼べ [PSv2]PowerShellでクロージャ&カリー化 https://winscript.jp/powershell/204 ScriptBlock.GetNewClosure Method https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.getnewclosure
486 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 16:26:41.50 ID:mFZqR7Di.net] せめて問題を理解してからレスしろよ この動的スコープとは何ですか? ほとんどのプログラムは、理解しやすいため、レキシカルとも呼ばれる静的スコープを使用します。ソースコードを見ると、範囲内にあるものがわかります。Pythonの例では、スコープ内のxの唯一の値はxのグローバル値です。 対照的に、PowerShellは動的スコープを使用します。このモデルでは、スコープスタックに基づいて実行時に変数を検索します。関数を呼び出すたびに、新しいスコープを作成し、すべての値を親スコープからそのスコープにコピーします。PowerShellの例では、printXがsetAndprintXから呼び出されると、setAndprintXスコープで設定された$xの値を取得します。 なぜ動的スコープが必要なのですか? 字句スコープよりも動的スコープを選択する理由について、適切な説明を思い付くことができません。 「健康は病人だけが見ることができる王冠です」
487 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 17:59:02.69 ID:jPbc5odD.net] function foo() { $global:array += "h" Write-Host $array } & { $global:array +="s" Write-Host $array } ってやるだけじゃねーの? そもそもグローバル変数自体はそれ程使わん、ましてや関数やスクリプトブロックで更新なんてほぼやらん
488 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 21:33:28.03 ID:Keau4pUF.net] >>477 PowerShell in ActionによるとダイナミックスコープはUNIXシェルを参考にしたらしい
489 名前:デフォルトの名無しさん mailto:sage [2022/07/15(金) 23:56:32 ID:avBUMPl6.net] using namespace System.Collections.Generic $list = [List[string]] @('ggg'); '$list={0}' -f ($list -join ', ') | oh function f {$list.Add('fff'); 'f={0}' -f ($list -join ', ') | oh;} &{$list.Add('sb'); 'sb={0}' -f ($list -join ', ')|oh;} f '$list={0}' -f ($list -join ', ') | oh ↓ $list=ggg sb=ggg, sb f=ggg, sb, fff $list=ggg, sb, fff
490 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 13:19:21.19 ID:3YCfDQK3.net] >>480 .NEtのListコンテナ使うと意図通り動くのはなんでなん Powershellの配列の変数は値型とか? この辺をちゃんと理解ておきたい
491 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 14:25:05.61 ID:QBrOblFw.net] Listかどうかは関係ない 変数に新しい値を代入してるかどうか >>474 の $array += "h"は 新しく作った配列を $array に代入してるけど >>480 の $list はそんな事してないでしょ
492 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 14:36:33.24 ID:3YCfDQK3.net] >>482 えーつまり$array += "h"は文字列への追加じゃなくて やってることは$array = $array + "h"相当で新規に文字列のインスタンスとローカル変数が作成されるってことなの? $arrayに対してのAdd相当は$global:的な装飾子以外にないの?
493 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:02:15.96 ID:m/XBj/Ao.net] メインclerだけど、動的静的スコープの使い分けがclの武器と刷り込まれてた 評判悪いのか… 呼び出し側から振り分けられるのは便利では?出力先とか
494 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:49:49.15 ID:OVIs5jsH.net] lispのようにメモリ上フラットにオブジェクトが住む思想(~pwshのfunction:プロバイダ)だと、動的スコープになるのが自然では レキシカルな文脈が無いのだから
495 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:54:08.82 ID:yus9SEVI.net] Powershellの配列は固定長だよ 追加はできない +=演算子はその見た目のイメージ通り、新しい配列による再代入を伴う これはスコープとは関係ない問題
496 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 15:57:07.03 ID:m/XBj/Ao.net] ミュータブルかイミュータブルか、あと参照の話がごっちゃになってるよね GetNewClosureはclのfunctionフォームと等価だね
497 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 16:10:18.66 ID:XIhDxiQx.net] >>479 unixシェルもpwshもclもそうだけど、関数定義をズラズラっとダンプできて、それをちゃんと読み戻せる言語は原理的にレキシカルスコープでは有り得ない (暗黙のうちにletやクロージャ生成を行う)ブロックぽい構文でレキシカルスコープを模倣することは可能だけど
498 名前:デフォルトの名無しさん mailto:sage [2022/07/16(土) 17:23:13 ID:3YCfDQK3.net] LISP族はletか何かで変数に対しての宣言を必ずするからダイナミックでも違和感ないでしょ Powershellの違和感は暗黙的に変数の意味が代わるところじゃないかな
499 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 18:41:53.37 ID:zSvUsLU3.net] コード適当に書いていってある程度の規模になった頃にそろそそ関数化でもすっか! ってなった時に下手にグローバル変数更新してたりすると即はまるなコレ しかも一見何が悪いのかさっぱり判らないという Powershellコーティング十か条でも壁に貼っとかないとな
500 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 21:43:25.29 ID:dCc2dzlx.net] about_Scopes https://docs.microsoft.com/ja-jp/previous-versions/dd315289(v=technet.10) PowerShell のスコープ完全に理解した https://tech.blog.aerie.jp/entry/powershell-advent-calendar-2018-18
501 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 22:10:40.71 ID:CGK3IbQv.net] いや下手にグローバル変数更新はできんだろ、参照だけ
502 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 22:11:26.62 ID:LMlAcWpL.net] >>490 10ヶ条の最初に ・グローバル変数は使うな、ましてや更新する奴は死刑 って書いとけ
503 名前:デフォルトの名無しさん mailto:sage [2022/07/17(日) 23:45:40.91 ID:zSvUsLU3.net] >>491 MSの自動翻訳は的が外れてて知りたいことは何も書かれてない… 個人のurlの人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質 結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った 値渡しだけで済む書き方ができればなお良い
504 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 00:19:34.95 ID:+HoBYfWN.net] 結論出てよかったね
505 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 21:25:16.34 ID:0lMMqLG2.net] スコープの話をしたいわけじゃなかったのなら最初からそう言ってほしかった
506 名前:デフォルトの名無しさん mailto:sage [2022/07/18(月) 21:46:18.36 ID:RQQtBm3R.net] 文句付けたいけど根拠
507 名前:となる知識は無いから [] [ここ壊れてます]
508 名前:デフォルトの名無しさん mailto:sage [2022/07/20(水) 22:59:35.63 ID:DVSzMIGJ.net] Pesterって使ってる? 使ってないとしたらUTどうしてる? 証跡としてコードカバレッジ出す目的に今も使ってるけどPowerShellの言語としてとか実行ホスト(exe)の機能ではなく 式単位にブレークポイント仕掛けて実現してるんだかで処理速度も普段よりかなり遅いし、あんまり便利って気がしない。 (うろ覚え)記述によってはうまくコードカバレッジに反映されない事もあった気がする。 そんとき忙しくて詳しく調査してらんなくてコードの方変えた気がする。 確かif文の条件内で変数に代入したりしてる場合だったかな。 while($null -ne ($line = $stream.ReadLine())){}みたいなのだったかな。
509 名前:デフォルトの名無しさん mailto:sage [2022/07/20(水) 23:06:57.28 ID:ZWOh364P.net] PowerShellなんか想定した運用で動きゃいいでしょ 真面目にテスト書くようなものはC#で書きなさい
510 名前:デフォルトの名無しさん mailto:sage [2022/07/21(木) 22:42:00.80 ID:o92gVnUV.net] 以下のごく普通?のjsonがConvertFrom-Jsonだと意味不明なエラーで通らなかった '{"":"あーあ" }' | ConvertFrom-Json エラー出力 ConvertFrom-Json : Cannot process argument because the value of argument "name" is not valid. Change the value of the "name" argument and run the operation again. At line:1 char:17 + '{"":"あーあ" }' | ConvertFrom-Json + ~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [ConvertFrom-Json], PSArgumentException + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
511 名前:デフォルトの名無しさん mailto:sage [2022/07/21(木) 23:21:49.49 ID:hK8T/Nr3.net] >>500 PowerShell Core ではバグとして修正されてるらしい https://github.com/PowerShell/PowerShell/issues/1755 PowerShell Core は使ったことないが、Windows PowerShellが認めるJSONは独特なので外部とのデータ連携に使うには向いてない印象。 PowerShellからPowerShellへの受け渡しなら苦労は少ないけど、それならJSONで入出力する必要がないことが多い。
512 名前:デフォルトの名無しさん mailto:sage [2022/07/22(金) 00:05:10.76 ID:DccLQn0d.net] 名前なしの値ってjson採用してるアプリで普通に使われるんだよね 困ったわい
513 名前:デフォルトの名無しさん mailto:sage [2022/07/22(金) 01:13:11.32 ID:bxySyujx.net] JavaScriptってプロパティ名で空文字列が使えるもんなあ JavaScriptの仕様がファンキーすぎる気がしないでもない
514 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:10:35.01 ID:LaxYcXsV.net] ハッシュテーブルの実装的には問題ないんだろうか? どれとは言わんがある言語のハッシュテーブル実装用のハッシュ関数(種はランダム)に空文字列""通したら恒等的に0なんだが
515 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:11:49.39 ID:C81kwZF2.net] バッチスレでPowerShell使いなよってアドバイスもらって GetでJSON取得⇒JSON要素出力がこんなに簡単に出来るなんて感動した curlコマンドとjqコマンド駆使してやってたのがアホみたいだった でも構文とコマンドレット覚えるのは面倒
516 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 19:50:05.55 ID:ATmfTI/o.net] 種を要求するハッシュ関数ってよくあるんか?セキュリティ対策? ずっと同じ値が帰ってくるならハッシュテーブル的には問題ないかと
517 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:16:25.64 ID:xJ8anoa4.net] >>504 がなんか勘違いしてるんだろうと思う 種なんて聞いたことないし空文字列で 0 を返すのはよくある実装だと思う
518 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:35:46.87 ID:8xZeKJIl.net] >>506 起動時環境ノイズから勝手に取ってくるのが普通かと 同じハッシュ値持つキーがあると、まあ実装によるがDoS攻撃のいい的 追加情報で判別にフォールバックしたり、テーブル作り直したり、非常に負荷がかかる perl, python, pwshは少なくともそう python -c print(hash(""))→0 python -c print(hash(" "))→ランダムなint64 pwsh -nop -c '"".GetHashCode()'→ランダムなint32 perlはスマホに入ってないのでまた どちらも勝手に種植えてるね、Pythonは64bitにハッシュしてるから単純に強度が強いが、pwshが0でもランダムに見えるのに対し、常にf("")=0のpythonの実装はちょっと謎 fによって""と同じ値に写る文字列も毎回変わるので探すのも容易じゃないだろうけど、実際に規則性を見てしまうと他にも弱点ありそうな気がしてくる 事実としてpwshよりはwebで扱かれてるわけで、まあ大丈夫なんでしょう
519 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:38:19.25 ID:8xZeKJIl.net] >>507 デバッグ用に手動で植える機能はあるはずだよ、マニュアルのどっか見たら書いてるはず、もちろん非推奨だけど
520 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:49:17.30 ID:8xZeKJIl.net] 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方 誰か検証たのむ https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks 既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
521 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:49:36.14 ID:8xZeKJIl.net] 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方 誰か検証たのむ https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks 既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
522 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:50:04.66 ID:8xZeKJIl.net] 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方 誰か検証たのむ tps://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks 既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
523 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:50:41.34 ID:8xZeKJIl.net] 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方 誰か検証たのむ perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks (そのまま貼れない) 既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
524 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 20:51:20.66 ID:8xZeKJIl.net] 連投ごめん
525 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:27:35.49 ID:xJ8anoa4.net] とりあえずマニュアルをちゃんと読むことをお勧めしておく https://docs.python.org/ja/3/library/functions.html?highlight=hash#hash
526 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:29:23.20 ID:rYm6iVSU.net] で、件のjsの仕様だが、空文字でもよしなにハッシュしてくれるってことかいな?多分 空文字をキーとして使う事に関しては、言語固有のデータ型の概念も絡む パスカル文字列でもc文字列でも、空文字列自体はいかなるバイト表現も持ち得ない 値がなけりゃ関数にも渡せない 文字数や終端の0埋めバイトごと渡せば値になるが、そこは思想の問題だろうね
527 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 21:36:12.72 ID:8xZeKJIl.net] >>515 そこは言語リファレンスであって、リファレンス実装の(c)pythonとは(建前上)関係がない インタプリタについてはこっち、hash関数のランダム化とどうしても植えたい人用 https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
528 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:08:43.58 ID:xJ8anoa4.net] ああすまん、最近の実装まで追いかけきれてなかったな なるほど一つ賢くなったわ、ありがとう
529 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:10:01.71 ID:ZpfKnwiP.net] 実装のドキュメントもランダム化の有無に関わらず空文字列に0を返す事については触れてないな まあ実装の詳細も詳細だし、保証する意味も無いから、気になるならソース読むしかない 気になるなら、この実装に問題無いんですか、と元気があるなら問い合わせる案件
530 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:30:36.76 ID:Sct47BON.net] とりあえずPythonでhash("")==0なことはundocumentedなので依存するコードは書いちゃダメってことかな 偶々タイプが面倒だったのか、それでもよく見つけたな 一点だけ分かって現実に問題になるかはともかく、理想的なハッシュ関数の振る舞い(=完全にランダムに見える)として好ましくないのは確か pwshのこういう面白ネタないかな、まあまだまだ開発中なので山ほどありそうなのがアレだけど
531 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:32:46.88 ID:8xZeKJIl.net] undocumentedはMSのお家芸です
532 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 22:49:04.75 ID:FyEJHrzo.net] 面白そうなのでハッシュ衝突させてみた d=dict() d[0]="int 0" d[""]="nullstr" print(hash(0), hash(""), d) 0 0 {0: 'int 0', '': 'nullstr'} たった2個ぶつけて死ぬ事はまあ無いが、いくらか試して中身は予想付いてきた スレチごめん
533 名前:デフォルトの名無しさん mailto:sage [2022/07/27(水) 23:59:51.61 ID:su1evgJ+.net] 面白そうなのでpwshでも $h=@{0='int0'; ''='strnull'} write (0).GetHashCode(), ''.GetHashCode(). $h[0, ''] →0 498565465 int0 strnull cpythonと違い空文字列は0とは別物のようです なおpython/pwshともに値の等しいintとfloat型をキーにしようとしたらエラー ([double][int]::MaxValue -eq [int]::MaxValue) →True キーにfloatを使うアホが居るかは不明だけど、[double]の範囲では全ての[int32]が表せるので今の実装の整合性に問題はない さらに型を大きくするとfloatで表せる整数は歯抜けになってくるけどまあ -0.0→-0.0 (-0.0).GetHashCode()→0 整数としての値ですね $nan=[double]::NaN $nancode=$nan.GetHashCode() -214643572 $maxcode=[double]::MaxValue.GetHashCode() 214635072 $nancode + $maxcode→0ですね ところでナンだか見慣れた数字が… 2gb, 4gb→2147483648 42949672 $nan -eq $nan→False そう決めたからまあ、そうなんだけど $nancode -eq $nancode→True なんだかなー
534 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:20:32 ID:y/Pgitn8.net] 複数のNaNをキーにしたハッシュリテラル書くとInvalidOperation例外投げるな、Duplicate Keys 'NaN' are not allowed...らしい アサインすると値が上書き 見方によってはハッシュテーブルというアルゴリズムの敗北と言えるかもしれん 困る機会も思いつかないのが幸い
535 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:31:26 ID:8WeqhqUG.net] どのNaNとNaNも互いに値が等しくないからといって、キーがNaNまみれのハッシュ$nansが作れたとして じゃあ$nans[NaN]はどの値を返せば正解なんだよ
536 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 00:51:33 ID:y/Pgitn8.net] 抽象データ構造としての連想配列なら、NaNがインデックスとして渡されたら探索すらせずに常に$nullを返せばいい NaNと-eqなキーは$nansがNaNまみれであるかに関わらず存在し得ないんだから ハッシュテーブルはあくまで"ほぼ-eq"を使った連想配列の実装 $nan=[double]::NaN; $ht=@{$nan="abc"}; $h[$nan] は"abc" を返すはず
537 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 01:22:01 ID:AWyQ+yiB.net] そもそもnanは論理学と数学基礎論の公理、同一律を否定しているので、論理的思考を行っている限り無矛盾に理解することは原理的に不可能だぞ 考えるな、感じろ
538 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 13:14:46.86 ID:y/Pgitn8.net] >>505 jqはフィルターとして便利なだけじゃなく、プログラミング言語として非常に面白いと思ってるので、学ぶ価値ありだと思うよ 移行前はcmd+vimで何でもやってたな vimは安定してwinサポートしてたし、ユニコ以前から常に日本語パッチ供給されてて、強力なテキスト処理とある程度の構造化データ処理もできる入手性よいツールとして稀有だったはず 引数に直接スクリプト渡して非インタラクティブにバッチ処理できるからbatの中身はほぼvim/exスクリプトだった 多分2000年あたりでvim並みの機能かつ日本語サポートもしっかりしてるのはperlくらい
539 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 14:57:01.82 ID:HSo5zcUE.net] コードエディタとしては愛用してるけど、vimをコマンドとして使う発想に時代を感じる
540 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 15:19:13.17 ID:HSo5zcUE.net] こんな感じかね vim -es "g/\W?\|\Wwhere/ s//Where-Object/p" -c wq $profile こわいから-c wqはしないけど findstrでパターンマッチ、for /f ... in (file.txt)で行毎にスキャンして置換したのをechoとかやってたな
541 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 15:43:37.36 ID:y/Pgitn8.net] for /f "tokens=...delims=...skip=...eol=..."はプレーンな行毎のテーブルの処理には悪くない、明示的にフォーマットを指定してパースするので、むしろ分かりやすいまである クオートやエスケープの解釈、ダメ文字などイレギュラーに全く対応出来なかったり、/フラグ毎にforの挙動が別コマンドと言えるほど違ったりで、融通が全く効かないのがアレというだけ for /fで扱いやすいフォーマットで書いて読む閉じた世界に住んでるなら幸せ
542 名前:デフォルトの名無しさん mailto:sage [2022/07/28(木) 16:33:20.60 ID:y/Pgitn8.net] >>530 あーよく見たら$proflleか フリーフォーマットをfor /fで走査は黒魔術になるな、行をどう分割するにしろ、変数展開時の文字列置換は分割単位毎だし、行内複数マッチの場合どうするのか考えるだけでぞっとする vimに引数でコマンド渡すにはたとえ単一引数でも-cが必要、兄弟のsedやvi(m)のエイリアスexは専ら引数にコマンドを期待するので-e落として紛れはないけど、vi(m)はその名の通りvisualエディタだからはじめの引数にファイルを期待する
543 名前:デフォルトの名無しさん [2022/07/29(金) 21:36:58.16 ID:HWojhWX3.net] 最近仕事で触ることになって使い方習ったけど全然わからん
544 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 21:41:36.22 ID:wZddRh7F.net] 右も左も分からないなら、とりあえず良く使いそうなコマンドレットはエイリアスが事前に定義されてるので、galで出てくるのを順番に弄り回したりghするといいかも
545 名前:デフォルトの名無しさん mailto:sage [2022/07/29(金) 23:32:09.97 ID:HWojhWX3.net] 基本文法を覚える前にVB.NETでモジュールメソッド作成して呼び出すやり方覚えたら動けばいいやでそっちばかり使ってしまってなかなか覚えられない
546 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 01:54:14.48 ID:G28B9gdh.net] $OutputEncoding の初期値をUS-ASCIIからShift-JIS 932に変更したいのですが方法が分かりません 変更は $OutputEncoding = [Console]::OutputEncoding $OutputEncoding = [System.Text.Encoding]::GetEncoding(‘Shift_JIS’) などで出来るようなのですが既定値を変えたいです やりたい事はcmd上でripgrepをパイプで繋いだ際に文字化けしないようにしたいのですが https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#pipe-non-ascii-windows $OutputEncoding の既定値を変えられたとしてもcmd上でも効果があるのかは試してみないと分かりません こちらの解決法が分かる方が居ましたら是非教えて欲しいです
547 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 10:05:14.78 ID:3Aj3EGjO.net] プロファイルに記述、じゃだめ? PS> notepad $PROFILE.CurrentUserAllHosts
548 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 17:28:13.33 ID:BFM47HY2.net] >>537 ありがとうございます $profileでやってみました。UTF-8でなら使えそうなのですが $OutputEncoding をsjisにしたps上でもrgがUTF-8で吐いてるので無理みたいです 【.cmd】 バッチファイルスクリプト %13 【.bat】 https://mevius.5ch.net/test/read.cgi/tech/1542779527/496 参照先のようにUTF-8にすれば一応化けずに使えるのですがUTF-8だとコマンド類がascii以外機能しないものが多いのでバッチなどでは使いづらい sjisで使えたら貧弱なfindstrに置き換えられ便利になると思ったのですが残念です
549 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 18:34:17.55 ID:3Aj3EGjO.net] findstr置き換え目的でPowerShell持ち出すなら、Select-Stringとかの手もある。 rgの高速検索のメリットがPowerShellのオーバーヘッドを上回るなら、 例えば以下のような処理を関数なりスクリプトなりにしておくといいと思う。 スクリプト化しておけばcmdからもpowershell経由で使える。 #…けど、他のgrepコマンド導入した方が良さそうな気がする。 $path = "検索対象ファイルパス" $pattern = "検索パターン" $si = [Diagnostics.ProcessStartInfo]::new("rg.exe") $si.Arguments = '"{0}" "{1}"' -f $pattern, $path $si.UseShellExecute = $false $si.RedirectStandardOutput = $true $si.StandardOutputEncoding = [Text.Encoding]::UTF8 $proc = [Process]::Start($si) $stdout = $proc.StandardOutput while (! $stdout.EndOfStream) { $stdout.ReadLine() }
550 名前:デフォルトの名無しさん mailto:sage [2022/09/13(火) 18:36:39.73 ID:3Aj3EGjO.net] 誤:$proc = [Process]::Start($si) 正:$proc = [Diagnostics.Process]::Start($si) 動作確認してないので他にもあるかも。
551 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 00:41:00.54 ID:MPN5wMTP.net] 同階層にフォルダツリーA~Zまであり、それぞれのツリーの中身はバラバラです。 それぞれのツリーのCSVを出力したいのですが、やり方がイマイチ分かりません。 CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したいです。 PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが、各ツリー内の更新日を取得する部分とフォルダサイズを取得する部分を同時に行う事が私の頭では無理でした。何方かお助け頂けないでしょうか
552 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 17:45:18.14 ID:xipfHTvE.net] ツリーて何だ? フォルダに階層があってその中全部見たいということならGet-ChildItem -Recurseだぞ
553 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 17:57:09.50 ID:Wu29T3MH.net] ・コード貼ってバカにされるの嫌 ・具体例挙げるなど仕様詳細説明面倒臭いから文章から汲み取れ ・全部やれ こういうことだろう 舐め腐ってるヤツはスルーしときなよ
554 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 18:12:43.86 ID:6s8rSvAF.net] 本人はいたって真面目なパターンだろ ググった情報を組み合わせるスキルがないということは、悲しいかな往々にして他人に要件を一発で伝えるスキルも不足しがち 同時にやるのが無理めに感じるのはパイプを使おうとしてるからだろう for文とローカル変数で書き変えれば簡単
555 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net] 伝えるスキルうんぬんの前に > PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが って言うならそのコード上げろって話 ヘタに説明するより100倍早い
556 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net] いやできなかったコード上げても何の説明にもならんから 現状と得たい結果の図示だな
557 名前:デフォルトの名無しさん mailto:sage [[ここ壊れてます] .net] コードを上げたほうがいいんじゃないかとか図で伝えるべきなんじゃないかとかそういうの引っくるめての伝えるスキルだよ コミュニケーションは言葉に限定されない
558 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 20:42:50.25 ID:9IkSSHYa.net] >CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したい 変なモジュール入れんでも数行で書けるからがんばれ
559 名前:デフォルトの名無しさん [[ここ壊れてます] .net] パワー!
560 名前:デフォルトの名無しさん [[ここ壊れてます] .net] しっかしコマンドレットがコマンドライン実行時とスクリプト内呼び出しでパラメータ解釈が異なるって どんなキチガイが仕様考えたのか気になるわw switch型パラメータをスクリプト内で動的に外したり与える方法がないとか終わってる
561 名前:デフォルトの名無しさん mailto:sage [2022/09/21(水) 23:16:07.40 ID:9fmju/sW.net] >>550 何を言ってるんだ? ちゃんと質問したらお前の間違いを教えてもらえるかもしれんぞ
562 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 00:48:03.74 ID:XoRPEjFK.net] Ruby で、win32ole を使って、 フォルダ以下のサイズ(再帰的な子孫も含めて)は、 require 'win32ole' fso = WIN32OLE.new( 'Scripting.FileSystemObject' ) folders = [ "C:/Users/Owner/Documents/test_1", "C:/Users/Owner/Documents/test_2" ] folders.each do |folder| folder_obj = fso.GetFolder( folder ) puts File.expand_path( folder_obj.path ) # \ を、/ に変換する puts "#{ folder_obj.name } : #{ folder_obj.size }" end 出力 C:/Users/Owner/Documents/test_1 test_1 : 28803 C:/Users/Owner/Documents/test_2 test_2 : 4390
563 名前:552 mailto:sage [2022/09/22(木) 01:41:34.82 ID:XoRPEjFK.net] Ruby で、フォルダ以下のファイル(再帰的な子孫も含めて)で、 更新時刻が最も最近のものを求めた folders = [ "C:/Users/Owner/Documents/test_1", "C:/Users/Owner/Documents/test_2" ] folders.each do |folder| # 絶対パスのディレクトリ名の後ろに、* を付けること! # . で始まる、隠し directory, file を除く glob_pattern = folder + "/**/*" latest_file = Dir.glob( glob_pattern ) .select { |full_path| File.file?( full_path ) } # ファイルのみ .max_by { |full_path| File.mtime( full_path ) } # 更新時刻が最も最近のファイルパス puts "#{ latest_file }\n#{ File.mtime( latest_file ) }" end 出力 C:/Users/Owner/Documents/test_1/a.txt 2022-05-19 14:38:35 +0900 C:/Users/Owner/Documents/test_2/x/x.txt 2022-02-24 16:01:54 +0900
564 名前:552 mailto:sage [[ここ壊れてます] .net] Ruby で、CSV 形式で出力する部分は、 require 'csv' result_ary = [ [ "C:/Users/Owner/Documents/test_1", "28,803", "2022-05-19 14:38:35 +0900" ], [ "C:/Users/Owner/Documents/test_2", "4,390", "2022-02-24 16:01:54 +0900" ] ] # 2次元配列を、CSV 文字列に変換する csv_str = result_ary.map( &:to_csv ).join print csv_str 出力 C:/Users/Owner/Documents/test_1,"28,803",2022-05-19 14:38:35 +0900 C:/Users/Owner/Documents/test_2,"4,390",2022-02-24 16:01:54 +0900
565 名前:デフォルトの名無しさん mailto:sage [2022/09/22(木) 09:18:39.47 ID:5Z2vYjCC.net] >>541 @( "C:\dir1" "C:\dir2" ) | %{ $prop = [Ordered] @{Path=$_} $file = @(Get-ChildItem -LiteralPath $_ -Force -Recurse -File) ([Ordered] @{LastWriteTime='Maximum'; Length='Sum';}).GetEnumerator() | %{ $opt = @{'Property'=$_.Key; $_.Value=$true;} $prop += @{$_.Key = $file | measure @opt | select -exp $_.Value} } [PSCustomObject] $prop } | ConvertTo-Csv -NoTypeInformation
566 名前:デフォルトの名無しさん mailto:sage [2022/09/23(金) 00:05:04.72 ID:r49iT1KO.net] >>555 おおー無駄がなくてすごい これぐらい書けるようになりてぇ 開始は配列の変わりにコマンドレットでも良さそう Get-ChildItem -LiteralPath <親フォルダ> -Directory | ...
567 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 13:45:46.35 ID:5ly2Ski6.net] >>556 確かに。てか半端に汎用性意識せず、素直にこんなんでも良かったな。 @(Get-ChildItem -LiteralPath <親フォルダ> -Directory).FullName | %{ $file = @(Get-ChildItem -LiteralPath $_ -Force -Recurse -File) [PSCustomObject] @{ Path = $_ LastWriteTime = ($file | measure LastWriteTime -Maximum).Maximum Length = ($file | measure Length -Sum).Sum } } | ConvertTo-Csv -NoTypeInformation
568 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 14:01:26.72 ID:5ly2Ski6.net] いや、こうか。 Get-ChildItem -LiteralPath <親フォルダ> -Directory | %{ $file = @($_ | Get-ChildItem -Force -Recurse -File) [PSCustomObject] @{ Path = $_.FullName LastWriteTime = ($file | measure LastWriteTime -Maximum).Maximum Length = ($file | measure Length -Sum).Sum } } | ConvertTo-Csv -NoTypeInformation
569 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 14:13:19.66 ID:76wlmrvm.net] 試してないけどフォルダにファイルが1個も無い場合を考慮できてない気がする
570 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 14:48:45.69 ID:5ly2Ski6.net] 知らんかった。前者つもりだった。 (@() | measure -Sum).Sum → 0 (@() | measure Length -Sum).Sum → Null
571 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 15:45:18.22 ID:76wlmrvm.net] powershellはgciはともかくmeasureが遅くてファイルが多くなると辛くなるね 結局C#に丸投げとかの手段になりそう
572 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 16:18:35.15 ID:PDKGWlWe.net] 試してないけど Get-ChildItem -LiteralPath <親フォルダ> -Directory | %{ $Stat = $_ | Get-ChildItem -Force -Recurse -File | Measure-Object LastWriteTimeLastWriteTime, Length -Sum -Maximum [PSCustomObject] @{ Path = $_.FullName LastWriteTime = $Stat[0].Maximum Length = $Stat[1].Sum } } | ConvertTo-Csv -NoTypeInformation ってやると多少効率的かと
573 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 17:09:36.54 ID:UvTk6pcp.net] >>561 まあC#でやった方が速いわな
574 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 19:58:47.42 ID:5ly2Ski6.net] >>562 なるほどな〜、余分な集計をする事になるとしても measureを1回で済ませられれば効率的な可能性があるのか、 さらにパイプラインで列挙と集計が同時進行になる可能性もあったり? と思い試してみたけど、残念ながらLastWriteTimeの-Sumがダメらしい。 -ea:SilentlyContinueなら?と思ったがLengthのMaximumしか出ない。 でもこのアイデアは使えそう。
575 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 20:11:16.46 ID:PDKGWlWe.net] >>564 ああなるほど、だから小細工してたのか、すまんかった てか、初めからURL書いとけば良かったな $Stat = $_ | Get-ChildItem -Force -Recurse -File | Measure-Object LastWriteTime.Ticks, Length -Sum -Maximum [PSCustomObject] @{ Path = $_.FullName LastWriteTime = [DateTime][Int64]$Stat[0].Maximum Length = $Stat[1].Sum } https://stackoverflow.com/questions/66697384/measure-multiple-properties
576 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 21:00:46.43 ID:UvTk6pcp.net] >>565 さも自分で考えたかのように書いて劣化パクリかよ
577 名前:デフォルトの名無しさん mailto:sage [2022/09/25(日) 21:03:35.79 ID:PDKGWlWe.net] そりゃすまんな