PowerShell -Part 3
■ このスレッドは過去ログ倉庫に格納されています
シェル芸ならこんなところ
seq 100|sed 's/.*5$/Buzz/;3~3s/[0-9]*/Fizz/' 知恵を絞って短縮コードを目指すから、理解容易ではないのはまあ仕方ない 3.0からの文法でできるならだれか思いついてそうだったけど検索しても出てこないな
Anarchy GolfにはPowerShell無いし、StackExchangeで58byte、牟田口氏のコードで51byte
いろいろテクニックが載ってて面白い
what is your fave PoSh version of FizzBuzz? : PowerShell
https://www.reddit.com/r/PowerShell/comments/6r06hg/what_is_your_fave_posh_version_of_fizzbuzz/
code golf - Tips for golfing in PowerShell - Programming Puzzles & Code Golf Stack Exchange
https://codegolf.stackexchange.com/questions/191/tips-for-golfing-in-powershell?page=2&tab=votes#tab-top ISEは問題ないのに、普通のシェルがダメって何年放置されてるのだろう? VSCodeでPowershellの色寂しくなった >>212
6.0はOKで6.1がだめと書かれてる
6.1が出たのは2か月前じゃないの >>208はデスクトップ版Powershellの話Win10が出て3年かな オプションを展開させるうまい方法ってありますか?
たとえば、-WhatIfを付ける/付けないを場合分けしたいときなど。
HogeCmd fuga piyo $whatif
とやると、$whatifは普通の引数になってしまうのでNG。
eval方式(コマンド全体を文字列にしてInvoke-Expressionで呼び出す)もあるけれど、
できれば、オプションのところだけうまいこと展開できればいいな、と。 >>216
横からだが、スプラッティングというものを初めて知って非常に参考になった。ありがとう。 >>221
よせよ
バケラッタを連呼する某アニメキャラを連想しちゃっただろ 実行ユーザーがSYSTEMな場合の
COMオブジェクト利用がうまくいかないのは回避策ないでしょうか 資格情報・認証とか?
「powershell 資格情報」で検索して >>225
excelとか使うとき普通に使えてるけど
何かうまくいことがあるの? >>229
普通の使い方してたらSYSTEMなんかで動かすことはないからサービスとかで動かしたいとかなんだろうと思う
いずれにせよ状況小出しにする奴の相手してもしょうがない タスクスケジューラで動かしたいのかも。いずれにせよ具体例を書いて欲しいものだ >>221
スプラッターハウス以外思い浮かばないw WindowsCompatibilityモジュール試してみたけどFormat-table用の情報とか無いから一部コマンドレットの表示が微妙
いちいちモジュール読み込まんとダメだし >>233
Fomat-Table、モジュールなしだと使えなかったの? >>234
いや、そこまでの問題じゃない
Format-Tableで優先表示するプロパティ情報がないだけ
Format-Tableしても要らんプロパティがでてきたりする
Select-objectとかしてあげれば問題ないよ 暗黙のWrite-Host|ft
が効かず、明示的に書かんどダメな感じ? Effective PowerShell的な本ってないの?
普段、使う分には問題なく使えてると思う
でもより上手い書き方があるのでは、良いコーディング習慣を守れてるだろうか、と自問自答すると自信を持てない
人に見せるものでもなく、人のを見る機会もないからどうしても自己流になってしまう 文法詳説はこの前出た貝殻本が扱ってたけど
読みにくい(演算子の説明が130ページくらいから始まる) バイナリモジュールの情報少ないよなあ
github漁ってもあんまりないし
コマンドレット内でGet-Item呼び出す方法探すだけでだいぶ苦労した
結局ダサいやり方になったけど powershell深いなあ。深すぎてちょっと目眩する時がある get-netadapterとか見たいに複数の結果を返すようなクラスが作りたいんだけど
どんな感じで書けばいいん?
思い浮かばねえorz >>243
Function内でWrite-outputでクラスを複数回出力するとか
クラスの配列を返せばいいよ >>244
ちと理解できてない
例えば、get-netadapterの内容を編集して結果をだすクラスを作るとして
インプットが複数なのでそれを都度かえしていくってことでいいのかな? >>245
まず作りたいのはクラスじゃなくてFunction(関数)かメソッドかコマンドレット(外部関数)だよね?
クラスは型であって入力と出力を持つものでは無いし
Get-netadapterも含めて一般的なコマンドレットの出力型は配列で
配列の各要素がクラスになってる
Get-netadapterの結果に編集を加える場合、
入力された値をforeach等で分解して
クラスにAdd-member等で要素(プロパティとか)を加えて毎回出力するとかする
もしくは配列の各要素がPSCustomObjectクラスの変数を作って
それを出力するとかする
サンプルに丁度よい関数とかあればいいけど一端探すのめんどいから割愛
Add-memberとかクラスのメンバーについてはググって調べて下さいな この手の話題でクラスとインスタンスの区別をせずに語られるとすごくモヤモヤする PSVersion 5.1.17763.134
PSEdition Desktop
で Windows.Forms.Timer がちゃんと動いてくれぬ
Tickイベント内の変数の変更を保持してくれない? 途中で切れてしまった
コンストラクタに引数設定できるでしょ
その引数にget-netadapterの結果みたいなのを使う
で、その値で各プロパティの初期値みたいなのをセット
各引数付きのメソッドを実行すると、引数とプロパティを処理した結果を返すんだけども
get-netadapterみたいに複数がコンストラクタのインプットになるから、どうしたもんかと
やっぱ、無理なのかな UTF-8を標準出力に出力するexeの結果を処理したいのですが
特定の文字が入っていると文字コード変換に失敗します
例えば以下の文字列はこのように文字化けします
「ホスト#01」⇒「ホスチE01」
「ホスト02」⇒「ホスチE2」
正しくPowerShellで扱える文字列に直す方法をアドバイスいただけないでしょうか
## ソース
$src = [System.Text.Encoding]::UTF8
$dst = [System.Text.Encoding]::Default
$test = & 'C:\test\UTF8.exe'
$bytes = $dst.GetBytes($test)
$result = $dst.GetString([System.Text.Encoding]::Convert($src,$dst,$bytes))
UTF-8を標準出力に出力するサンプルexe(C#)
Console.OutputEncoding = new UTF8Encoding();
Console.WriteLine("ホスト#01\r\nホスト02"); >UTF-8を標準出力
でぐぐったら
>これで、UTF-8 を使うアプリとの連携もばっちりだ。
そうだ >>251
PowerShellの内部でのエンコードはたしかUTF16じゃないかな >>252
このスレに書き込んで説明するために標準出力って持ってきたのですが
ググってるときは標準出力って思いつかずサイトに巡りあえませんでした
おかげでなんとかなりそうです
ありがとう
>>253
UTF16だという情報もみて変えてみたりもしたのですが、
余計文字化けがひどくなったのでどう対応すべきか悩んでました 文字コードなど、考えたこともない。
UTF-8 しか使わないし
どのOS・アプリでも内部的には、UTF-16 だろうけど、これを扱うことなどない PowerShellの変数ってちゃんと型指定したほうがいいの? パフォーマンス気にして型変換するなら、Powershell使うこと自体が不適
通常は勝手に型変換しないように型付ける
v3のビットシフト演算子が勝手にbyte型をint型にキャストするのマジ糞 powershellにintegral promotionは定義されてないのか 未だにバッチをメインで使っている
ぼちぼちPowerShellメインに変えようかと思っているんだが
WSHもどうか?とおもったり
もうWSHは終わりで、PowerShellが延びると思っていて良い? VBScriptはちょっとオワコン感出てきたけど、WSH自体はJavaScriptがデフォルトで使えるのでしぶとく残りそう >>261
標準で備わってる機能面でwshはPowershellに比べて貧弱だよ
Powershellだとcsv読み込むとかjson処理するとかコマンドレットで用意されてるけどwshだとそれなりのコード書かないと出来ないし
ループ周りもパイプラインに比べると冗長になりがち
ただwshの方がシンプルで学習は楽、Powershellは複雑な部分が多い
学習コストはPythonより高い気がする PowershellはMS系クラウドサービスの管理シェルとして伸びるかな
バッチもwshも消えなそうだけど今後の伸びは無さそう 手を広げ過ぎて仕様が複雑というより単に雑な印象がある 学習コスト高いというか体系的にまとまった書籍等無いからよくわからずに動く状態になる(配列とか)
Pythonのようにすんなり上達するのではなくて、ある程度学ぶとかえってわからなくなるの繰り返し
それでも今更wshやるよりはいいはず PowerShellだと学習コストは高いけど
よく使うコマンドレットがそろってる
WSHだとJavaScriptで書けるけど
自作ライブラリみたいの書く手間はある
微妙な勝負だけど今から始めるならもう
Poshを使ってしまった方が良いと思う >>262
いやちょっとどころじゃねーだろ
いつの時代の話してるんだか 未だにバッチでこと足りてしまう管理業務というのが想像できない。 VBSはバリバリ現役よ
うちの社内システム開発・運用は全てVBS
無料であり
バッチファイルより遥かに強力で
仕様が枯れていてVerUPに振り回されることがなく
Javaのように一企業の思惑でライセンス問題が発生することもない神言語
PowerShellはerUPが止まり仕様が枯れるまでは採用しない >>270
WIN10のストアアプリの削除もVBSで出来るの? Win7はあと1年ちょいでサポート終了だしな
その後はWin10のPowershell5.1で標準化するでしょ
今のPowershellは2.0が残ってるのがガンになってる気がする >>270
Windows PowerShellはとっくにバージョンアップ止まってるんだが何が不満なんだ >>270
5.1がWinにおける最終バージョンだろ 5.1だと正常に動かなくて
v2オプジョンだとちゃんと動くのとかあるし… JP1のSPTファイルもぶっちゃけVBSみたいなもんだよね >>273
win7 はたぶん終了にならないと思います、win10 がクソすぎるからね >>280
神OS(笑)XPの時も似たような話聞いたわ Win7はデフォでv2.0しか使えないからこのスレ的にはダメダメ 有償で延長サポートの話が出てる以上
それ以外はバッサリ終了に決まってるでしょ >>285
なるほどね。仕事内容や立場により、いろいろあるわけね。 これが5.1だとちゃんと動かねぇ
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
function ShowInfoMain{
$counter = 0
$timerTestTick = {
$label_timer.Text = "{0} 秒" -f $counter++
}
#タイマーの初期化
$timerTest = New-Object Windows.Forms.Timer
$timerTest.Add_Tick($timerTestTick)
$timerTest.Interval = 1000
$timerTest.Enabled = $TRUE
$timerTest.Start()
#フォーム
$Form = New-Object System.Windows.Forms.Form
$Form.Size = "100,100"
$Form.StartPosition = "CenterScreen"
#タイマー
$label_timer = New-Object System.Windows.Forms.Label
$label_timer.Text = '0 秒'
$Form.Controls.Add($label_timer)
$result = $Form.Showdialog()
$timerTest.Dispose()
$Form.Dispose()
}
. ShowInfoMain $counter = 0
$label_timer = New-Object System.Windows.Forms.Label
$timerTestTick = {
$label_timer.Text = "{0} 秒" -f $script:counter++
} 順序関係なく単純に $script:counter++にするだけでいいみたいやね んがー
スクリプトブロックでのスコープによるものって
認識でよろしいのだろうか…
2.0だと動くのはなんでなのじゃ >>289
ありがとうございました
初期値の宣言でもやんないとダメみたい
$script:counter = 10 PowerShell 3.0での破壊的変更まとめ
https://blog.shibata.tech/entry/2018/12/01/113228
デリゲート代わりに使われるスクリプトブロックのスコープ
PowerShell 3.0からデリゲート代わりに使われるスクリプトブロックが独自のスコープを持つようになっています。
たとえば以下の様な例だとPowerShell 2.0では1を、PowerShell 3.0からは0を返す様になります。
Add-Type @"
public class Invoker
{
public static void Invoke(System.Action<int> func)
{
func(1);
}
}
"@
$a = 0
[Invoker]::Invoke({$a = 1})
$a 新しいpowershell では、Get-Clipboard で、クリップボードから文字列も取得できる! >>295
powershellは.netのフロントエンドだから そういう問題じゃないが・・・
支障がない場合はそんまま使うわあほくさ 5ch の文章を、テキストエディタへコピペすると、
各行の先頭・末尾に、空白が付くので、これを除去したい
そこで、Ruby でプログラムを作って、
バッチファイルで、そのプログラムをダブルクリックで起動できるようにした
Windows で、クリップボード内の複数行文字列の、各行の先頭・末尾から、
連続する空白類を除去して、クリップボードに入れる
新しいpowershell では、クリップボードから文字列も取得できる
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換
ary = str.each_line.map( &:strip )
IO.popen( 'clip', 'w:cp932' ) do | clip |
clip.print( ary.join "\n" )
end Get-Clipboardの機能は2015年からあるがどう新しいのか Ruby挟む意味ないじゃん?バッチも画面が目ざわりだしvbsがいいよ
CreateObject("WScript.Shell").Run "powershell ""gcb | % trim | scb""", 0 ■ このスレッドは過去ログ倉庫に格納されています