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 が立ててね!!
403 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 00:36:09.32 ID:xELEw2uC.net] Linux なら、systemd とか Windows の仕組みは知らないけど、 レジストリはその結果を収めたデータベースだから、 結果をいじっても問題解決にはならない 設定は各アプリ製作者が作っているものだから、 製作者以外の人間にできる事は、アプリをアンインストールする事だけ 設定にも様々な依存関係があるから、 アプリの内容も分からない人が、ある設定を変えても、どう作用するか分からない 例えば、アプリのメモリが解放されなくなって、 他のアプリも動かなくなるかも それに設定を変えても、再起動しないと有効にならないかも知れないし、 再起動すると、設定が元に戻るかも知れない OS 起動時の処理に、設定読み込みを登録しているかも知れない
404 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 09:15:38.14 ID:lQ/zAxwG.net] ウダウダと一体何の話をしてるんだ いいからStop-ServiceとSet-Service使えよ ただ老人がじゃれ合いたいだけなのか?
405 名前:デフォルトの名無しさん mailto:sage [2022/06/21(火) 11:49:55.72 ID:+f2eC/vV.net] こんな辺境にまでやべーやつ | Out-Null
406 名前:デフォルトの名無しさん mailto:sage [2022/06/22(水) 20:51:18.50 ID:At4JlVSH.net] >>375 管理者やSYSTEMじゃなくてTrustedInstallerとして実行しても駄目か? もちろんレジストリをいじるんじゃんなくてSet-Serviceを使うんだぞ もう見てないかもしれんが
407 名前:デフォルトの名無しさん mailto:sage [2022/06/22(水) 22:28:41.71 ID:OsaOMnRZ.net] わざわざ召喚しようとする馬鹿発見伝
408 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 13:29:04.40 ID:VuoDyj+3.net] 最近foreach文のコレクションの要素を受け取る変数の名前をつけるのが めんどくさくって for文のカウンター変数の名前に i を使うのはよくありますが foreachにも同じような定石ってありますか?
409 名前:デフォルトの名無しさん [2022/06/24(金) 13:47:20.90 ID:4Qrsm7mD.net] aオブジェクト名
410 名前:デフォルトの名無しさん [2022/06/24(金) 14:25:06.98 ID:K2we1Lar.net] e
411 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 20:56:03.77 ID:EMaN3eAt.net] Item
412 名前:デフォルトの名無しさん mailto:sage [2022/06/24(金) 23:55:58.07 ID:/S8ogjuv.net] item, element
413 名前:デフォルトの名無しさん [2022/06/26(日) 07:43:19.31 ID:G39l7ngg.net] 例えば$url = "https://yyyy.xxx/aaa/bbbb/2/"があり、最後の[2/]をカウンタを使ってアクセスしたいとおもいます。 その際、$nextUrl = ($url -replace ".{2}$") + $cnt + "`\" で行けると思ったのですが、何か間違えていますでしょうか?
414 名前:デフォルトの名無しさん [2022/06/26(日) 08:16:14.03 ID:JGEtGMnz.net] -replaceの使い方を間違えてる
415 名前:デフォルトの名無しさん [2022/06/26(日) 11:32:39.54 ID:G39l7ngg.net] replaceですか。ありがとうございます
416 名前:デフォルトの名無しさん [2022/06/29(水) 00:00:51.24 ID:x2p/lm6W.net] arrayListの使い方がわからない。 ---------------------------- $arrayReturn = new-object system.collections.arrayList $col = new-object PSObject | select "A", "B", "C" foreach ($i in 1..3) { $col."A" = $i $col."B" = $i + 1 $col."C" = $i + 2 $nul = $arrayReturn.add($col) } $arrayReturn ---------------------------- 上記のコードを実行すると以下のようになってしまう。 A B C - - - 3 4 5 3 4 5 3 4 5 本当は以下のようにしたい A B C - - - 1 2 3 2 3 4 3 4 5 なぜうまくいかないのか謎。
417 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 00:51:19.50 ID:cjQj
] [ここ壊れてます]
418 名前:2yfD.net mailto: $col のnew-object生成をforeach{}内に移動してみては [] [ここ壊れてます]
419 名前:デフォルトの名無しさん [2022/06/29(水) 07:19:16.62 ID:x2p/lm6W.net] >>410 うまくいった はあああああああああああああ!? なんで!? なんでこれでうまくいくんだ!? ループの中に入れたら毎回$colの中身が破壊されると思うんですけど????
420 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 08:20:00 ID:8GN1KOCk.net] PSObjectは参照型 ArrayListに追加されるのはオブジェクトそのものじゃなくてオブジェクトの参照だけ
421 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 09:10:01.99 ID:ofsaM31D.net] >>412 完全に理解しました。thx
422 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 14:16:08.11 ID:SZ5j8L6g.net] PSReadLine 2.2.6 enables Predictive Intellisense by default https://devblogs.microsoft.com/powershell/psreadline-2-2-6-enables-predictive-intellisense-by-default/ 入力しようとしているコマンドを予測 〜PowerShellで「Predictive IntelliSense」が既定有効に 履歴やプラグインなどを参考に推測できるIntelliSense機能 https://forest.watch.impress.co.jp/docs/news/1420812.html
423 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 21:06:08.62 ID:h+5hcb7e.net] PSCustomObjectは積極的に使っていいものかどうか判断できない 結局C#でクラスや構造体宣言して使った方がいい気がするし Powershellで作成したPSCustomObjectを、同ソースに埋め込んだC#コード側から参照する方法ってある?
424 名前:デフォルトの名無しさん mailto:sage [2022/06/29(水) 21:46:04.47 ID:4kwBO65f.net] >>415 dynamic
425 名前:デフォルトの名無しさん mailto:sage [2022/06/30(木) 01:46:52.84 ID:LVSNczoT.net] >>415 New-Object PSCustomObject や [PSCustomObject]@{} は Win10 の v5.1 なら Add-Type の C# でなくとも class があるからスクリプトでの使用頻度は下がった。 Win7 の v2 では function NewABC {} みたいなコンストラクタ的な関数用意して積極的に使ってた。 Win10 の今でも ConvertTo-Csv へ渡す前に日時や数値を書式指定して文字列化するために使ってる。 CSV に日本語カラム名が欲しい時に日本語プロパティ名の class 用意するのはなんか気が引けるけど [PSCustomObject]@{} や Select-Object での誰が見ても短命なオブジェクトなら気にならない。 データだけでメソッドがなく複数作るなら System.Data.DataTable も有り。 .Columns.AddRange([string[]]) でプロパティ(DataColumn)定義して .Rows.Add([Object[]]) でデータ(DataRow)追加する使い方なら意外と手軽に使える。 日本語カラム名の使用も問題ないし。
426 名前:デフォルトの名無しさん [2022/07/06(水) 09:44:42.33 ID:L+R7c7Gd.net] -replaceと-ireplaceの違いって分かりますか? まだ勉強中ですが、当然のように出てきて両方同じ説明しかされてないので気になって調べてみてもどこにも解説がなくて… 扱える値の範囲が違ったりとかするんでしょうか? 普通はどっちを使うものなんですか?
427 名前:デフォルトの名無しさん [2022/07/06(水) 11:05:49.65 ID:MXaUuSJv.net] 1.完全に理解した←初心者 2.チョットワカル←中級者 3.全然判らん←上級者
428 名前:デフォルトの名無しさん mailto:sage [2022/07/06(水) 11:41:17 ID:HSp/EaB5.net] >>418 https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.2 既定では、 -replace 演算子では大文字と小文字が区別されません。 大文字と小文字を区別するには、次を使用します -creplace。 明示的に大文字と小文字を区別しないようにするには、次を使用します -ireplace。 replaceの既定動作を変更する方法は知りません。 大文字小文字を区別しようがしまいがどっちでもいいときは replace そこんとこ間違ってもらっち
429 名前:瘢「るときは ireplace か creplace 普通がどっちかは分かりません。 [] [ここ壊れてます]
430 名前:デフォルトの名無しさん mailto:sage [2022/07/06(水) 13:11:25.93 ID:c6fRPAAn.net] 例えば、Ruby のCSV 処理なら、 require 'csv' input_csv = <<"CSV_TEXT" id,果物 1,りんご 21,スイカ 33,みかん CSV_TEXT # 2次元配列 ary = CSV.parse( input_csv, headers: true ).each do |row| row[ '果物' ] = "レモン" if row[ 'id' ].to_i == 21 end p ary.to_a #=> [ ["id", "果物"], ["1", "りんご"], ["21", "レモン"], ["33", "みかん"] ]
431 名前:デフォルトの名無しさん [2022/07/06(水) 13:16:19.97 ID:iisDFTgh.net] >>420 ありがとうございます! 理解できました! 明示的に大文字の区別をつけるかつけないか指定する際に利用するものなんですね! たしかにそれだと【普通】は場合によるとしか言えないですよね
432 名前:デフォルトの名無しさん mailto:sage [2022/07/06(水) 20:34:21.87 ID:428zggiP.net] 迷ったら明示でいいと思う
433 名前:デフォルトの名無しさん mailto:sage [2022/07/06(水) 22:49:51.62 ID:pVM7wVd2.net] パワシェルの-replaceは勝手に右辺を正規表現と解釈するから それが必要ない場合は文字列.Replace()のがいいよ
434 名前:デフォルトの名無しさん mailto:sage [2022/07/07(木) 08:47:36 ID:fDYvmpy4.net] >>423 そうですね! >>424 おお、知りませんでした。 ありがとうございます!
435 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 13:33:50.89 ID:EP1tRVB4.net] Windowsでコマンドラインシェルとして使う場合に 外部コマンド引数のクオーテーションの振る舞いをなんとかして欲しい 例えばpwshを外部コマンドとして使うとして pwsh -nop -c "`$a = 'abc'; `$a | out-host" は期待通り abc が出力されるのに pwsh -nop -c '$a = "abc"; $a | out-host' はエラーになるの不便過ぎる
436 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 20:51:35.26 ID:Bjqd/A21.net] 補完が有効になってやっとまともに使えるようになったなよくこんなクソ長くて覚え辛くて入力し辛いコマンドレットなんて使ってるよなお前ら しかしMSって言語やフレームワークでもそうだが命名規則にセンスねーゎ なんでnpmやgitみたいに使いやすく作れないのか壊滅的にセンスねーゎ
437 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 21:48:06.89 ID:SkLqj5eb.net] 互換性のあるエイリアス https://docs.microsoft.com/ja-jp/powershell/scripting/learn/compatibility-aliases
438 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 22:10:30.33 ID:EP1tRVB4.net] PS> pwsh -nop -c "`$a = 'abc'; `$a | out-host" abc PS> pwsh -nop -c '$a = "abc"; $a | out-host' abc: The term 'abc' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. これほんと何がどうしてこうなるの?
439 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:27:21.05 ID:UIv0TQaX.net] pwsh.exeへのコマンドラインとして解釈されるから、まずOSのルールに従って引数リストが次のように分解される -nop -c '$a = abc ; $a | out-host' pwsh.exeの内側でコマンド文字列を再結合した時点では既にダブルクォートが失われているという寸法
440 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:35:00 ID:v6YmQ/+d.net] PS内で呼び出すならスクリプトブロックでよくね?
441 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:40:56 ID:UIv0TQaX.net] 無茶言うなよ… pwshの-cより右ならスクリプト扱いで、cmdやその他大勢の右ならOS解釈? pwshという同名のオレオレアプリの類だったときもスクリプト扱い? 言語仕様の一貫性的にあかんことになるだろ常考
442 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:49:47 ID:cCHwpa3p.net] もしかして リモートコマンド
443 名前:デフォルトの名無しさん mailto:sage [2022/07/08(金) 23:52:42 ID:PFPNTTsE.net] >>429 「'$a = "abc"; $a | out-host'」の「'〜'」は そのコマンドライン上の文字列リテラルである事をPowerShellに指示してる事になって PowerShellは1つの文字列「$a = "abc"; $a | out-host」の事だと受け取る。 コマンドが実行ファイルの実行で、その引数の文字列にスペースがあると その文字列全体が「"〜"」で括られて文字列「"$a = "abc"; $a | out-host"」になる。 ↑Windows PowerShell v5.1のTrace-Commandで確認 ↓自信なし powershell実行時の引数パース時に「\"」とか「"""」とかではない 単独「"」は不正な(余分な)メタキャラとして取り除かれるもよう。 で-cには「$a = abc; $a | out-host」が渡る。 >>430 確か「OSのルール」だと、実行ファイルに渡される引数は単一の文字列で、 スペースで区切ったり「"」を特別扱いするのはpowershell(pwsh).exeの独自のただし非常に一般的な仕様。 (大抵は、exeにコンパイルした際のコンパイラの仕様。)
444 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 00:09:26.45 ID:qWQ5DRIr.net] Linuxのpowershellなら PS> pwsh -nop -c '$a = "abc"; $a | out-host' abc になるんだろうな
445 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 08:04:26 ID:qWQ5DRIr.net] コマンドプロンプトで pwsh -nop -c "$a=\"abc\"; $a | out-host" とするのは " 内部の " をエスケープするように見えて自然に納得できる Windows版のPowerShellだけ pwsh -nop -c '$a=\"abc\"; $a | out-host' とするのは ' 内部の " をエスケープさせられて気持ち悪すぎる おまけにLinux版でこう書くと動かないんでしょ
446 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 10:32:21.09 ID:d4+i07Ea.net] >>436 コマンドプロンプト(cmd)だともっと高難易度の問題がある。 cmdのメタキャラ(&, |, <, >など)が偶数番目の「"」の後にあるとだめとか、 powershellコンソール以上に問題有り。 pwsh -nop -c "$a=\"&abc\"; $a | out-host" 同一のシェル名(pwsh)であっても、OSによって他プロセス起動の作法が違うのは仕方ないと思う。 国や地域で言葉や文化が違っても仕方ない感じ。 (POSIXとかに規定あればば別だが。) 例えば「ping」を動かすだけにしても結局オプションも挙動も違う訳だし、 現時点では他プロセス使う時点で、移植性考慮はプログラマの領分かな〜と思ってる。
447 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 10:48:49.98 ID:d4+i07Ea.net] PowerShellのコンソールやスクリプト上で他プロセスを起動したい場合、 自分だとほぼ下記2通り。 (A) System.Diagnostics.ProcessStartInfoを使う。 (ちゃんと制御したい場合。スクリプトだと基本これ。) $si = [Diagnostics.ProcessStartInfo]::new() $si.FileName = 'powershell.exe' $si.Arguments = '-nop -c "$a = \"abc\"; $a | out-host"' $si.UseShellExecute = $false $proc = [Diagnostics.Process]::Start($si) $proc.WaitForExit() (B) 引数を1つずつ@()に入れ、「"〜"」としたい場合は最初から値に含める。 (コマンドラインとかで手軽に。…手軽?) & 'powershell' @('-nop', '-c', '"$a = \"abc\"; $a | out-host"')
448 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 10:59:09.60 ID:qWQ5DRIr.net] MSYS2のbashもWindows上のコマンドラインシェルだけど pwsh -nop -c "\$a = 'abc'; \$a | out-host" pwsh -nop -c '$a = "abc"; $a | out-host' のどちらでも動くんだよね PowerShellには頑張って欲しい
449 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 14:41:14.65 ID:OGG0CV73.net] わざわざProcessStartInfo使うとかめんどくさいわ Start-Processでいい Start-Process -FilePath 'powershell.exe' -ArgumentList '-nop -c "$a = \"abc\"; $a | out-host"' -NoNewWindow -Wait
450 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 21:16:37.86 ID:d4+i07Ea.net] ProcessStartInfoが面倒なのは同意。 Start-Processで済む時は使う事もあって 大体はUseShellExecute = $trueの時かな。 Start-Processを使わない一番の理由は-Redirect*がファイルパス指定な事。 出力を無加工でファイル出力したい事がまずないので使いづらい。 なんで-PassThruのProcessオブジェクトの出力制御変更のスイッチじゃないのか。 標準出力・エラーを同時に制御するとデッドロックしやすいからかな。 Start-Processがその辺うまい事制御してくれたらスクリプトでも使うんだけど。
451 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 21:55:59.58 ID:0vXUA52p.net] コマンドラインパラメーターの処理はexeをビルドした処理系のスタートアップコードに依存するのだ MSのC/C++やMingwとかで微妙に変わってくるのだガハハ WindowsでC/C++/C#の場合argvとかではなくWin32APIのGetCommandLineで取得するのが一番正解に近い
452 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 22:06:03.52 ID:qWQ5DRIr.net] "" や \" が必要な仕様は気持ち悪いって話をしてたつもりが… ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ about_Parsing の icacls を呼ぶ例もそのまま並べてる そのままと異なる動きをさせたい時以外は、>>438 も>>440 も面倒すぎる
453 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 22:40:11.92 ID:GKrnmeJx.net] 引数のワイルドカードを展開するかしないかみたいなやつね
454 名前:デフォルトの名無しさん mailto:sage [2022/07/09(土) 23:17:22.46 ID:d4+i07Ea.net] MSもこの辺の気持ち悪さ・分かりづらさは分かってるみたいで core v7とかだと環境変数かなんかで、パースルール変更できるんじゃなかったっけ。 Win10のv5.1しか使わないから知らんけど。
455 名前:デフォルトの名無しさん [2022/07/10(日) 00:25:59.02 ID:qiFT6lHF.net] 実行順がわかりにくい
456 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 00:55:31.74 ID:KsOikrPY.net] 何言いたいかがわかりにくい
457 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 01:17:57 ID:KsOikrPY.net] >>443 > ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ 例えば $a = "abc"; cmd /c "echo $a" を実行したら「$a」と出力されて欲しくて 「abc」と出力されて欲しければ>>438 ,440ってこと? 好みが分かれるところかなー
458 名前:デフォルトの名無しさん [2022/07/10(日) 04:27:28.58 ID:qiFT6lHF.net] UNIXのシェルスクリプトのマネにならないようにした結果がこれ
459 名前:デフォルトの名無しさん [2022/07/10(日) 04:30:45.24 ID:qiFT6lHF.net] PowerShellは、記号に独自の意味を持たせているから、PowerShell職人を養成しないと使いこなせない。
460 名前:デフォルトの名無しさん mailto:sag [2022/07/10(日) 09:49:01.94 ID:os7PFybL.net] PowerShell in ActionにはUNIXシェルを参考にしたっていろんな所に書いてあるけど たとえば比較演算子とか
461 名前:デフォルトの名無しさん [2022/07/10(日) 10:20:51 ID:j6DdFbos.net] powershellはPerlの匂いがする 俺が好きになった理由はここ
462 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 20:59:21.65 ID:KsOikrPY.net] >>450 記号に独自の意味を持たせてる言語は多数あるのでは。 というか程度の差こそあれ殆どでは。 学習せず「使いこなせる」言語はないでしょ。
463 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 21:53:38.94 ID:bG/pnkmn.net] powershellの記号が特殊とかはあまり思わないな それより配列の扱いがトリッキーとかの方が職人の養成が必要と思う
464 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 22:11:42.01 ID:PiYySnCe.net] ファイル名に[]が含まれてて苦労した人なのかなと思った
465 名前:デフォルトの名無しさん [2022/07/10(日) 22:53:56.17 ID:qiFT6lHF.net] >>453 バッチファイルとの相性が最悪なのに気づかないとは情けないよ、あんた。
466 名前:デフォルトの名無しさん [2022/07/10(日) 22:55:51.37 ID:qiFT6lHF.net] >>451 あらゆる言語を参考にして、いろいろ混ぜ込んで、奇妙奇天烈なものになってしまった。
467 名前:デフォルトの名無しさん mailto:sage [2022/07/10(日) 23:58:19.25 ID:RTsqHO1/.net] まあ最大の問題は、空白をトークンの区切り、改行を入力に終わりとしたことだな
468 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 00:03:16.90 ID:bX2QAhdS.net] 変数のスコープが他と違うPowershellには何も期待してない グローバル変数を更新したつもりがローカル変数と見なされたりして使い難すぎる グローバルデータを全部.NETのコンテナに逃がしてようやく使えるようになった
469 名前:デフォルトの名無しさん [2022/07/11(月) 00:04:59.61 ID:vt1vW9IA.net] ファイルや文字列の操作の構文がヘンテコすぎる
470 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 01:41:49.71 ID:4UtqkfgJ.net] 超ヘンテコなJavaScriptだって一世を風靡したんだからPowershellだっていけるし(震え声
471 名前:デフォルトの名無しさん [2022/07/11(月) 03:32:17.37 ID:vt1vW9IA.net] >>461 あんたPowerShellをほどんど知らないでしょ?
472 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 07:53:28.56 ID:3aArSxtS.net] >>456 そんな話してなかったでしょ。会話になってないよ。 バッチ(コマンドプロンプト)上でワンライナー書くときに 記号の取り扱いに注意しなくていいメジャー言語は一つも知らない。
473 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 09:42:24.64 ID:zwDcIdQY.net] >>463 個人的にはバッチは制限多過ぎだよね 今回の問題もPowershellというより旧cmm互換性のせいだし
474 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 10:44:52.35 ID:KonxbxUI.net] あんた あのこの なんなのさ
475 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 11:27:13.34 ID:4o6o7MFx.net] おらシェル子のこどほどんどしらねっちゃ
476 名前:デフォルトの名無しさん mailto:sage [2022/07/11(月) 13:10:07.01 ID:ekYGS06D.net] そもそもpsでスクリプト使うならバッチじゃなくてps1だろ
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の人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質 結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った 値渡しだけで済む書き方ができればなお良い