【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>206 逆に言えば、ブラウザ検索窓で済むくらい、一行が多いって事じゃね? >>207 >>204 はそうなんだろうな でも>>202 とか俺(>>203 )は違うってだけの話 あまり仕様を理解してないせいかもしれませんが,オブジェクトのプロパティに最後のひと押しをしたい時に,よい書き方が分かりません。教えてください。 例えば chrome の プライベートメモリサイズの合計を調べたいとします >>> gps chrome | Measure-Object PM -sum ここまでは良いのですけど。 さらに総和を 1mb で割りたいとします。 果たしてもう一度パイプを通すべきなのでしょうか。 >>> gps chrome | Measure-Object PM -sum | % {$_.sum/1MB} この「パイプを通して foreach……」というのが,方法としておかしい気がするんです。 ただの考え過ぎかもしれませんが,似たようなケースで多々も同じ方法を使っていて……いつも不安になってます。 どなたかご教授いただければ幸いです。 >>209 >この「パイプを通して foreach……」というのが,方法としておかしい気がするんです。 なぜおかしいと思うの? >>209 自分もおかしくないと思うけど、パイプ使いたくないならこうすれば? (gps chrome | Measure-Object PM -sum).sum / 1mb >>210 一個しかデータが無いのが分かってるのにforeachってところじゃ無い? そこまでおかしくないということでしたら安心しました。 おかしいかというよりかは PowerShell においてこれが自然な方法かどうかが気になっていました。 プロパティを調べるにはただ obj.sum と書くのが自然な気がしたからです。そのために別の手続きを幾つか経過させるべきなのか迷っていました。 その意味では >>211 さんの方法がより良い気がします。 PowerShell では,代入文などを使って素朴に書いたほうが綺麗にできているのかもしれません。 自然だとか綺麗だとかは個人的な美学の問題ですし,PowerShell が出始めたころに出し尽くした議論だとは思いますけど……。 どうもありがとうございました! >>213 211の方法でも、さらに加工しようとするとややこしくなる 例えば文字列でMBを加えて出力しようとすると Write-Host "$((gps chrome | Measure-Object PM -sum).sum / 1mb)MB" これよりはパイプだけの方が見やすいと思う gps chrome | Measure-Object PM -sum | %{$_.sum/1MB} | %{"$($_)MB"} | Write-Host まあ変数使えよって話かもしれないけどw >>214 好みだろうけど俺は上の方がわかりやすいと感じる 俺は下の方が読みやすいな。 左から順に読み下せるってのが、パイプの性質に合ってる気がする。 まあ、好みかもな。 >>213 obj.sum的なことは$_.sumでやってるじゃん 1つの要素をForeachで回すのに違和感があるのかな? Foreachで回す時にいちいち要素数なんか考慮しないよ、要素なんてゼロの時もあるし1の時もあるし複数ある時もあるわけだし 要素が1つの時は、(hogehoge).sum と書いて、要素が2つ以上ある時は、hogehoge | %{$_.sum} と書き分ける方がおかしい よって、これは好みの問題ではなく正解は>>214 でいうところの下の書き方が正解 好みとか美学とかなんたらいう前にPowershellの流儀に従うべき、上の書き方はありえないよ、ありえない Measure-Object が複数の結果を返すなんてあり得るのか? たとえばカレントディレクトリににa.txtとb.jpg、c.jpgの3ファイルがあったとして $txt = ls *.txt と $jpg = ls *.jpg の型が違うのは気持ち悪い気はする $txt.Countとか$txt[0]とやったり、逆に$jpg.Nameとかもできるんだけど $jpg += $txtだとちゃんと追加される一方で、$txt += $jpgだとエラーになる 好みや流儀より、単純にパイプの方がメンテナンス性が優れてるよ >>214 は実際やってみると小数点以下の羅列の後に"MB"が付いて見苦しくなる でもパイプなら一部の修正だけですむ %{"$($_)MB"} を %{"{0:.00}MB" -f $_} とか、 四捨五入して %{[math]::Floor($_+0.5)} | %{"$($_)MB"} とか 214の上でこれやろうとするとカッコばかりで暗号のようになる >>220 それはまたちょっと違う問題だね その場合はこうやって強制的に配列にしろと教えられたよ $txt = @(ls *.txt) パイプの方がPowerShellらしいコードだと思う >>223 俺もそう思う とにかくパイプで処理を繋げていくのがPowerShell流 >>222 配列かスカラーか返される物が状況によって変わる気持ち悪さは昔からあちこちで散々言われてるね >>221 暗号ねぇ w Write-Host ("{0:0.00}MB" -f (gps chrome | Measure-Object PM -sum).sum / 1mb)) ちなみに書式変換時は元々四捨五入なのでFloorとかは要らんよ >>225 配列を便利に扱えるようにしてるのはわかるけどちょっとやり過ぎかな -eq 演算子なんてトラップ以外の何者でもないだろ あと全然関係ないけど -isnull 演算子が欲しい >>226 [int]だけで四捨五入になるのは知ってるけど、分かりやすくした 暗号は言い過ぎたかもしれんが、そんなん書くより一度変数に入れたくならんか?w >>226 つか、カッコ一つ足らないw あんた自身混乱してるわ >>228 > そんなん書くより一度変数に入れたくならんか?w この程度でなるか? って話 程度は人によって違うからまあ好きにしなよ >>229 スマホから書き込んでるから細かいところは目を瞑ってくれ 課長 「SumをMBで出してくれ」 A君 "{0:0.00}MB" -f ((gps chrome | Measure-Object PM -sum).sum / 1mb) B君 gps chrome | Measure-Object PM -sum | %{[String]::format("{0:0.00}MB", $_.sum/1mb)} 課長 「すばらしい! じゃあついでにMax値とMin値もMBで出してちょうだい」 A君 「ぐぬぬ・・・」 B君 gps chrome | Measure-Object PM -sum -Maximum -Minimum | %{[String]::format("Sum: {0:0.00}MB`nMax: {1:0.00}MB`nMin: {2:0.00}MB", ($_.sum, $_.maximum, $_.minimum | %{$_/1mb}) )} 明美 「きゃーB君ステキ ブッチュー」 C君 gps chrome | Measure-Object PM -sum -Maximum -Minimum | %{$_.sum, $_.maximum, $_.minimum | %{$_/1mb}} | %{"{0:0.00}MB" -f $_} 明美 「キャー 抱いてぇー」 自分ならこうするかな 一行で書かなきゃいけないルールでもあるのか、その会社は gps vivaldi | Measure-Object PM -sum -Maximum -Minimum| %{ foreach($i in 'Sum','Maximum','Minimum'){ "{0}: {1:0.00}MB" -f $i.Substring(0,3),($_.$i/1mb) } } 多少は実用的なやつを。サブスレッドも合計してメモリ食ってるアプリのトップ3 Get-Process|Group Name|%{$_|Add-Member Length ($_.group|measure PM -Sum|%{$_.sum}) -PassThru}| sort length -Descending|select -First 3|%{'{0}: {1:#,0.}MB'-f $_.name,($_.length/1mb)} 初心者ですが質問です ISEでデバックした時とスクリプトで実行した時で GUI?の見た目が違うのですが(スクリプト実行だとGUIが古い感じ) デバックしてる時と同じGUIにするにはどうすれば良いのでしょうか? 「マイクロソフト社製の基本ソフトを使うパソコン に搭載されたシステム管理機能パワーシェル(PS)を操る(中略) ファイルレス攻撃は、実行形式でないLNKなど別の拡張子のファイルが添付されている。 ウイルスの本体ではないため、単体では情報収集などの目的を果たせないが、 PSに命令する不正プログラムが含まれている(中略) ウイルスを勝手にダウンロード(中略) 自分の存在を隠す」 「ファイルレス」見えないサイバー攻撃急増 政府・金融機関など標的(1/3ページ) - 産経ニュース http://www.sankei.com/affairs/news/170820/afr1708200002-n1.html 2017.8.20 06:38 >>237 スクリプトで実行って関連付けで実行ってこと? ISEとはUIが別ものだと思うけど >>237 ISEに関連付けするってことかな おもすぎるしやったことないけど >>240 レスありがとうございます https://letspowershell.blogspot.jp/2015/07/powershell_9.html こちらのブログで質問させて頂きまして無事解決しました [System.Windows.Forms.Application]::EnableVisualStyles(); を追加して無事デバッグと同じフォームになりました 質問です set-location でパスを入力する時、日本語が含まれていると文字化けしてしまい 「Set-Location : パス 'C:\Users\nashi\Desktop\SHO\PDF 繧「繝励Μ' が存在しないため検出できません。」 と言われてしまいます。 バッチファイル?からではなく、powershellに直接入力した時は起こらないのですが どうしても回避する方法がわかりません。 どなたか分からないでしょうか。 画面のスナップショットをF9キー辺りに割り当てて、 キーを押す度に連番ファイルとして保存したいんだけど powershellで簡単にできたりする? ps1ファイルの関連付けとか弄らずに、ダブルクリックで実行させたい場合って wscriptのrunとかから呼ぶのが一般的ですか?(ファイルが2つになってしまう感じですか?) >>249 コンソール窓が一瞬出るのが嫌なのでwscriptから呼んでます >>248 ExecutionPolicyも指定してラップできるから便利だね ShellExecuteでrunas指定すれば管理権限で実行もできるし powershell.exeショートカットにオプション直書きで十分 PSをダブルクリックで実行できれば便利だが つねにそれが良いとは限らない 書きかけのバッチをうっかり実行して データやマシンがおかしくなる場合もありえる >>253 そんなレベルの人は他のことをしていてください。 だいたい間違って実行してしまわないようにクリックで実行できないようになっているというのに。 batもWSHもできるのにps1だけ対応しない理由はなんだろね ポリシーなんてどうとでもなるのに >>252 ショートカットって記述的じゃないから嫌なんだよね ショートカット作っても2ファイルだし、 それなら初めからwscriptから起動するよ 記述的じゃないってのはちと違うか。 テキストベースで完結しないって意味ね >>254 いろんな事態を想定できない方がレベルが低いよ >>256 普通のプログラミング言語のソースは 直接実行できないでしょ >>257 記述的というならコマンドラインは記述的で良い 今のところ右クリック→実行してもらうのが安全性からも利便性からもバランスが良い Powershellのスクリプトは部品だからどっかから呼ぶのでいいんだよ 単体起動するようなもんじゃないね >>259 たぶん、右クリックで表示される「Powershellで実行」という項目を見ないで 電話してくれるユーザーへの対応の話だと思う ダブルクリックしたらなんか開いたふざけんな、実行しない、バグだ、と内線で…… とりあえず関数切ったら引数に , つけるのか付けないのかは統一してほしい気分…… たまに間違う(function定義のほうだと , いるやん) まぁbashとかでも似たようなもんで、俺の練度の問題かも知らんが ダブルクリックだけで実行されて、システムが故障したら、 損害賠償しなければならない そもそも、ダブルクリックだけで、スクリプトが実行されたら、 極めて危険だから、納品の基準を満たしていないし、損害賠償が確実 実行して危険なモノならpsじゃなくても確認手段ぐらいその中に入れとくでしょ 前提がおかしいと思う クリックで誤って実行してしまう点がよくないとマイクロソフトも思ったからクリックで実行できないようにさてるんだけどな。 負荷テストのために下記コードを書いて見ましたがこれって音は全部鳴ってるのかな? # 下記サイトより効果音をお借りしました。 # http://maoudamashii.jokersounds.com/archives/se_maoudamashii_explosion06.html # d:\indexフォルダは好きなように変更してください。 $loopcont = 128 $list = New-Object 'System.Collections.Generic.List[System.Media.SoundPlayer]' for ($i=0; $i -lt $loopcont; $i++){ $a = New-Object Media.SoundPlayer("d:\Index\se_maoudamashii_explosion06.wav") $list.Add($a) #$list[$i] = New-Object Media.SoundPlayer("d:\Index\se_maoudamashii_explosion06.wav") Write-Output "サウンド $i を追加しました。" } for ($i=0; $i -lt $loopcont; $i++){ $list[$i].PlayLooping() Write-Output "サウンド $i を再生しました。" Start-Sleep -m 10 } Start-Sleep -s 15 for ($i=0; $i -lt $loopcont; $i++){ $list[$i].Stop() Write-Output "サウンド $i を停止しました。" } Start-Sleep -s 5 初心者ですが教えてください WIN32APIの GetFileInformationByHandle をPSから呼ぶにはどうしたら良いですか やりたいことはハードリンクを考慮したディスク使用量計算です powershellでお手軽にwebapi実装するツールって無いか? C# AspNet WebApiで作るほどの物じゃない 短期間の使い捨てのちょっとしたローカルサービス リクエスト受けたらurlにマッピングされたps1ファイルを実行するとかで十分なんだけど >>275 ASP.NET Coreならめちゃめちゃお手軽だと思うけど Windows 10 Fall Creators Update になってから $PSHOMEのpowershell.exe.configの編集ができないみたいだがどうすりゃいいの powershell.exe.configの所有がTrustedInstallerだから管理者でも編集できない なんでそんなことになった レジストリに書く環境変数設定 setx 変数 値 は問題ないが消す時の setx 変数 "" がなぜか設定できない やり方あるの? もちろんコマンドプロンプトからはできる ありゃcmdからsetx 変数 ""やっても消えとらんな まあpowershell関係ないからいいや "a[1-5]"とかでa1〜a5がヒットするどうでもいい機能のせいで 無駄に面倒くさくなったのどう考えても失敗だわ 角括弧なんてパスで割りと使う文字なのに C#で作ったコンソールアプリのexeをクリックしたらコマンドプロントが開くけど 代わりにpowershellで開けないの? 単純にcmdプロンプトのウインドウを開きたいだけでいいなら star cmd コマンドプロンプトを開きたいとしか読めない。 質問を見ると、コマンドプロンプトを出さないようにしたいという 意味にはなってないし。 なんなんでしょ? ああごめん、わかった。 単にexeを実行したいってことね。 start xxx.exe これでいいんじゃない? >>285 C#アプリ側でpowershell上で実行するように変更するか、スクリプトなりショートカットファイルなり使ってpowershell経由で呼べば良いんじゃないかな? 例えばショートカットのリンク先に powershell.exe -noexit C#アプリ.exe とか。 ※powershellのフルパスは自動的に補完されると思うけど、C#アプリはフルパスで記入した方が良いよ。 >>285 C#とかのコンソールアプリは別にcmdが裏で動いてたりするわけじゃないよ powershellも色が付いた単なるコンソールアプリだよ そのアプリの中で、cmd というコマンドを使っていれば、コマンドプロンプト、 powershell というコマンドを使っていれば、PowerShell が起動する コマンドプロンプトで、powershell と打てば、PowerShell に、 PowerShell で、cmd と打てば、コマンドプロンプトが起動する いわゆるDOS窓はConsoleAPIを使って生成していて それに対してstdin/outで読み書きしてれば 自作のコンソールアプリ,cmd,powershell等のコンソールアプリ間で相互に呼び出して繋げられるようになっている Console Functions - Windows Console | Microsoft Docs https://docs.microsoft.com/en-us/windows/console/console-functions c#のcsi.exeで実行するスクリプトってすごい便利だな知らんかったこれ たしかにC#のスクリプトはお手軽さはないがなんでもできるんだよなあ ちょっと手のこんだことだとC#のほうが楽 inputboxはC#にないからpowershellからのほうが楽なのねなるほど >>300 今後の問題ってのがWPFにもFormにもあるけど、 わたしゃ、DesktopではPowerShell+WPFでガンガン 作ってますよ。 xamlで書いて。 PowerShell+WPFなめてたけど おもったより簡単に書けるな だがPoserShell窓消せないのでC#でexeにしたほうがいいっぽい >>302 スゲー便利よ。WPF表示関数化してる。 VSでデザインした時も、デザイナーのオブジェクトのNameをそのまま PowerShellの変数で使用できるようにしちゃってるんで、すげー開発 効率高い。ちなみにその関数も20行くらいのもの。 デザインしたら、そのままPowerShellのデータとバインドして表示。 ジャグ配列を返す関数を作ったのですが、ルートの要素が1個の時に戻り値がおかしくなります ルートの要素が2個以上の場合は起きません。どうしてででしょうか 以下再現コード function test_jag_array() { $jag = ,@(@("abc", "def", "ghi", @("jkl", "mno", "pqr", "stu"))) foreach($x in $jag) { [void]("func " + $x[0] + " " + $x[1] | Out-Host) for ($i = 3; $i -lt $x.length; $i++) { $a= $x[$i][0]; $b= $x[$i][1]; $c= $x[$i][2]; $d= $x[$i][3] [void]("func " + "a:" + $a + " b:" + $b + " c:" + $c + " d:" + $d | Out-Host) } } return $jag } $jag = test_jag_array foreach($x in $jag) { [void]("res " + $x[0] + " " + $x[1] | Out-Host) for ($i = 3; $i -lt $x.length; $i++) { $a= $x[$i][0]; $b= $x[$i][1]; $c= $x[$i][2]; $d= $x[$i][3] [void]("res " + "a:" + $a + " b:" + $b + " c:" + $c + " d:" + $d | Out-Host) } } 上の実行結果 func abc def ←期待する結果 func a:jkl b:mno c:pqr d:stu ←期待する結果 res a b ←なんじゃこれ・・・ res d e ←なんじゃこれ・・・ res g h ←なんじゃこれ・・・ res jkl mno ←なんじゃこれ・・・ res a:s b:t c:u d: ←なんじゃこれ・・・ ↑をルート要素2で試す場合は$jagを以下に変えてください。 $jag = ,@(@("abc", "def", "ghi", @("jkl", "mno", "pqr", "stu")), ` @("abc", "def", "ghi", @("jkl", "mno", "pqr", "stu"))) 要素1を回避するコードを加えて一応この問題は解決はしてますが、バグの特定で1日潰れました。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる