1 名前:デフォルトの名無しさん mailto:sage [2020/01/01(水) 16:08:31.66 ID:4oQ1Kxot.net] 前スレ PowerShell -Part 3 https://mevius.5ch.net/test/read.cgi/tech/1539074808/ 次スレは>>980 が立ててね!!
604 名前:デフォルトの名無しさん mailto:sage [2020/09/27(日) 21:02:03.10 ID:qVXRXcgH.net] 昔からpsのアクセス権周辺の実装は怪しいと思ってる 専用コマンド呼ぶなり.NET呼ぶなりした方がいいよ
605 名前:デフォルトの名無しさん mailto:sage [2020/09/27(日) 22:00:17.33 ID:zpUujZFe.net] なぜうち(Win10 1909 18363.1082)では起動フォルダーで挙動が変わるんだろう C:\Users\ユーザー で起動した PowerShell 7.0.3 だと、どこで New-Item しても発生する その PowerShell で、さらに PowerShell を起動すると C:\Users\ユーザー で起動した場合は、どこで New-Item しても発生する 別のフォルダーで起動した場合は、どこで New-Item しても問題ない こうなる理由が予想もできない
606 名前:デフォルトの名無しさん mailto:sage [2020/09/27(日) 23:03:00.71 ID:zpUujZFe.net] あーごめん 管理者でも C:\Users\ユーザー で起動したら発生した 管理者になるかどうかは関係なかった 理由はさっぱりだが……
607 名前:デフォルトの名無しさん mailto:sage [2020/09/28(月) 10:27:40.26 ID:6RK1A/yN.net] >>601 >>604 もしかすると、 1. ターゲットをフルパスで指定する 2. ターゲットの相対パスを「.\\」か「./」で始まる形式で指定する 3. New-Item の直前に [Environment]::CurrentDirectory = Get-Location を実行する のどれかを試すと、PowerShell 7 でも問題は起こらなかったり?
608 名前:デフォルトの名無しさん mailto:sage [2020/09/28(月) 20:33:13.25 ID:1OU6a08X.net] 試した 1 〇 (でも張りたいのは相対パスのリンク) 2 × 3 〇 [Environment]::CurrentDirectory を基準
609 名前:ノターゲットのフルパスを求めて フォルダーだったら SYMLINKD 、それ以外は SYMLINK を作ってるっぽい # >>603 を書く時 C:\Users\ユーザー では試してなかった……。 カレントディレクトリを移動しても [Environment]::CurrentDirectory は変わらない となると悪いのは カレントディレクトリを返さない [Environment]::CurrentDirectory ? それとも [Environment]::CurrentDirectory を参照する New-Item ? [] [ここ壊れてます]
610 名前:デフォルトの名無しさん mailto:sage [2020/09/29(火) 11:44:19.44 ID:xkYzZNyK.net] >>606 ごめん。ソースの履歴を見たら、v7.0.3 のときは、2. の方法は無意味だったみたい。 v7.0.3 の実装は、>>606 さんの想像のとおり。 そもそも、ターゲットの相対パスを解決するときの基準は、カレントのパスではなくて、 シンボリックリンクそのもののパスだよね。 なので、プロセスのカレントディレクトリ([Environment]::CurrentDirectory)の代わりに、 PowerShell のカレントロケーション($PWD)を基準にしたとしても、やっぱりバグる。 New-Item -Type Symbolic -Name Foo\Bar -Target .\Zot みたいなケースとか。 でね。最新のソースには、相対パスのターゲットのための修正が施されているのだけれど、 これが、「.\」か「./」で始まるパスのときは、基準にカレントロケーションを使う、 という中途半端かつ誤ったもので...。
611 名前:デフォルトの名無しさん mailto:sage [2020/09/29(火) 20:49:56.27 ID:J7wCjMtV.net] 常に リンクのフルパス → ターゲットのフルパス とたどるだけなのに……w 早く修正されますように
612 名前:デフォルトの名無しさん mailto:sage [2020/09/30(水) 08:50:32.18 ID:6kAerFE6.net] [Environment]::CurrentDirectoryや[IO.Directory]::GetCurrentDirectory()の罠 他のモジュールも同じ問題を抱えてないか心配になる
613 名前:デフォルトの名無しさん mailto:sage [2020/10/01(木) 10:19:36.95 ID:tnCBqate.net] New-Itemはハードリンクもバグってる こっちはWindows以外のOSでも問題になるはず New-Item -Type Directory -Name linktest New-Item -Name linktest\target New-Item -type HardLink -Name linktest\hardlink -Target linktest\target に対して、こんなメッセージでエラーになってしまう New-Item: Could not find item linktest\target. 興味深いのは New-Item -Type HardLink -Name linktest\hardlink -Target target と間違えてみると New-Item: Cannot find path 'カレントディレクトリ\target' because it does not exist. ちゃんと正しいエラーメッセージが返る 不思議だ
614 名前:デフォルトの名無しさん mailto:sage [2020/10/01(木) 21:05:38.94 ID:NSqrZd61.net] >>610 >New-Item -type HardLink -Name linktest\hardlink -Target linktest\target 5.1と7.0.3で試したけどエラーにならなかったぞ
615 名前:デフォルトの名無しさん mailto:sage [2020/10/01(木) 21:26:37.01 ID:tnCBqate.net] これでどう? (長すぎて切れるかも) $origCurDir = [System.Environment]::CurrentDirectory New-Item -ItemType Directory -Path linktest Push-Location linktest New-Item -ItemType Directory -Path dir Push-Location dir # linktest/dir New-Item -ItemType Directory -Path subdir Set-Content -Path file -Value "hello" New-Item -ItemType HardLink -Path hardlink_1 -Value file New-Item -ItemType SymbolicLink -Path symlink_1 -Value subdir Pop-Location # linktest New-Item -ItemType HardLink -Path dir/hardlink_2 -Value dir/file New-Item -ItemType SymbolicLink -Path dir/symlink_2 -Value subdir Push-Location dir # linktest/dir [System.Environment]::CurrentDirectory = $PWD New-Item -ItemType HardLink -Path hardlink_3 -Value file New-Item -ItemType SymbolicLink -Path symlink_3 -Value subdir Pop-Location # linktest [System.Environment]::CurrentDirectory = $PWD New-Item -ItemType HardLink -Path dir/hardlink_4 -Value dir/file New-Item -ItemType SymbolicLink -Path dir/symlink_4 -Value subdir Pop-Location [System.Environment]::CurrentDirectory = $origCurDir Get-ChildItem -Path linktest/dir | Sort-Object -Property CreationTime | Format-Table Attributes,LinkType,Target,Length,Name
616 名前:デフォルトの名無しさん mailto:sage [2020/10/02(金) 13:25:40.85 ID:1QpEVKY8.net] mklink一行でええじゃん
617 名前:デフォルトの名無しさん mailto:sage [2020/10/02(金) 13:57:48.64 ID:w3BWfVBY.net] >>613 これを思い出した ******** アメリカのNASAは、宇宙飛行士を最初に宇宙に送り込んだとき、 無重力状態ではボールペンで文字を書くことができないのを発見した。 これではボールペンを持って行っても役に立たない! NASAの科学者たちはこの問題に立ち向かうべく、10年の歳月と120億ドルの開発費をかけて研究を重ねた。 その結果ついに、無重力でも上下逆にしても
618 名前:水の中でも氷点下でも摂氏300度でも、 どんな状況下でもどんな表面にでも書けるボールペンを開発した!! 一方、ソ連は鉛筆を使った。 [] [ここ壊れてます]
619 名前:デフォルトの名無しさん mailto:sage [2020/10/02(金) 14:35:00.30 ID:Ck+HovvX.net] リンクを張ることが目的なのではない PowerShellの不具合を見つけることが目的なのだ
620 名前:デフォルトの名無しさん mailto:sage [2020/10/02(金) 21:34:24.75 ID:ljpWPhwK.net] 誰か英語ができる人 >>612 のテストを添えて「New-Itemでのhardlink/symlink作成に [Environment]::CurrentDirectoryが影響する」ってタイトルでイシューを立てて欲しい
621 名前:デフォルトの名無しさん mailto:sage [2020/10/03(土) 01:55:55.82 ID:0vVVHGK+.net] 昔はよくConnectに投稿したりしたんだけどねぇ
622 名前:デフォルトの名無しさん mailto:sage [2020/10/03(土) 10:45:42.05 ID:68v91MPk.net] よろしくお願いします
623 名前:デフォルトの名無しさん mailto:sage [2020/10/03(土) 22:48:38.93 ID:7NrhvCrT.net] バージョン上がって使いやすくなってきたねpowershell Shellより扱いやすいからmacにもインスコしたわ コンソールに貼り付けて実行した時に右クリックの貼り付けとctlvの貼り付けで動きが違うのは何で?
624 名前:デフォルトの名無しさん mailto:sage [2020/10/04(日) 17:12:39.48 ID:Pj4o9N0c.net] 遅レスすまんね >>597 だめだった >>598 見てみる
625 名前:デフォルトの名無しさん mailto:sage [2020/10/07(水) 01:28:53.25 ID:OLUeUK9d.net] あるファイルを消そうとしたら「このファイルは開かれているため〜」と表示されて消せなかった。 こういう場合、自分はリソースモニターでファイルを開いているアプリを探すんだけど 最近入った現場では管理者以外はリソースモニターを使えないように設定されていて困った。 それで質問なのですが、powershellのコマンドでファイルを開いているアプリを探す方法はあるのでしょうか?
626 名前:デフォルトの名無しさん mailto:sage [2020/10/07(水) 02:03:23.70 ID:HMBCuleJ.net] https://stackoverflow.com/questions/39148304/fuser-equivalent-in-powershell こんなん出てきたがどう?
627 名前:621 mailto:sage [2020/10/08(木) 03:04:42.09 ID:daaVvwfY.net] >>622 めっちゃ参考になります。っていうかこれでやります。 サンクス!
628 名前:デフォルトの名無しさん mailto:sage [2020/10/08(木) 19:15:35.07 ID:zkqa7tbj.net] 試せば判るけど >>622 はプロセスがロードしてるDLLとかのモジュールしか得られないよ 開いてるファイルはプロセスに紐付いてるハンドル取得して一個一個チェックするしかないよ 実装はpowershellじゃかなり大変だからhandle.exeっていうMSが公開してるツール使ったらいいよ
629 名前:デフォルトの名無しさん mailto:sage [2020/10/14(水) 06:30:09.66 ID:JjVHZHwh.net] セキュリティガチガチでネットにも繋がらないうちの現場じゃ無理だな
630 名前:デフォルトの名無しさん mailto:sage [2020/10/14(水) 11:09:36.08 ID:s64A8YK8.net] うちの会社は「キッコーマン」のHPが見れません、”コーマン”がフィルターに引っかかるのですw
631 名前:デフォルトの名無しさん mailto:sage [2020/10/15(木) 21:32:35.73 ID:vPm9QJ4K.net] openfiles コマンドでファイルを開いているプロセスを調べる 【 Windows】 tooljp.com/windows/doc/Server2008/openfiles/openfiles.html Openfiles https://web.archive.org/web/20120424081342/technet.microsoft.com/ja-jp/library/cc772842 (v=ws.10).aspx
632 名前:デフォルトの名無しさん mailto:sage [2020/10/17(土) 17:51:59.12 ID:2b9DYeQb.net] 職場で「さすがパワーシェラー!」って言われたんだけど パワーシェルを使う人のことをそう呼ぶものなの?
633 名前:デフォルトの名無しさん mailto:sage [2020/10/17(土) 17:57:10.05 ID:Ske6VIT2.net] 聞いたことないな むしろ馬鹿にされてる気分
634 名前:デフォルトの名無しさん mailto:sage [2020/10/17(土) 23:05:50.24 ID:DNKik4OU.net] 洋書で良い本ないですか? 和書だと数冊しか出てないので…
635 名前:デフォルトの名無しさん mailto:sage [2020/10/18(日) 21:28:34.46 ID:6x+7Jy+N.net] in actionは読んだのかね あとはCoreのソース読んでくのが手っ取り早い
636 名前:デフォルトの名無しさん mailto:sage [2020/10/19(月) 22:58:13.20 ID:TaaQ8sH/.net] >>631 原書は第3版まで出てるんですね ありがとうございます
637 名前:デフォルトの名無しさん [2020/10/24(土) 21:41:19.65 ID:1s91cR1z.net] 多次元配列(ジャグ配列ではなく)を1次元配列に平坦化する高速な方法ありませんか? データ数は100万個くらいです。 @($a | % {$_}) 検索したら↑のカッコいい方法が出てきましたが、 私の環境で6秒ほどかかり速度に不満があります。
638 名前:デフォルトの名無しさん mailto:sage [2020/10/24(土) 23:22:07.28 ID:ZaC2aARH.net] パイプとForeach-Object自体が遅いからね データがオンメモリにあるならforeach文のが速い
639 名前:デフォルトの名無しさん mailto:sage [2020/10/24(土) 23:28:40.40 ID:ZaC2aARH.net] あとは万個の繰り返し処理になるわけだからpowershellで書いたら全体的には当然遅い 対策としては繰り返し部分だけC#に渡すとかだね
640 名前:デフォルトの名無しさん mailto:sage [2020/10/24(土) 23:45:12.07 ID:V4Y88WB8.net] 万個とかエッチ!
641 名前:633 [2020/10/25(日) 00:13:47.38 ID:orpbcY2p.net] foreach文にすると0.8秒まで速くなりました! とりあえずこの方法でやってみます $b = foreach($x in $a){$x}
642 名前:デフォルトの名無しさん mailto:sage [2020/10/25(日) 02:13:33.54 ID:8PerFZ8f.net] >>636 美人穴が「この商品は累計○万個も売り上げたということです!」とかいうとおっきする
643 名前:デフォルトの名無しさん mailto:sage [2020/10/25(日) 20:51:17.25 ID:Bltg1B/v.net] >>633 >多次元配列(ジャグ配列ではなく)を1次元配列に平坦化する高速な方法ありませんか? なんでジャグ配列ではなく多次元配列なんだろう
644 名前:デフォルトの名無しさん mailto:sage [2020/10/25(日) 23:05:57.46 ID:Ny8q0G3C.net] ジャグラーは定番だ
645 名前:デフォルトの名無しさん mailto:sage [2020/10/25(日) 23:57:20.55 ID:sGr6+tXm.net] 多次元配列のほうがメモリ上で綺麗に配置されている分、高速化の選択肢が多いかもしれないって発想じゃね
646 名前:633 [2020/10/26(月) 00:00:33.37 ID:R7zaLxag.net] >>639 ExcelファイルからCOM経由で範囲データを取ってくるとobject[,]になるためです
647 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 08:09:54.14 ID:mujdTIU3.net] なんでそれを1次元にするんだろう
648 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 12:01:58.05 ID:bVz9LMJg.net] >>641 実際には多次元配列の方が遅い
649 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 13:22:10.82 ID:l+r11Fp5.net] >>644 理由は?
650 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 14:41:24.14 ID:RInXL5ja.net] PowerShellというか.NETの仕様 .NETには1次元配列の要素にアクセスするための専用命令があるので速い 多次元配列の要素にアクセスするにはプロパティみたいなアクセサメソッドを使わなきゃいけないので遅い
651 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 16:19:55.73 ID:l+r11Fp5.net] >>646 多次元だと倍以上遅いと言う根拠あるの?
652 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 16:27:11.02 ID:RDi5ol2j.net] めんどくせー奴だな
653 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:00:59.84 ID:XYschmPc.net] 体感速度は変わらん
654 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:43:17.64 ID:jItJ//Mq.net] >>647 自分で試せば良いんじゃね
655 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:46:52.74 ID:l+r11Fp5.net] 要は根拠もなしに > 実際には多次元配列の方が遅い と妄想をほざいてただけって話かよw
656 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:56:32.09 ID:jItJ//Mq.net] >>651 うん、良いんじゃね、そういう結論で。 以上でよろしいか?
657 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:58:32.50 ID:j+tAxxjP.net] >>651 質問に答えず茶化すだけかよw
658 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 19:30:32.27 ID:l+r11Fp5.net] >>653 >>652 に言ってくれよw
659 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 19:43:09.27 ID:/01g7c5c.net] >>ID:l+r11Fp5 たくさん構ってもらえて良かったね
660 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:06:18.23 ID:l+r11Fp5.net] >>655 恥の上塗りかなw
661 名前:633 mailto:sage [2020/10/26(月) 20:09:14.97 ID:5qWbLIDu.net] >>643 Excelファイルから取得したデータを更に別の処理に使うのですが、その際に1次元で渡す必要があるためです
662 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:09:30.70 ID:/TCFG/M1.net] 実装としては添え字でメモリの位置を計算して参照するだけだから 一次元でも多次元でも原理的には速さは変わらないぞ
663 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:13:28.15 ID:jItJ//Mq.net] >>656 きみが絶対的に正しいことはスレ住人の総意で共通認識なのだから、もう十分だろう? そのへんで勘弁してもらないかな。なんなら土下座して謝るよ。
664 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:17:45.03 ID:mujdTIU3.net] ちゃんとアンカー追えよ ジャグ配列vs多次元配列が1次元vs多次元配列に化けてるぞ >>647 >多次元だと倍以上遅いと言う根拠あるの? 「倍以上遅い」なんてどこから来たんだろう
665 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:28:30.59 ID:l+r11Fp5.net] >>658 >>646 によると専用命令があるらしいけど、嘘なのかね? >>660 ああすまん、脳内で二次元配列 ⇔ ジャグ配列 って思ってたわ まあ3次元以上なら専用命令とやらがもっと速くないとダメだけど
666 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:36:57.75 ID:mujdTIU3.net] あんたはまず「倍以上」の出所を説明しないと
667 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 21:11:41.27 ID:EAm4Av0T.net] www5b.biglobe.ne.jp/~yone-ken/VBNET/IL/il15_UseArray.html > ILにも1次元配列については専用の命令が用意されています。
668 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 21:49:29.23 ID:AmD6br2D.net] #2次元配列初期化 Measure-Command { $i = 0; $array = New-Object "object[,]" 1000,1000 for ($x = 0; $x -lt $array.GetLength(0); $x++) { for ($y = 0; $y -lt $array.GetLength(1); $y++) { $array[$x,$y] = $i++ } } } #ジャグ配列初期化 Measure-Command { $i = 0; $array = New-Object "object[]" 1000 for ($x = 0; $x -lt $array.length; $x++) { $array[$x] = New-Object "object[]" 1000 for ($y = 0; $y -lt $array[$x].length; $y++) { $array[$x][$y] = $i++ } } } たしかに初期化の段階でジャグ配列のが速いね
669 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:09:49.38 ID:l+r11Fp5.net] >>662 ジャグ配列知らんの? 二次元相当のジャグ配列だと2回辿らないとダメだから倍は速くないとトータルで遅くなるでしょ
670 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:22:45.88 ID:5/h2v6nN.net] >>665 PSで例見せてよ
671 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:37:25.27 ID:l+r11Fp5.net] ILの話にPSとか言われてもw
672 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:48:42.22 ID:l+r11Fp5.net] 軽くググったら最近の.Net Coreとかだと状況次第って感じやね https://takap-tech.com/entry/2020/02/24/213932 原理考えたらまあ妥当な結果だと思う
673 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 01:23:06.66 ID:IPa2oLl3.net] なるほど勉強になります
674 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 13:37:08.15 ID:bD3kPd/D.net] なるほど理解できません
675 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 15:37:54.18 ID:az6RTKF7.net] 処理系の実装に寄るけど、うまくインデックスを張れば 速度的には同等になるはずだけどな
676 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 19:29:05.55 ID:k9DNZwa6.net] >>671 どういう理論なんだ? ランダムアクセスだとジャグ配列は次元毎にメモリーアクセスして辿らないとダメだけど多次元配列ならインデックスの計算してその場所にアクセスするだけだから多次元配列の方が速い シーケンシャルアクセスだとアクセスの多くは最後の次元のアクセスだから毎回インデックスを計算する多次元配列よりジャグ配列の方が速いと思う まあめっちゃ最適化して多次元配列を1次元配列に展開するようなコードにまで落とせたら多次元配列の方が微妙に速くなるかも
677 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 19:52:31.91 ID:Sd8akiyh.net] なんにせよ多次元配列を1次元配列に高速に平坦化する方法分からないんだろ グダグダスレ引き延ばしておきながらなw
678 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 21:46:07.02 ID:UFBDJ7q0.net] @($a) Foreach-Objectもforeach分も要らない
679 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 21:47:10.61 ID:UFBDJ7q0.net] foreach分 → foreach文
680 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 22:27:25.79 ID:6aj92Tm3.net] >>673 そんな低レベルなことでドヤれるとか羨ましいわw
681 名前:デフォルトの名無しさん mailto:sage [2020/10/28(水) 19:54:09.10 ID:RpzUgl/d.net] >>674 >@($a) PSってこんなオチが多いね $aって打てば全部列挙されて出てくるんだからあれれとは思うんだけどさ
682 名前:633 mailto:sage [2020/10/29(木) 21:32:08.09 ID:/oXwNFXj.net] >>674 返信遅れてすみません。 0.2秒まで速くなりました。 シンプルかつナンバーワンですね 目からウロコでした。
683 名前:デフォルトの名無しさん mailto:sage [2020/10/29(木) 23:08:28.85 ID:u3CTd5OP.net] >>677 こういうトリッキー系?は趣味PGならいいんだけど 業務PGに実装するには躊躇するんだよなあw
684 名前:デフォルトの名無しさん mailto:sage [2020/10/29(木) 23:35:09.18 ID:ebCj94Ij.net] え? これは常識では・・・
685 名前:デフォルトの名無しさん mailto:sage [2020/10/30(金) 08:08:54.65 ID:xvehW8+X.net] PowerShell使うならほぼ常識、てか知らないと辛いレベル そもそもPowerShell自体が色々トリッキーな動作するし、特に配列周り
686 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 13:12:42.29 ID:cgiVh2xg.net] $a = [Object[,]]::new(3,3); $a.Rank は 2 $b = $a; $b.Rank は 2 $b = & { $a }; $b.Rank だと 1 $b = $a + @(); $b.Rank でも 1 もちろん $b.Length はどれも 9 $b = $a が特例のように思えてきた どうしてこうなるのかきちんと理屈が知りたい
687 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 14:39:03.01 ID:Q6ZeZ8N8.net] 配列での foreach の使用 (C# プログラミング ガイド) https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/using-foreach-with-arrays 多次元配列の場合、右端の次元のインデックスが最初に加算されていき、次にその左の次元、またその左、というような方法で各要素がトラバースされます。 int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } }; // Or use the short form: // int[,] numbers2D = { { 9, 99 }, { 3, 33 }, { 5, 55 } }; foreach (int i in numbers2D) { System.Console.Write("{0} ", i); } // Output: 9 99 3 33 5 55
688 名前:682 mailto:sage [2020/11/02(月) 17:29:09.65 ID:cgiVh2xg.net] 明示的な foreach の使用は興味がないなあ $b = $a も $b = & { $a } も $a を $b に代入するのに なんで結果が違うのかが知りたい
689 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 17:46:27.91 ID:O692h/lZ.net] 最初のやつ以外はシンプルな代入じゃなくて演算してるから、演算の結果が一次元配列になっただけじゃないの
690 名前:682 mailto:sage [2020/11/02(月) 17:50:23.99 ID:cgiVh2xg.net] $b = & { $a } も演算? 具体的にどういう演算になるのかわからない
691 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 17:54:46.38 ID:Razdsa9H.net] >>682 >$b = & { $a }; $b.Rank だと 1 >$b = $a + @(); $b.Rank でも 1 この2つは$aがそれぞれ評価されて1次元になって$bに代入されてる $b = & { $a } の場合$aの前にカンマを入れれば型は保たれる $b = & { ,$a } PowerShellの謎仕様
692 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:05:40.51 ID:Razdsa9H.net] おそらくスクリプトブロックを通過するときと 右辺や左辺に置いて演算するとき それぞれ1次元に変換されてしまう仕様みたい
693 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:07:36.92 ID:O692h/lZ.net] >>686 起動演算子にスクリプトブロックを渡してるんだから演算でしょ スクリプトで $a とだけ書くと$aが評価されて左上から順に9行分の出力が得られる $b=&{$a}はその出力の代入になってる
694 名前:682 mailto:sage [2020/11/02(月) 18:14:48.39 ID:cgiVh2xg.net] じゃあやっぱり単純な代入 $b = $a だけが特別で それ以外は配列が展開されるってことか 理解した >>687 & { $a } だと配列 $a が展開される & { ,$a } にすれば配列の配列 ,$a が展開されて配列 $a がそのまま渡される
695 名前:682 mailto:sage [2020/11/02(月) 18:50:05.02 ID:cgiVh2xg.net] あれ違うな 単純な代入だけでなく Comma operator も特例になるのか
696 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:58:29.51 ID:WQUINiFK.net] >>691 特例だとか自分勝手な解釈をする癖を直さないと、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。 自分が既に頭の中に描いているイメージに合わせて無理に解釈方法を寄せていくのではなくて、本来理解すべき仕様の方に自分の中の理解を修正して近づけていく方がいいぞ。
697 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 19:13:13.99 ID:eTL99CIn.net] ウザっ
698 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 19:59:31.61 ID:D4NZ1UY1.net] >>692 TPO をわきまえられずトンチンカンな御高説垂れる人も、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
699 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 20:30:51.76 ID:Razdsa9H.net] >>690 原理的にはジャグ配列にして空評価させて返すで合ってると思う 恐らく処理系のソース読み込まないと判らないよ 配列返す関数作る時も同じ方法
700 名前:682 mailto:sage [2020/11/02(月) 20:44:58.19 ID:cgiVh2xg.net] ,$a は Comma operator で1要素の配列を返すけれど その時に $a は展開されずに2次元配列のまま これは単純な代入と同じ扱いだよね
701 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 21:48:13.16 ID:Qlwbnxz+.net] { $a } は { Write-Output $a } の事 Write-Output に配列を渡した時の挙動を考えればいい https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-output By default, Write-Output enumerates through collections provided to the cmdlet. However, Write-Output can also be used to pass collections down the pipeline as a single object with the NoEnumerate parameter.
702 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 22:48:01.97 ID:O692h/lZ.net] ウザかろうと思って特例云々につっこむのやめたけどやっぱり書くわ 代入は代入でしかなく特例も何もない いつだって右辺の値をありのままの型と値で代入するだけ $b=&{$a} というのを代入として認識するからおかしくなる $b=$a.Rank と書いたら$bは数値になるわけだけど、代入したから数値になった!とは思わないでしょ あくまで.Rankを評価した結果が数値になって、その数値を$bに代入したに過ぎない $b=&{$a} も &{$a} の評価結果が一次元配列になる仕様なだけで、代入が何かの法則性に寄与している訳ではないし、一次元配列になるという一貫したルールや思想があるわけでもない
703 名前:682 mailto:sage [2020/11/03(火) 00:15:03.20 ID:Da50zhuo.net] operand を展開してから operator にわたすんじゃなくて operand をそのままわたして operator が展開したりしなかったりする たぶん理解した
704 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 08:59:33.05 ID:HUEo3Cdu.net] >>682 の$b = $a は$aの参照を$bに代入している $a = [Object[,]]::new(3,3) $b = $a $b[0,0] = 1 echo $a[0,0] #=> 1 $b = & { $a } は { $a }というスクリプトブロックを実行して戻り値を代入する { $a } の意味は >>697 を見ろ