前スレ
PowerShell -Part 5
https://mevius.5ch.net/test/read.cgi/tech/1615994992/
次スレは>>980が立ててね!!
探検
PowerShell -Part 6
■ このスレッドは過去ログ倉庫に格納されています
2022/02/13(日) 18:36:12.07ID:LaQ04ZoE
466デフォルトの名無しさん
2022/07/11(月) 11:27:13.34ID:4o6o7MFx おらシェル子のこどほどんどしらねっちゃ
467デフォルトの名無しさん
2022/07/11(月) 13:10:07.01ID:ekYGS06D そもそもpsでスクリプト使うならバッチじゃなくてps1だろ
468デフォルトの名無しさん
2022/07/11(月) 20:50:06.93ID:M3Mn448S >>460
どこがどうヘンテコって思い込んでるんだ?
どこがどうヘンテコって思い込んでるんだ?
469デフォルトの名無しさん
2022/07/12(火) 00:36:46.01ID:XdROtN2x Perlなんかもヘンテコって思ってれば筋は通る
470デフォルトの名無しさん
2022/07/14(木) 22:41:31.83ID:ztzbKaJ8 久々にvbsで書いたらめっちゃ素直でスラスラ書けるわ
Powershellはせめてレキシカルスコープで作り直してくれ
クラス使えって?
Powershellはせめてレキシカルスコープで作り直してくれ
クラス使えって?
471デフォルトの名無しさん
2022/07/15(金) 10:39:19.02ID:y/m5s/RL VBSはクソだろ
https://twitter.com/Benshi_Orator/status/1546400388680945665
https://twitter.com/5chan_nel (5ch newer account)
https://twitter.com/Benshi_Orator/status/1546400388680945665
https://twitter.com/5chan_nel (5ch newer account)
472デフォルトの名無しさん
2022/07/15(金) 12:26:17.41ID:nJv/8gNm473デフォルトの名無しさん
2022/07/15(金) 13:13:05.28ID:Wgy0KDme ダイナミックスコープだったような
474デフォルトの名無しさん
2022/07/15(金) 13:20:06.85ID:Wgy0KDme 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
これにより、動的スコープの苦痛が少し軽減されます。
しかし、どうすればコピーオンライトを回避できますか?
しかし、私が驚いたもう1つの点は、変数が内部スコープ内でコピーオンライトとして動作することです。
$array=@("g")
function foo() {
$array += "h" Write-Host $array
}
& { $array +="s" Write-Host $array }
foo Write-Host $array
出力は次のとおりです。
g s
g h
g
これにより、動的スコープの苦痛が少し軽減されます。
しかし、どうすればコピーオンライトを回避できますか?
475デフォルトの名無しさん
2022/07/15(金) 13:22:56.94ID:Wgy0KDme これの解決策
([ref]$array).Value += "h"
ちとうんこすぎるね
([ref]$array).Value += "h"
ちとうんこすぎるね
476デフォルトの名無しさん
2022/07/15(金) 14:34:08.02ID:ROJrTMPq コピーオンライトじゃなくてローカル変数が新しく定義されてるだけでは
動的スコープが嫌ならGetNewClosure()を呼べ
[PSv2]PowerShellでクロージャ&カリー化
https://winscript.jp/powershell/204
ScriptBlock.GetNewClosure Method
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.getnewclosure
動的スコープが嫌ならGetNewClosure()を呼べ
[PSv2]PowerShellでクロージャ&カリー化
https://winscript.jp/powershell/204
ScriptBlock.GetNewClosure Method
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.getnewclosure
477デフォルトの名無しさん
2022/07/15(金) 16:26:41.50ID:mFZqR7Di せめて問題を理解してからレスしろよ
この動的スコープとは何ですか?
ほとんどのプログラムは、理解しやすいため、レキシカルとも呼ばれる静的スコープを使用します。ソースコードを見ると、範囲内にあるものがわかります。Pythonの例では、スコープ内のxの唯一の値はxのグローバル値です。
対照的に、PowerShellは動的スコープを使用します。このモデルでは、スコープスタックに基づいて実行時に変数を検索します。関数を呼び出すたびに、新しいスコープを作成し、すべての値を親スコープからそのスコープにコピーします。PowerShellの例では、printXがsetAndprintXから呼び出されると、setAndprintXスコープで設定された$xの値を取得します。
なぜ動的スコープが必要なのですか?
字句スコープよりも動的スコープを選択する理由について、適切な説明を思い付くことができません。
「健康は病人だけが見ることができる王冠です」
この動的スコープとは何ですか?
ほとんどのプログラムは、理解しやすいため、レキシカルとも呼ばれる静的スコープを使用します。ソースコードを見ると、範囲内にあるものがわかります。Pythonの例では、スコープ内のxの唯一の値はxのグローバル値です。
対照的に、PowerShellは動的スコープを使用します。このモデルでは、スコープスタックに基づいて実行時に変数を検索します。関数を呼び出すたびに、新しいスコープを作成し、すべての値を親スコープからそのスコープにコピーします。PowerShellの例では、printXがsetAndprintXから呼び出されると、setAndprintXスコープで設定された$xの値を取得します。
なぜ動的スコープが必要なのですか?
字句スコープよりも動的スコープを選択する理由について、適切な説明を思い付くことができません。
「健康は病人だけが見ることができる王冠です」
478デフォルトの名無しさん
2022/07/15(金) 17:59:02.69ID:jPbc5odD function foo() {
$global:array += "h" Write-Host $array
}
& { $global:array +="s" Write-Host $array }
ってやるだけじゃねーの?
そもそもグローバル変数自体はそれ程使わん、ましてや関数やスクリプトブロックで更新なんてほぼやらん
$global:array += "h" Write-Host $array
}
& { $global:array +="s" Write-Host $array }
ってやるだけじゃねーの?
そもそもグローバル変数自体はそれ程使わん、ましてや関数やスクリプトブロックで更新なんてほぼやらん
479デフォルトの名無しさん
2022/07/15(金) 21:33:28.03ID:Keau4pUF >>477
PowerShell in ActionによるとダイナミックスコープはUNIXシェルを参考にしたらしい
PowerShell in ActionによるとダイナミックスコープはUNIXシェルを参考にしたらしい
480デフォルトの名無しさん
2022/07/15(金) 23:56:32.68ID:avBUMPl6 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
$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
481デフォルトの名無しさん
2022/07/16(土) 13:19:21.19ID:3YCfDQK3482デフォルトの名無しさん
2022/07/16(土) 14:25:05.61ID:QBrOblFw483デフォルトの名無しさん
2022/07/16(土) 14:36:33.24ID:3YCfDQK3 >>482
えーつまり$array += "h"は文字列への追加じゃなくて
やってることは$array = $array + "h"相当で新規に文字列のインスタンスとローカル変数が作成されるってことなの?
$arrayに対してのAdd相当は$global:的な装飾子以外にないの?
えーつまり$array += "h"は文字列への追加じゃなくて
やってることは$array = $array + "h"相当で新規に文字列のインスタンスとローカル変数が作成されるってことなの?
$arrayに対してのAdd相当は$global:的な装飾子以外にないの?
484デフォルトの名無しさん
2022/07/16(土) 15:02:15.96ID:m/XBj/Ao メインclerだけど、動的静的スコープの使い分けがclの武器と刷り込まれてた
評判悪いのか…
呼び出し側から振り分けられるのは便利では?出力先とか
評判悪いのか…
呼び出し側から振り分けられるのは便利では?出力先とか
485デフォルトの名無しさん
2022/07/16(土) 15:49:49.15ID:OVIs5jsH lispのようにメモリ上フラットにオブジェクトが住む思想(~pwshのfunction:プロバイダ)だと、動的スコープになるのが自然では
レキシカルな文脈が無いのだから
レキシカルな文脈が無いのだから
486デフォルトの名無しさん
2022/07/16(土) 15:54:08.82ID:yus9SEVI Powershellの配列は固定長だよ
追加はできない
+=演算子はその見た目のイメージ通り、新しい配列による再代入を伴う
これはスコープとは関係ない問題
追加はできない
+=演算子はその見た目のイメージ通り、新しい配列による再代入を伴う
これはスコープとは関係ない問題
487デフォルトの名無しさん
2022/07/16(土) 15:57:07.03ID:m/XBj/Ao ミュータブルかイミュータブルか、あと参照の話がごっちゃになってるよね
GetNewClosureはclのfunctionフォームと等価だね
GetNewClosureはclのfunctionフォームと等価だね
488デフォルトの名無しさん
2022/07/16(土) 16:10:18.66ID:XIhDxiQx >>479
unixシェルもpwshもclもそうだけど、関数定義をズラズラっとダンプできて、それをちゃんと読み戻せる言語は原理的にレキシカルスコープでは有り得ない
(暗黙のうちにletやクロージャ生成を行う)ブロックぽい構文でレキシカルスコープを模倣することは可能だけど
unixシェルもpwshもclもそうだけど、関数定義をズラズラっとダンプできて、それをちゃんと読み戻せる言語は原理的にレキシカルスコープでは有り得ない
(暗黙のうちにletやクロージャ生成を行う)ブロックぽい構文でレキシカルスコープを模倣することは可能だけど
489デフォルトの名無しさん
2022/07/16(土) 17:23:13.80ID:3YCfDQK3 LISP族はletか何かで変数に対しての宣言を必ずするからダイナミックでも違和感ないでしょ
Powershellの違和感は暗黙的に変数の意味が代わるところじゃないかな
Powershellの違和感は暗黙的に変数の意味が代わるところじゃないかな
490デフォルトの名無しさん
2022/07/17(日) 18:41:53.37ID:zSvUsLU3 コード適当に書いていってある程度の規模になった頃にそろそそ関数化でもすっか!
ってなった時に下手にグローバル変数更新してたりすると即はまるなコレ
しかも一見何が悪いのかさっぱり判らないという
Powershellコーティング十か条でも壁に貼っとかないとな
ってなった時に下手にグローバル変数更新してたりすると即はまるなコレ
しかも一見何が悪いのかさっぱり判らないという
Powershellコーティング十か条でも壁に貼っとかないとな
491デフォルトの名無しさん
2022/07/17(日) 21:43:25.29ID:dCc2dzlx 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
https://docs.microsoft.com/ja-jp/previous-versions/dd315289(v=technet.10)
PowerShell のスコープ完全に理解した
https://tech.blog.aerie.jp/entry/powershell-advent-calendar-2018-18
492デフォルトの名無しさん
2022/07/17(日) 22:10:40.71ID:CGK3IbQv いや下手にグローバル変数更新はできんだろ、参照だけ
493デフォルトの名無しさん
2022/07/17(日) 22:11:26.62ID:LMlAcWpL494デフォルトの名無しさん
2022/07/17(日) 23:45:40.91ID:zSvUsLU3 >>491
MSの自動翻訳は的が外れてて知りたいことは何も書かれてない…
個人のurlの人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質
結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った
値渡しだけで済む書き方ができればなお良い
MSの自動翻訳は的が外れてて知りたいことは何も書かれてない…
個人のurlの人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質
結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った
値渡しだけで済む書き方ができればなお良い
495デフォルトの名無しさん
2022/07/18(月) 00:19:34.95ID:+HoBYfWN 結論出てよかったね
496デフォルトの名無しさん
2022/07/18(月) 21:25:16.34ID:0lMMqLG2 スコープの話をしたいわけじゃなかったのなら最初からそう言ってほしかった
497デフォルトの名無しさん
2022/07/18(月) 21:46:18.36ID:RQQtBm3R 文句付けたいけど根拠となる知識は無いから
498デフォルトの名無しさん
2022/07/20(水) 22:59:35.63ID:DVSzMIGJ Pesterって使ってる?
使ってないとしたらUTどうしてる?
証跡としてコードカバレッジ出す目的に今も使ってるけどPowerShellの言語としてとか実行ホスト(exe)の機能ではなく
式単位にブレークポイント仕掛けて実現してるんだかで処理速度も普段よりかなり遅いし、あんまり便利って気がしない。
(うろ覚え)記述によってはうまくコードカバレッジに反映されない事もあった気がする。
そんとき忙しくて詳しく調査してらんなくてコードの方変えた気がする。
確かif文の条件内で変数に代入したりしてる場合だったかな。
while($null -ne ($line = $stream.ReadLine())){}みたいなのだったかな。
使ってないとしたらUTどうしてる?
証跡としてコードカバレッジ出す目的に今も使ってるけどPowerShellの言語としてとか実行ホスト(exe)の機能ではなく
式単位にブレークポイント仕掛けて実現してるんだかで処理速度も普段よりかなり遅いし、あんまり便利って気がしない。
(うろ覚え)記述によってはうまくコードカバレッジに反映されない事もあった気がする。
そんとき忙しくて詳しく調査してらんなくてコードの方変えた気がする。
確かif文の条件内で変数に代入したりしてる場合だったかな。
while($null -ne ($line = $stream.ReadLine())){}みたいなのだったかな。
499デフォルトの名無しさん
2022/07/20(水) 23:06:57.28ID:ZWOh364P PowerShellなんか想定した運用で動きゃいいでしょ
真面目にテスト書くようなものはC#で書きなさい
真面目にテスト書くようなものはC#で書きなさい
500デフォルトの名無しさん
2022/07/21(木) 22:42:00.80ID:o92gVnUV 以下のごく普通?の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
'{"":"あーあ" }' | 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
501デフォルトの名無しさん
2022/07/21(木) 23:21:49.49ID:hK8T/Nr3 >>500
PowerShell Core ではバグとして修正されてるらしい
https://github.com/PowerShell/PowerShell/issues/1755
PowerShell Core は使ったことないが、Windows PowerShellが認めるJSONは独特なので外部とのデータ連携に使うには向いてない印象。
PowerShellからPowerShellへの受け渡しなら苦労は少ないけど、それならJSONで入出力する必要がないことが多い。
PowerShell Core ではバグとして修正されてるらしい
https://github.com/PowerShell/PowerShell/issues/1755
PowerShell Core は使ったことないが、Windows PowerShellが認めるJSONは独特なので外部とのデータ連携に使うには向いてない印象。
PowerShellからPowerShellへの受け渡しなら苦労は少ないけど、それならJSONで入出力する必要がないことが多い。
502デフォルトの名無しさん
2022/07/22(金) 00:05:10.76ID:DccLQn0d 名前なしの値ってjson採用してるアプリで普通に使われるんだよね
困ったわい
困ったわい
503デフォルトの名無しさん
2022/07/22(金) 01:13:11.32ID:bxySyujx JavaScriptってプロパティ名で空文字列が使えるもんなあ
JavaScriptの仕様がファンキーすぎる気がしないでもない
JavaScriptの仕様がファンキーすぎる気がしないでもない
504デフォルトの名無しさん
2022/07/27(水) 19:10:35.01ID:LaxYcXsV ハッシュテーブルの実装的には問題ないんだろうか?
どれとは言わんがある言語のハッシュテーブル実装用のハッシュ関数(種はランダム)に空文字列""通したら恒等的に0なんだが
どれとは言わんがある言語のハッシュテーブル実装用のハッシュ関数(種はランダム)に空文字列""通したら恒等的に0なんだが
505デフォルトの名無しさん
2022/07/27(水) 19:11:49.39ID:C81kwZF2 バッチスレでPowerShell使いなよってアドバイスもらって
GetでJSON取得⇒JSON要素出力がこんなに簡単に出来るなんて感動した
curlコマンドとjqコマンド駆使してやってたのがアホみたいだった
でも構文とコマンドレット覚えるのは面倒
GetでJSON取得⇒JSON要素出力がこんなに簡単に出来るなんて感動した
curlコマンドとjqコマンド駆使してやってたのがアホみたいだった
でも構文とコマンドレット覚えるのは面倒
506デフォルトの名無しさん
2022/07/27(水) 19:50:05.55ID:ATmfTI/o 種を要求するハッシュ関数ってよくあるんか?セキュリティ対策?
ずっと同じ値が帰ってくるならハッシュテーブル的には問題ないかと
ずっと同じ値が帰ってくるならハッシュテーブル的には問題ないかと
507デフォルトの名無しさん
2022/07/27(水) 20:16:25.64ID:xJ8anoa4 >>504 がなんか勘違いしてるんだろうと思う
種なんて聞いたことないし空文字列で 0 を返すのはよくある実装だと思う
種なんて聞いたことないし空文字列で 0 を返すのはよくある実装だと思う
508デフォルトの名無しさん
2022/07/27(水) 20:35:46.87ID:8xZeKJIl >>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で扱かれてるわけで、まあ大丈夫なんでしょう
起動時環境ノイズから勝手に取ってくるのが普通かと
同じハッシュ値持つキーがあると、まあ実装によるが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で扱かれてるわけで、まあ大丈夫なんでしょう
509デフォルトの名無しさん
2022/07/27(水) 20:38:19.25ID:8xZeKJIl >>507
デバッグ用に手動で植える機能はあるはずだよ、マニュアルのどっか見たら書いてるはず、もちろん非推奨だけど
デバッグ用に手動で植える機能はあるはずだよ、マニュアルのどっか見たら書いてるはず、もちろん非推奨だけど
510デフォルトの名無しさん
2022/07/27(水) 20:49:17.30ID:8xZeKJIl 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
511デフォルトの名無しさん
2022/07/27(水) 20:49:36.14ID:8xZeKJIl 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
誰か検証たのむ
https://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
512デフォルトの名無しさん
2022/07/27(水) 20:50:04.66ID:8xZeKJIl 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
tps://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
誰か検証たのむ
tps://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
513デフォルトの名無しさん
2022/07/27(水) 20:50:41.34ID:8xZeKJIl 今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
(そのまま貼れない)
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
誰か検証たのむ
perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
(そのまま貼れない)
既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
514デフォルトの名無しさん
2022/07/27(水) 20:51:20.66ID:8xZeKJIl 連投ごめん
515デフォルトの名無しさん
2022/07/27(水) 21:27:35.49ID:xJ8anoa4 とりあえずマニュアルをちゃんと読むことをお勧めしておく
https://docs.python.org/ja/3/library/functions.html?highlight=hash#hash
https://docs.python.org/ja/3/library/functions.html?highlight=hash#hash
516デフォルトの名無しさん
2022/07/27(水) 21:29:23.20ID:rYm6iVSU で、件のjsの仕様だが、空文字でもよしなにハッシュしてくれるってことかいな?多分
空文字をキーとして使う事に関しては、言語固有のデータ型の概念も絡む
パスカル文字列でもc文字列でも、空文字列自体はいかなるバイト表現も持ち得ない
値がなけりゃ関数にも渡せない
文字数や終端の0埋めバイトごと渡せば値になるが、そこは思想の問題だろうね
空文字をキーとして使う事に関しては、言語固有のデータ型の概念も絡む
パスカル文字列でもc文字列でも、空文字列自体はいかなるバイト表現も持ち得ない
値がなけりゃ関数にも渡せない
文字数や終端の0埋めバイトごと渡せば値になるが、そこは思想の問題だろうね
517デフォルトの名無しさん
2022/07/27(水) 21:36:12.72ID:8xZeKJIl >>515
そこは言語リファレンスであって、リファレンス実装の(c)pythonとは(建前上)関係がない
インタプリタについてはこっち、hash関数のランダム化とどうしても植えたい人用
https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
そこは言語リファレンスであって、リファレンス実装の(c)pythonとは(建前上)関係がない
インタプリタについてはこっち、hash関数のランダム化とどうしても植えたい人用
https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
518デフォルトの名無しさん
2022/07/27(水) 22:08:43.58ID:xJ8anoa4 ああすまん、最近の実装まで追いかけきれてなかったな
なるほど一つ賢くなったわ、ありがとう
なるほど一つ賢くなったわ、ありがとう
519デフォルトの名無しさん
2022/07/27(水) 22:10:01.71ID:ZpfKnwiP 実装のドキュメントもランダム化の有無に関わらず空文字列に0を返す事については触れてないな
まあ実装の詳細も詳細だし、保証する意味も無いから、気になるならソース読むしかない
気になるなら、この実装に問題無いんですか、と元気があるなら問い合わせる案件
まあ実装の詳細も詳細だし、保証する意味も無いから、気になるならソース読むしかない
気になるなら、この実装に問題無いんですか、と元気があるなら問い合わせる案件
520デフォルトの名無しさん
2022/07/27(水) 22:30:36.76ID:Sct47BON とりあえずPythonでhash("")==0なことはundocumentedなので依存するコードは書いちゃダメってことかな
偶々タイプが面倒だったのか、それでもよく見つけたな
一点だけ分かって現実に問題になるかはともかく、理想的なハッシュ関数の振る舞い(=完全にランダムに見える)として好ましくないのは確か
pwshのこういう面白ネタないかな、まあまだまだ開発中なので山ほどありそうなのがアレだけど
偶々タイプが面倒だったのか、それでもよく見つけたな
一点だけ分かって現実に問題になるかはともかく、理想的なハッシュ関数の振る舞い(=完全にランダムに見える)として好ましくないのは確か
pwshのこういう面白ネタないかな、まあまだまだ開発中なので山ほどありそうなのがアレだけど
521デフォルトの名無しさん
2022/07/27(水) 22:32:46.88ID:8xZeKJIl undocumentedはMSのお家芸です
522デフォルトの名無しさん
2022/07/27(水) 22:49:04.75ID:FyEJHrzo 面白そうなのでハッシュ衝突させてみた
d=dict()
d[0]="int 0"
d[""]="nullstr"
print(hash(0), hash(""), d)
0 0 {0: 'int 0', '': 'nullstr'}
たった2個ぶつけて死ぬ事はまあ無いが、いくらか試して中身は予想付いてきた
スレチごめん
d=dict()
d[0]="int 0"
d[""]="nullstr"
print(hash(0), hash(""), d)
0 0 {0: 'int 0', '': 'nullstr'}
たった2個ぶつけて死ぬ事はまあ無いが、いくらか試して中身は予想付いてきた
スレチごめん
523デフォルトの名無しさん
2022/07/27(水) 23:59:51.61ID:su1evgJ+ 面白そうなので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
なんだかなー
$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
なんだかなー
524デフォルトの名無しさん
2022/07/28(木) 00:20:32.59ID:y/Pgitn8 複数のNaNをキーにしたハッシュリテラル書くとInvalidOperation例外投げるな、Duplicate Keys 'NaN' are not allowed...らしい
アサインすると値が上書き
見方によってはハッシュテーブルというアルゴリズムの敗北と言えるかもしれん
困る機会も思いつかないのが幸い
アサインすると値が上書き
見方によってはハッシュテーブルというアルゴリズムの敗北と言えるかもしれん
困る機会も思いつかないのが幸い
525デフォルトの名無しさん
2022/07/28(木) 00:31:26.53ID:8WeqhqUG どのNaNとNaNも互いに値が等しくないからといって、キーがNaNまみれのハッシュ$nansが作れたとして
じゃあ$nans[NaN]はどの値を返せば正解なんだよ
じゃあ$nans[NaN]はどの値を返せば正解なんだよ
526デフォルトの名無しさん
2022/07/28(木) 00:51:33.48ID:y/Pgitn8 抽象データ構造としての連想配列なら、NaNがインデックスとして渡されたら探索すらせずに常に$nullを返せばいい
NaNと-eqなキーは$nansがNaNまみれであるかに関わらず存在し得ないんだから
ハッシュテーブルはあくまで"ほぼ-eq"を使った連想配列の実装
$nan=[double]::NaN;
$ht=@{$nan="abc"}; $h[$nan]
は"abc" を返すはず
NaNと-eqなキーは$nansがNaNまみれであるかに関わらず存在し得ないんだから
ハッシュテーブルはあくまで"ほぼ-eq"を使った連想配列の実装
$nan=[double]::NaN;
$ht=@{$nan="abc"}; $h[$nan]
は"abc" を返すはず
527デフォルトの名無しさん
2022/07/28(木) 01:22:01.83ID:AWyQ+yiB そもそもnanは論理学と数学基礎論の公理、同一律を否定しているので、論理的思考を行っている限り無矛盾に理解することは原理的に不可能だぞ
考えるな、感じろ
考えるな、感じろ
528デフォルトの名無しさん
2022/07/28(木) 13:14:46.86ID:y/Pgitn8 >>505
jqはフィルターとして便利なだけじゃなく、プログラミング言語として非常に面白いと思ってるので、学ぶ価値ありだと思うよ
移行前はcmd+vimで何でもやってたな
vimは安定してwinサポートしてたし、ユニコ以前から常に日本語パッチ供給されてて、強力なテキスト処理とある程度の構造化データ処理もできる入手性よいツールとして稀有だったはず
引数に直接スクリプト渡して非インタラクティブにバッチ処理できるからbatの中身はほぼvim/exスクリプトだった
多分2000年あたりでvim並みの機能かつ日本語サポートもしっかりしてるのはperlくらい
jqはフィルターとして便利なだけじゃなく、プログラミング言語として非常に面白いと思ってるので、学ぶ価値ありだと思うよ
移行前はcmd+vimで何でもやってたな
vimは安定してwinサポートしてたし、ユニコ以前から常に日本語パッチ供給されてて、強力なテキスト処理とある程度の構造化データ処理もできる入手性よいツールとして稀有だったはず
引数に直接スクリプト渡して非インタラクティブにバッチ処理できるからbatの中身はほぼvim/exスクリプトだった
多分2000年あたりでvim並みの機能かつ日本語サポートもしっかりしてるのはperlくらい
529デフォルトの名無しさん
2022/07/28(木) 14:57:01.82ID:HSo5zcUE コードエディタとしては愛用してるけど、vimをコマンドとして使う発想に時代を感じる
530デフォルトの名無しさん
2022/07/28(木) 15:19:13.17ID:HSo5zcUE こんな感じかね
vim -es "g/\W?\|\Wwhere/ s//Where-Object/p" -c wq $profile
こわいから-c wqはしないけど
findstrでパターンマッチ、for /f ... in (file.txt)で行毎にスキャンして置換したのをechoとかやってたな
vim -es "g/\W?\|\Wwhere/ s//Where-Object/p" -c wq $profile
こわいから-c wqはしないけど
findstrでパターンマッチ、for /f ... in (file.txt)で行毎にスキャンして置換したのをechoとかやってたな
531デフォルトの名無しさん
2022/07/28(木) 15:43:37.36ID:y/Pgitn8 for /f "tokens=...delims=...skip=...eol=..."はプレーンな行毎のテーブルの処理には悪くない、明示的にフォーマットを指定してパースするので、むしろ分かりやすいまである
クオートやエスケープの解釈、ダメ文字などイレギュラーに全く対応出来なかったり、/フラグ毎にforの挙動が別コマンドと言えるほど違ったりで、融通が全く効かないのがアレというだけ
for /fで扱いやすいフォーマットで書いて読む閉じた世界に住んでるなら幸せ
クオートやエスケープの解釈、ダメ文字などイレギュラーに全く対応出来なかったり、/フラグ毎にforの挙動が別コマンドと言えるほど違ったりで、融通が全く効かないのがアレというだけ
for /fで扱いやすいフォーマットで書いて読む閉じた世界に住んでるなら幸せ
532デフォルトの名無しさん
2022/07/28(木) 16:33:20.60ID:y/Pgitn8 >>530
あーよく見たら$proflleか
フリーフォーマットをfor /fで走査は黒魔術になるな、行をどう分割するにしろ、変数展開時の文字列置換は分割単位毎だし、行内複数マッチの場合どうするのか考えるだけでぞっとする
vimに引数でコマンド渡すにはたとえ単一引数でも-cが必要、兄弟のsedやvi(m)のエイリアスexは専ら引数にコマンドを期待するので-e落として紛れはないけど、vi(m)はその名の通りvisualエディタだからはじめの引数にファイルを期待する
あーよく見たら$proflleか
フリーフォーマットをfor /fで走査は黒魔術になるな、行をどう分割するにしろ、変数展開時の文字列置換は分割単位毎だし、行内複数マッチの場合どうするのか考えるだけでぞっとする
vimに引数でコマンド渡すにはたとえ単一引数でも-cが必要、兄弟のsedやvi(m)のエイリアスexは専ら引数にコマンドを期待するので-e落として紛れはないけど、vi(m)はその名の通りvisualエディタだからはじめの引数にファイルを期待する
533デフォルトの名無しさん
2022/07/29(金) 21:36:58.16ID:HWojhWX3 最近仕事で触ることになって使い方習ったけど全然わからん
534デフォルトの名無しさん
2022/07/29(金) 21:41:36.22ID:wZddRh7F 右も左も分からないなら、とりあえず良く使いそうなコマンドレットはエイリアスが事前に定義されてるので、galで出てくるのを順番に弄り回したりghするといいかも
535デフォルトの名無しさん
2022/07/29(金) 23:32:09.97ID:HWojhWX3 基本文法を覚える前にVB.NETでモジュールメソッド作成して呼び出すやり方覚えたら動けばいいやでそっちばかり使ってしまってなかなか覚えられない
536デフォルトの名無しさん
2022/09/13(火) 01:54:14.48ID:G28B9gdh $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上でも効果があるのかは試してみないと分かりません
こちらの解決法が分かる方が居ましたら是非教えて欲しいです
変更は
$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上でも効果があるのかは試してみないと分かりません
こちらの解決法が分かる方が居ましたら是非教えて欲しいです
537デフォルトの名無しさん
2022/09/13(火) 10:05:14.78ID:3Aj3EGjO プロファイルに記述、じゃだめ?
PS> notepad $PROFILE.CurrentUserAllHosts
PS> notepad $PROFILE.CurrentUserAllHosts
538デフォルトの名無しさん
2022/09/13(火) 17:28:13.33ID:BFM47HY2 >>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に置き換えられ便利になると思ったのですが残念です
ありがとうございます
$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に置き換えられ便利になると思ったのですが残念です
539デフォルトの名無しさん
2022/09/13(火) 18:34:17.55ID:3Aj3EGjO 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()
}
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()
}
540デフォルトの名無しさん
2022/09/13(火) 18:36:39.73ID:3Aj3EGjO 誤:$proc = [Process]::Start($si)
正:$proc = [Diagnostics.Process]::Start($si)
動作確認してないので他にもあるかも。
正:$proc = [Diagnostics.Process]::Start($si)
動作確認してないので他にもあるかも。
541デフォルトの名無しさん
2022/09/21(水) 00:41:00.54ID:MPN5wMTP 同階層にフォルダツリーA~Zまであり、それぞれのツリーの中身はバラバラです。
それぞれのツリーのCSVを出力したいのですが、やり方がイマイチ分かりません。
CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したいです。
PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが、各ツリー内の更新日を取得する部分とフォルダサイズを取得する部分を同時に行う事が私の頭では無理でした。何方かお助け頂けないでしょうか
それぞれのツリーのCSVを出力したいのですが、やり方がイマイチ分かりません。
CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したいです。
PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが、各ツリー内の更新日を取得する部分とフォルダサイズを取得する部分を同時に行う事が私の頭では無理でした。何方かお助け頂けないでしょうか
542デフォルトの名無しさん
2022/09/21(水) 17:45:18.14ID:xipfHTvE ツリーて何だ?
フォルダに階層があってその中全部見たいということならGet-ChildItem -Recurseだぞ
フォルダに階層があってその中全部見たいということならGet-ChildItem -Recurseだぞ
543デフォルトの名無しさん
2022/09/21(水) 17:57:09.50ID:Wu29T3MH ・コード貼ってバカにされるの嫌
・具体例挙げるなど仕様詳細説明面倒臭いから文章から汲み取れ
・全部やれ
こういうことだろう
舐め腐ってるヤツはスルーしときなよ
・具体例挙げるなど仕様詳細説明面倒臭いから文章から汲み取れ
・全部やれ
こういうことだろう
舐め腐ってるヤツはスルーしときなよ
544デフォルトの名無しさん
2022/09/21(水) 18:12:43.86ID:6s8rSvAF 本人はいたって真面目なパターンだろ
ググった情報を組み合わせるスキルがないということは、悲しいかな往々にして他人に要件を一発で伝えるスキルも不足しがち
同時にやるのが無理めに感じるのはパイプを使おうとしてるからだろう
for文とローカル変数で書き変えれば簡単
ググった情報を組み合わせるスキルがないということは、悲しいかな往々にして他人に要件を一発で伝えるスキルも不足しがち
同時にやるのが無理めに感じるのはパイプを使おうとしてるからだろう
for文とローカル変数で書き変えれば簡単
545デフォルトの名無しさん
2022/09/21(水) 18:29:01.13ID:757dNGj4 伝えるスキルうんぬんの前に
> PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが
って言うならそのコード上げろって話
ヘタに説明するより100倍早い
> PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが
って言うならそのコード上げろって話
ヘタに説明するより100倍早い
546デフォルトの名無しさん
2022/09/21(水) 18:53:18.61ID:VZ2CqY7n いやできなかったコード上げても何の説明にもならんから
現状と得たい結果の図示だな
現状と得たい結果の図示だな
547デフォルトの名無しさん
2022/09/21(水) 19:02:42.62ID:6s8rSvAF コードを上げたほうがいいんじゃないかとか図で伝えるべきなんじゃないかとかそういうの引っくるめての伝えるスキルだよ
コミュニケーションは言葉に限定されない
コミュニケーションは言葉に限定されない
548デフォルトの名無しさん
2022/09/21(水) 20:42:50.25ID:9IkSSHYa >CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したい
変なモジュール入れんでも数行で書けるからがんばれ
変なモジュール入れんでも数行で書けるからがんばれ
549デフォルトの名無しさん
2022/09/21(水) 22:28:24.59ID:RTQsXz5w パワー!
550デフォルトの名無しさん
2022/09/21(水) 22:31:28.97ID:RTQsXz5w しっかしコマンドレットがコマンドライン実行時とスクリプト内呼び出しでパラメータ解釈が異なるって
どんなキチガイが仕様考えたのか気になるわw
switch型パラメータをスクリプト内で動的に外したり与える方法がないとか終わってる
どんなキチガイが仕様考えたのか気になるわw
switch型パラメータをスクリプト内で動的に外したり与える方法がないとか終わってる
551デフォルトの名無しさん
2022/09/21(水) 23:16:07.40ID:9fmju/sW552デフォルトの名無しさん
2022/09/22(木) 00:48:03.74ID:XoRPEjFK 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
フォルダ以下のサイズ(再帰的な子孫も含めて)は、
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
553552
2022/09/22(木) 01:41:34.82ID:XoRPEjFK 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
更新時刻が最も最近のものを求めた
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
554552
2022/09/22(木) 05:06:16.90ID:XoRPEjFK 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
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
555デフォルトの名無しさん
2022/09/22(木) 09:18:39.47ID:5Z2vYjCC >>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
@(
"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
556デフォルトの名無しさん
2022/09/23(金) 00:05:04.72ID:r49iT1KO >>555
おおー無駄がなくてすごい
これぐらい書けるようになりてぇ
開始は配列の変わりにコマンドレットでも良さそう
Get-ChildItem -LiteralPath <親フォルダ> -Directory | ...
おおー無駄がなくてすごい
これぐらい書けるようになりてぇ
開始は配列の変わりにコマンドレットでも良さそう
Get-ChildItem -LiteralPath <親フォルダ> -Directory | ...
557デフォルトの名無しさん
2022/09/25(日) 13:45:46.35ID:5ly2Ski6 >>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
確かに。てか半端に汎用性意識せず、素直にこんなんでも良かったな。
@(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
558デフォルトの名無しさん
2022/09/25(日) 14:01:26.72ID:5ly2Ski6 いや、こうか。
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
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
559デフォルトの名無しさん
2022/09/25(日) 14:13:19.66ID:76wlmrvm 試してないけどフォルダにファイルが1個も無い場合を考慮できてない気がする
560デフォルトの名無しさん
2022/09/25(日) 14:48:45.69ID:5ly2Ski6 知らんかった。前者つもりだった。
(@() | measure -Sum).Sum → 0
(@() | measure Length -Sum).Sum → Null
(@() | measure -Sum).Sum → 0
(@() | measure Length -Sum).Sum → Null
561デフォルトの名無しさん
2022/09/25(日) 15:45:18.22ID:76wlmrvm powershellはgciはともかくmeasureが遅くてファイルが多くなると辛くなるね
結局C#に丸投げとかの手段になりそう
結局C#に丸投げとかの手段になりそう
562デフォルトの名無しさん
2022/09/25(日) 16:18:35.15ID:PDKGWlWe 試してないけど
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
ってやると多少効率的かと
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
ってやると多少効率的かと
563デフォルトの名無しさん
2022/09/25(日) 17:09:36.54ID:UvTk6pcp >>561
まあC#でやった方が速いわな
まあC#でやった方が速いわな
564デフォルトの名無しさん
2022/09/25(日) 19:58:47.42ID:5ly2Ski6 >>562
なるほどな〜、余分な集計をする事になるとしても
measureを1回で済ませられれば効率的な可能性があるのか、
さらにパイプラインで列挙と集計が同時進行になる可能性もあったり?
と思い試してみたけど、残念ながらLastWriteTimeの-Sumがダメらしい。
-ea:SilentlyContinueなら?と思ったがLengthのMaximumしか出ない。
でもこのアイデアは使えそう。
なるほどな〜、余分な集計をする事になるとしても
measureを1回で済ませられれば効率的な可能性があるのか、
さらにパイプラインで列挙と集計が同時進行になる可能性もあったり?
と思い試してみたけど、残念ながらLastWriteTimeの-Sumがダメらしい。
-ea:SilentlyContinueなら?と思ったがLengthのMaximumしか出ない。
でもこのアイデアは使えそう。
565デフォルトの名無しさん
2022/09/25(日) 20:11:16.46ID:PDKGWlWe >>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
ああなるほど、だから小細工してたのか、すまんかった
てか、初めから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
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★11 [ぐれ★]
- 日本損失1.7兆円に修正 中国渡航自粛の影響試算 [蚤の市★]
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★3 [蚤の市★]
- 「どうしようもない」 ため息つくアジアの玄関口 中国の訪日自粛で−福岡市 [蚤の市★]
- 「アベノミクス」で投資対象と化したマンション ローンの低金利続き「年収の12倍」借りる20代出現 [蚤の市★]
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【実況】博衣こよりのえちえち朝こよ🧪 ★2
- 【!?】高市早苗「靖国神社電撃参拝プラン」浮上!これもう戦争だろ… [481941988]
- 【実況】博衣こよりのえちえち朝こよ🧪
- カカロット、腰痛い
- 【超悲報】中国への武力行使、世論調査で「賛成」「どちらかといえば賛成」48.8% 「反対」「どちらかといえば反対」の44.2%を上回る [314039747]
- 中国「高市が頭を下げて謝罪しない限り、絶対に許さない」 [329329848]
