【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>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日潰れました。 ■ このスレッドは過去ログ倉庫に格納されています