前スレ
PowerShell -Part 5
https://mevius.5ch.net/test/read.cgi/tech/1615994992/
次スレは>>980が立ててね!!
探検
PowerShell -Part 6
■ このスレッドは過去ログ倉庫に格納されています
2022/02/13(日) 18:36:12.07ID:LaQ04ZoE
411デフォルトの名無しさん
2022/06/29(水) 07:19:16.62ID:x2p/lm6W412デフォルトの名無しさん
2022/06/29(水) 08:20:00.62ID:8GN1KOCk PSObjectは参照型
ArrayListに追加されるのはオブジェクトそのものじゃなくてオブジェクトの参照だけ
ArrayListに追加されるのはオブジェクトそのものじゃなくてオブジェクトの参照だけ
413デフォルトの名無しさん
2022/06/29(水) 09:10:01.99ID:ofsaM31D >>412
完全に理解しました。thx
完全に理解しました。thx
414デフォルトの名無しさん
2022/06/29(水) 14:16:08.11ID:SZ5j8L6g 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
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
415デフォルトの名無しさん
2022/06/29(水) 21:06:08.62ID:h+5hcb7e PSCustomObjectは積極的に使っていいものかどうか判断できない
結局C#でクラスや構造体宣言して使った方がいい気がするし
Powershellで作成したPSCustomObjectを、同ソースに埋め込んだC#コード側から参照する方法ってある?
結局C#でクラスや構造体宣言して使った方がいい気がするし
Powershellで作成したPSCustomObjectを、同ソースに埋め込んだC#コード側から参照する方法ってある?
416デフォルトの名無しさん
2022/06/29(水) 21:46:04.47ID:4kwBO65f >>415
dynamic
dynamic
417デフォルトの名無しさん
2022/06/30(木) 01:46:52.84ID:LVSNczoT >>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)追加する使い方なら意外と手軽に使える。
日本語カラム名の使用も問題ないし。
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)追加する使い方なら意外と手軽に使える。
日本語カラム名の使用も問題ないし。
418デフォルトの名無しさん
2022/07/06(水) 09:44:42.33ID:L+R7c7Gd -replaceと-ireplaceの違いって分かりますか?
まだ勉強中ですが、当然のように出てきて両方同じ説明しかされてないので気になって調べてみてもどこにも解説がなくて…
扱える値の範囲が違ったりとかするんでしょうか?
普通はどっちを使うものなんですか?
まだ勉強中ですが、当然のように出てきて両方同じ説明しかされてないので気になって調べてみてもどこにも解説がなくて…
扱える値の範囲が違ったりとかするんでしょうか?
普通はどっちを使うものなんですか?
419デフォルトの名無しさん
2022/07/06(水) 11:05:49.65ID:MXaUuSJv 1.完全に理解した←初心者
2.チョットワカル←中級者
3.全然判らん←上級者
2.チョットワカル←中級者
3.全然判らん←上級者
420デフォルトの名無しさん
2022/07/06(水) 11:41:17.81ID:HSp/EaB5 >>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
そこんとこ間違ってもらっちゃ困るときは ireplace か creplace
普通がどっちかは分かりません。
https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.2
既定では、 -replace 演算子では大文字と小文字が区別されません。
大文字と小文字を区別するには、次を使用します -creplace。
明示的に大文字と小文字を区別しないようにするには、次を使用します -ireplace。
replaceの既定動作を変更する方法は知りません。
大文字小文字を区別しようがしまいがどっちでもいいときは replace
そこんとこ間違ってもらっちゃ困るときは ireplace か creplace
普通がどっちかは分かりません。
421デフォルトの名無しさん
2022/07/06(水) 13:11:25.93ID:c6fRPAAn 例えば、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", "みかん"] ]
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", "みかん"] ]
422デフォルトの名無しさん
2022/07/06(水) 13:16:19.97ID:iisDFTgh423デフォルトの名無しさん
2022/07/06(水) 20:34:21.87ID:428zggiP 迷ったら明示でいいと思う
424デフォルトの名無しさん
2022/07/06(水) 22:49:51.62ID:pVM7wVd2 パワシェルの-replaceは勝手に右辺を正規表現と解釈するから
それが必要ない場合は文字列.Replace()のがいいよ
それが必要ない場合は文字列.Replace()のがいいよ
425デフォルトの名無しさん
2022/07/07(木) 08:47:36.53ID:fDYvmpy4426デフォルトの名無しさん
2022/07/08(金) 13:33:50.89ID:EP1tRVB4 Windowsでコマンドラインシェルとして使う場合に
外部コマンド引数のクオーテーションの振る舞いをなんとかして欲しい
例えばpwshを外部コマンドとして使うとして
pwsh -nop -c "`$a = 'abc'; `$a | out-host"
は期待通り abc が出力されるのに
pwsh -nop -c '$a = "abc"; $a | out-host'
はエラーになるの不便過ぎる
外部コマンド引数のクオーテーションの振る舞いをなんとかして欲しい
例えばpwshを外部コマンドとして使うとして
pwsh -nop -c "`$a = 'abc'; `$a | out-host"
は期待通り abc が出力されるのに
pwsh -nop -c '$a = "abc"; $a | out-host'
はエラーになるの不便過ぎる
427デフォルトの名無しさん
2022/07/08(金) 20:51:35.26ID:Bjqd/A21 補完が有効になってやっとまともに使えるようになったなよくこんなクソ長くて覚え辛くて入力し辛いコマンドレットなんて使ってるよなお前ら
しかしMSって言語やフレームワークでもそうだが命名規則にセンスねーゎ
なんでnpmやgitみたいに使いやすく作れないのか壊滅的にセンスねーゎ
しかしMSって言語やフレームワークでもそうだが命名規則にセンスねーゎ
なんでnpmやgitみたいに使いやすく作れないのか壊滅的にセンスねーゎ
428デフォルトの名無しさん
2022/07/08(金) 21:48:06.89ID:SkLqj5eb429デフォルトの名無しさん
2022/07/08(金) 22:10:30.33ID:EP1tRVB4 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.
これほんと何がどうしてこうなるの?
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.
これほんと何がどうしてこうなるの?
430デフォルトの名無しさん
2022/07/08(金) 23:27:21.05ID:UIv0TQaX pwsh.exeへのコマンドラインとして解釈されるから、まずOSのルールに従って引数リストが次のように分解される
-nop
-c
'$a
=
abc
;
$a
|
out-host'
pwsh.exeの内側でコマンド文字列を再結合した時点では既にダブルクォートが失われているという寸法
-nop
-c
'$a
=
abc
;
$a
|
out-host'
pwsh.exeの内側でコマンド文字列を再結合した時点では既にダブルクォートが失われているという寸法
431デフォルトの名無しさん
2022/07/08(金) 23:35:00.16ID:v6YmQ/+d PS内で呼び出すならスクリプトブロックでよくね?
432デフォルトの名無しさん
2022/07/08(金) 23:40:56.26ID:UIv0TQaX 無茶言うなよ…
pwshの-cより右ならスクリプト扱いで、cmdやその他大勢の右ならOS解釈? pwshという同名のオレオレアプリの類だったときもスクリプト扱い?
言語仕様の一貫性的にあかんことになるだろ常考
pwshの-cより右ならスクリプト扱いで、cmdやその他大勢の右ならOS解釈? pwshという同名のオレオレアプリの類だったときもスクリプト扱い?
言語仕様の一貫性的にあかんことになるだろ常考
433デフォルトの名無しさん
2022/07/08(金) 23:49:47.55ID:cCHwpa3p もしかして
リモートコマンド
リモートコマンド
434デフォルトの名無しさん
2022/07/08(金) 23:52:42.34ID:PFPNTTsE >>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にコンパイルした際のコンパイラの仕様。)
「'$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にコンパイルした際のコンパイラの仕様。)
435デフォルトの名無しさん
2022/07/09(土) 00:09:26.45ID:qWQ5DRIr Linuxのpowershellなら
PS> pwsh -nop -c '$a = "abc"; $a | out-host'
abc
になるんだろうな
PS> pwsh -nop -c '$a = "abc"; $a | out-host'
abc
になるんだろうな
436デフォルトの名無しさん
2022/07/09(土) 08:04:26.74ID:qWQ5DRIr コマンドプロンプトで
pwsh -nop -c "$a=\"abc\"; $a | out-host"
とするのは " 内部の " をエスケープするように見えて自然に納得できる
Windows版のPowerShellだけ
pwsh -nop -c '$a=\"abc\"; $a | out-host'
とするのは ' 内部の " をエスケープさせられて気持ち悪すぎる
おまけにLinux版でこう書くと動かないんでしょ
pwsh -nop -c "$a=\"abc\"; $a | out-host"
とするのは " 内部の " をエスケープするように見えて自然に納得できる
Windows版のPowerShellだけ
pwsh -nop -c '$a=\"abc\"; $a | out-host'
とするのは ' 内部の " をエスケープさせられて気持ち悪すぎる
おまけにLinux版でこう書くと動かないんでしょ
437デフォルトの名無しさん
2022/07/09(土) 10:32:21.09ID:d4+i07Ea >>436
コマンドプロンプト(cmd)だともっと高難易度の問題がある。
cmdのメタキャラ(&, |, <, >など)が偶数番目の「"」の後にあるとだめとか、
powershellコンソール以上に問題有り。
pwsh -nop -c "$a=\"&abc\"; $a | out-host"
同一のシェル名(pwsh)であっても、OSによって他プロセス起動の作法が違うのは仕方ないと思う。
国や地域で言葉や文化が違っても仕方ない感じ。
(POSIXとかに規定あればば別だが。)
例えば「ping」を動かすだけにしても結局オプションも挙動も違う訳だし、
現時点では他プロセス使う時点で、移植性考慮はプログラマの領分かな〜と思ってる。
コマンドプロンプト(cmd)だともっと高難易度の問題がある。
cmdのメタキャラ(&, |, <, >など)が偶数番目の「"」の後にあるとだめとか、
powershellコンソール以上に問題有り。
pwsh -nop -c "$a=\"&abc\"; $a | out-host"
同一のシェル名(pwsh)であっても、OSによって他プロセス起動の作法が違うのは仕方ないと思う。
国や地域で言葉や文化が違っても仕方ない感じ。
(POSIXとかに規定あればば別だが。)
例えば「ping」を動かすだけにしても結局オプションも挙動も違う訳だし、
現時点では他プロセス使う時点で、移植性考慮はプログラマの領分かな〜と思ってる。
438デフォルトの名無しさん
2022/07/09(土) 10:48:49.98ID:d4+i07Ea 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"')
自分だとほぼ下記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"')
439デフォルトの名無しさん
2022/07/09(土) 10:59:09.60ID:qWQ5DRIr MSYS2のbashもWindows上のコマンドラインシェルだけど
pwsh -nop -c "\$a = 'abc'; \$a | out-host"
pwsh -nop -c '$a = "abc"; $a | out-host'
のどちらでも動くんだよね
PowerShellには頑張って欲しい
pwsh -nop -c "\$a = 'abc'; \$a | out-host"
pwsh -nop -c '$a = "abc"; $a | out-host'
のどちらでも動くんだよね
PowerShellには頑張って欲しい
440デフォルトの名無しさん
2022/07/09(土) 14:41:14.65ID:OGG0CV73 わざわざProcessStartInfo使うとかめんどくさいわ
Start-Processでいい
Start-Process -FilePath 'powershell.exe' -ArgumentList '-nop -c "$a = \"abc\"; $a | out-host"' -NoNewWindow -Wait
Start-Processでいい
Start-Process -FilePath 'powershell.exe' -ArgumentList '-nop -c "$a = \"abc\"; $a | out-host"' -NoNewWindow -Wait
441デフォルトの名無しさん
2022/07/09(土) 21:16:37.86ID:d4+i07Ea ProcessStartInfoが面倒なのは同意。
Start-Processで済む時は使う事もあって
大体はUseShellExecute = $trueの時かな。
Start-Processを使わない一番の理由は-Redirect*がファイルパス指定な事。
出力を無加工でファイル出力したい事がまずないので使いづらい。
なんで-PassThruのProcessオブジェクトの出力制御変更のスイッチじゃないのか。
標準出力・エラーを同時に制御するとデッドロックしやすいからかな。
Start-Processがその辺うまい事制御してくれたらスクリプトでも使うんだけど。
Start-Processで済む時は使う事もあって
大体はUseShellExecute = $trueの時かな。
Start-Processを使わない一番の理由は-Redirect*がファイルパス指定な事。
出力を無加工でファイル出力したい事がまずないので使いづらい。
なんで-PassThruのProcessオブジェクトの出力制御変更のスイッチじゃないのか。
標準出力・エラーを同時に制御するとデッドロックしやすいからかな。
Start-Processがその辺うまい事制御してくれたらスクリプトでも使うんだけど。
442デフォルトの名無しさん
2022/07/09(土) 21:55:59.58ID:0vXUA52p コマンドラインパラメーターの処理はexeをビルドした処理系のスタートアップコードに依存するのだ
MSのC/C++やMingwとかで微妙に変わってくるのだガハハ
WindowsでC/C++/C#の場合argvとかではなくWin32APIのGetCommandLineで取得するのが一番正解に近い
MSのC/C++やMingwとかで微妙に変わってくるのだガハハ
WindowsでC/C++/C#の場合argvとかではなくWin32APIのGetCommandLineで取得するのが一番正解に近い
443デフォルトの名無しさん
2022/07/09(土) 22:06:03.52ID:qWQ5DRIr444デフォルトの名無しさん
2022/07/09(土) 22:40:11.92ID:GKrnmeJx 引数のワイルドカードを展開するかしないかみたいなやつね
445デフォルトの名無しさん
2022/07/09(土) 23:17:22.46ID:d4+i07Ea MSもこの辺の気持ち悪さ・分かりづらさは分かってるみたいで
core v7とかだと環境変数かなんかで、パースルール変更できるんじゃなかったっけ。
Win10のv5.1しか使わないから知らんけど。
core v7とかだと環境変数かなんかで、パースルール変更できるんじゃなかったっけ。
Win10のv5.1しか使わないから知らんけど。
446デフォルトの名無しさん
2022/07/10(日) 00:25:59.02ID:qiFT6lHF 実行順がわかりにくい
447デフォルトの名無しさん
2022/07/10(日) 00:55:31.74ID:KsOikrPY 何言いたいかがわかりにくい
448デフォルトの名無しさん
2022/07/10(日) 01:17:57.68ID:KsOikrPY449デフォルトの名無しさん
2022/07/10(日) 04:27:28.58ID:qiFT6lHF UNIXのシェルスクリプトのマネにならないようにした結果がこれ
450デフォルトの名無しさん
2022/07/10(日) 04:30:45.24ID:qiFT6lHF PowerShellは、記号に独自の意味を持たせているから、PowerShell職人を養成しないと使いこなせない。
451デフォルトの名無しさん
2022/07/10(日) 09:49:01.94ID:os7PFybL PowerShell in ActionにはUNIXシェルを参考にしたっていろんな所に書いてあるけど
たとえば比較演算子とか
たとえば比較演算子とか
452デフォルトの名無しさん
2022/07/10(日) 10:20:51.27ID:j6DdFbos powershellはPerlの匂いがする
俺が好きになった理由はここ
俺が好きになった理由はここ
453デフォルトの名無しさん
2022/07/10(日) 20:59:21.65ID:KsOikrPY454デフォルトの名無しさん
2022/07/10(日) 21:53:38.94ID:bG/pnkmn powershellの記号が特殊とかはあまり思わないな
それより配列の扱いがトリッキーとかの方が職人の養成が必要と思う
それより配列の扱いがトリッキーとかの方が職人の養成が必要と思う
455デフォルトの名無しさん
2022/07/10(日) 22:11:42.01ID:PiYySnCe ファイル名に[]が含まれてて苦労した人なのかなと思った
456デフォルトの名無しさん
2022/07/10(日) 22:53:56.17ID:qiFT6lHF >>453
バッチファイルとの相性が最悪なのに気づかないとは情けないよ、あんた。
バッチファイルとの相性が最悪なのに気づかないとは情けないよ、あんた。
457デフォルトの名無しさん
2022/07/10(日) 22:55:51.37ID:qiFT6lHF >>451
あらゆる言語を参考にして、いろいろ混ぜ込んで、奇妙奇天烈なものになってしまった。
あらゆる言語を参考にして、いろいろ混ぜ込んで、奇妙奇天烈なものになってしまった。
458デフォルトの名無しさん
2022/07/10(日) 23:58:19.25ID:RTsqHO1/ まあ最大の問題は、空白をトークンの区切り、改行を入力に終わりとしたことだな
459デフォルトの名無しさん
2022/07/11(月) 00:03:16.90ID:bX2QAhdS 変数のスコープが他と違うPowershellには何も期待してない
グローバル変数を更新したつもりがローカル変数と見なされたりして使い難すぎる
グローバルデータを全部.NETのコンテナに逃がしてようやく使えるようになった
グローバル変数を更新したつもりがローカル変数と見なされたりして使い難すぎる
グローバルデータを全部.NETのコンテナに逃がしてようやく使えるようになった
460デフォルトの名無しさん
2022/07/11(月) 00:04:59.61ID:vt1vW9IA ファイルや文字列の操作の構文がヘンテコすぎる
461デフォルトの名無しさん
2022/07/11(月) 01:41:49.71ID:4UtqkfgJ 超ヘンテコなJavaScriptだって一世を風靡したんだからPowershellだっていけるし(震え声
462デフォルトの名無しさん
2022/07/11(月) 03:32:17.37ID:vt1vW9IA >>461
あんたPowerShellをほどんど知らないでしょ?
あんたPowerShellをほどんど知らないでしょ?
463デフォルトの名無しさん
2022/07/11(月) 07:53:28.56ID:3aArSxtS464デフォルトの名無しさん
2022/07/11(月) 09:42:24.64ID:zwDcIdQY465デフォルトの名無しさん
2022/07/11(月) 10:44:52.35ID:KonxbxUI あんた
あのこの
なんなのさ
あのこの
なんなのさ
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で流行ってた頃だと思うんだけど大丈夫だったのか
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★3 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【ネトウヨ終了】大人気ユーチューバー「高市早苗のことをまともだと思うやつは私のコンテンツにさわらないでください」 [339712612]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 外務局長「中国さんごめんなさぁ...」小野田「中国なんかどうでもいいっ!」高市「首脳会談したい」マスコミ「立憲が悪いっ!!」 [237216734]
