- 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が立ててね!!
- 656 名前:デフォルトの名無しさん mailto:sage [2022/12/28(水) 14:16:21.29 ID:dmcJ6Qpo.net]
- ヘルプが出来が良いので何も要らない気はするけど
ハック的なモノや中でどう動いてるとかはpowershellexplained、実用的な書法はPowerShellGetで人気のあるやつ読むとか
- 657 名前:デフォルトの名無しさん mailto:sage [2022/12/28(水) 21:46:25.70 ID:D+6cXnGF.net]
- PowerShell は配列周りがトリッキーなのを除けば比較的まともな言語だと思う
- 658 名前:デフォルトの名無しさん mailto:sage [2022/12/29(木) 01:00:35.68 ID:036NTvOT.net]
- 覚え始めは Microsoft docs を探し、それでわからなければ個人の解説記事を探した
スクリプトを書くようになってからは about_ から知りたいことを追いかける事が増えた 上でも名前が上がった「PowerShell実践ガイドブック」は、ある程度できるようになってから読んだが 何もわからない状態で読むにも良いと思う 第2章までで基本的なことが身につく
- 659 名前:デフォルトの名無しさん mailto:sage [2022/12/29(木) 15:03:24.27 ID:867KtYrP.net]
- パワーシェルの勉強始めたいんですが、学習に良いサイトありませんか?
- 660 名前:デフォルトの名無しさん mailto:sage [2022/12/29(木) 16:02:07.28 ID:HWC94+Gl.net]
- >>648
実はこのスレだったりする 1つのサイト覗くよりたまにぜんぜん知らん知識が入ってくる 過去ログおすすめ
- 661 名前:デフォルトの名無しさん mailto:sage [2022/12/29(木) 16:06:45.35 ID:HWC94+Gl.net]
- あと間違った情報書く奴には必ず突っ込み入るから間違えたまま覚え事故も起き難くなる仕様だと個人的には思ってる
- 662 名前:デフォルトの名無しさん mailto:sage [2022/12/29(木) 16:17:56.35 ID:HWC94+Gl.net]
- powershell何某でぐぐって出てくる日本語の情報はなぜか間違ってたり思い込みで書かれた記事が放置されてて悲しい
情報源としてはstackoverflow辺りをまず探すのが安定 Microsoftの知りたかったことの全て系は役には立つけど知りたい事全てを補完できるわけではない
- 663 名前:デフォルトの名無しさん [2023/01/01(日) 00:27:17.84 ID:CeabMe2h.net]
- やり方が多すぎて失敗しているものだからな
- 664 名前:デフォルトの名無しさん mailto:sage [2023/01/03(火) 15:47:50.12 ID:naMqCIBL.net]
- リリース当時は学生だったからPIAをむさぼり読んでたな、楽しい本だった
挙動で間違いやすいのは(スコープを除けば)基本パイプ周りだから、 パイプ使わないスクリプトを書いてけば初手で躓く要素は少ないと思う
- 665 名前:デフォルトの名無しさん [2023/01/03(火) 21:14:49.48 ID:AaMOQNR6.net]
- >>653
シェルスクリプトを知っているのが前提だと思っていたが?
- 666 名前:デフォルトの名無しさん mailto:sage [2023/01/03(火) 21:46:27.47 ID:cXTWG1PB.net]
- パイプで間違う要素なんてあったっけ?
むしろ配列まわりの方が間違いやすい気がするが...
- 667 名前:デフォルトの名無しさん mailto:sage [2023/01/03(火) 22:10:05.90 ID:naMqCIBL.net]
- 前提は知らんけど、配列回りで間違えるのがパイプ使ってる時では?
- 668 名前:デフォルトの名無しさん mailto:sage [2023/01/03(火) 23:27:08.09 ID:cXTWG1PB.net]
- >>656
いやパイプ関係なく PowerShell の配列は色々トリッキー 例えば複数のオブジェクトを配列で返すコマンドレットが要素が1つだけだとオブジェクト自体を返したりするとか https://qiita.com/hitsumabushi845/items/fe4219ba9daa34f541c2 switch文に配列与えたら各要素を順番に適用する(要は勝手にループする)とか https://step-learn.com/article/powershell/076-switch-loop.html
- 669 名前:デフォルトの名無しさん mailto:sage [2023/01/04(水) 00:46:17.26 ID:v02S4T2G.net]
- >>657
まさに前者をパイプ周り(のための)の仕様だって認識してる カンマ演算子の使い方は知らないとできないけど、型指定しない変数に代入して原因がわからないってことはないでしょ 後者はforやforeach省略出来て便利ってだけで、トリッキーだとは思ったことないわ
- 670 名前:デフォルトの名無しさん mailto:sage [2023/01/04(水) 03:45:39.75 ID:jtN0WhrQ.net]
- switchの評価式に配列をぶち込む発想は他の言語経験有りなら起きないから無害だけど
function戻りの配列の扱いは慣れてても混乱するから特殊な事情が無い限りPSObjectや別のコンテナに入れて返す(脳死)
- 671 名前:デフォルトの名無しさん mailto:sage [2023/01/06(金) 23:20:27.35 ID:kugWcEru.net]
- どなたか助けてください。相談です。
一つのファイルに置換したい複数の数列(0.005→0.000、0.006→0.001、0.007→0.002、etc‥)が存在した場合、うまく自動で全て置換する方法はないでしょうか? 下の置換のコマンドを繰り返し使用してるのですが明らかに非効率で何かうまくできないか考えてます。 (Get-Content ファイル名) | foreach { $_ -replace "置換前","置換後" } | Set-Content ファイル名
- 672 名前:デフォルトの名無しさん [2023/01/07(土) 08:57:10.32 ID:rjY6PjFx.net]
- >>660
$hash = @{ 0.005 = 0.000; 0.006 = 0.001; 0.007 = 0.002 } $hash[0.006] とすると 0.001 が返るから、"置換後" にあたる部分を $hash["置換前"] とすればいい。 詳しくはハッシュとかハッシュテーブルでググれ
- 673 名前:デフォルトの名無しさん mailto:sage [2023/01/07(土) 14:47:12.03 ID:tZDUx9Ho.net]
- ver6.0以降だとスクリプトブロック使えるから、一応こんな感じで一度にできることはできる
"対象の数値" -replace "^[-+]?[0-9]+[.]?[0-9]*", { [decimal]$_.value - 差分の数値 } 数字の足し引きならCSVデータとかで読みこんで処理した方がいいとは思うけど
- 674 名前:デフォルトの名無しさん mailto:sage [2023/01/07(土) 15:16:28.02 ID:fgMMnpAg.net]
- >>661,662
すげー。ありがとうございます。
- 675 名前:デフォルトの名無しさん [2023/01/08(日) 03:23:42.25 ID:nZw+zsKC.net]
- 0.005を足した数値にしたいと書いてないのが不思議
質問者は聞き方がわかっていない
- 676 名前:デフォルトの名無しさん mailto:sage [2023/01/08(日) 09:53:58.06 ID:n7Qx+Bf+.net]
- ちなみに、v5でも[regex]::Replace()のMatchEvaluatorにスクリプトブロックを渡せるから
>>662より手軽さが劣るけど同様の事ができる。
- 677 名前:デフォルトの名無しさん [2023/01/09(月) 14:33:22.12 ID:2QUdKeZJ.net]
- サブディレクトリ以下の全てのファイルに対し、ゾーンIDの削除をしたいのですが、
各ファイルのゾーンIDは Get-ChildItem -Recurse -File | ?{ $_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore; } | Remove-Item -Stream Zone.Identifier; に書けばできるみたいです。 powershell の勉強のため、下記のような書き方だと、どのように書けばできるのでしょうか? $itemList = Get-ChildItem $targetFolder -Recurse; foreach($item in $itemList){ Get-Item -Stream Zone.Identifier -ErrorAction Ignore; }
- 678 名前:デフォルトの名無しさん mailto:sage [2023/01/09(月) 15:34:37.62 ID:2yNmR2Eh.net]
- >>666
こういうこと? foreach($item in $itemList){ if (Get-Item -LiteralPath $item.FullName -Stream Zone.Identifier -ErrorAction Ignore) { Remove-Item -LiteralPath $item.FullName -Stream Zone.Identifier } } もちろん$itemはLiteralPathの代わりにパイプでオブジェクトごと渡してもいいと思う
- 679 名前:デフォルトの名無しさん [2023/01/09(月) 15:52:05.35 ID:2QUdKeZJ.net]
- >>667
ありがとうございます。 勉強になりました。
- 680 名前:デフォルトの名無しさん mailto:sage [2023/01/10(火) 05:44:39.22 ID:bjV4/8ri.net]
- 例えば、Ruby で、再帰的にフォルダのサイズを求めてみると、
require 'win32ole' fso = WIN32OLE.new( 'Scripting.FileSystemObject' ) # 絶対パスのディレクトリ名の後ろに、* を付けること! # . で始まる、隠しフォルダ・ファイルを除く。 # /**/* で再帰的に、以下の全てのフォルダ・ファイルを走査する dir_path = "C:/Users/Owner/Documents/**/*" target_dirs = Dir.glob( dir_path ) .select { |full_path| File.directory?( full_path ) } # フォルダのみ .each do |folder| folder_obj = fso.GetFolder( folder ) puts File.expand_path( folder_obj.path ) # \ を、/ に変換する puts "#{ folder_obj.name } : #{ folder_obj.size }" end 出力 C:/Users/Owner/Documents/a a : 14231 C:/Users/Owner/Documents/a/b b : 4666 # next で、次の繰り返しに進む事もできるが、 # select みたいなフィルターで絞り込む方が、可読性が高い Dir.glob( dir_path ).each do |full_path| next unless File.directory?( full_path ) # フォルダだけを処理する puts full_path end
- 681 名前:デフォルトの名無しさん mailto:sage [2023/01/23(月) 12:43:06.27 ID:y+pH12Ov.net]
- Tree /fとget-childitem select-object Full name,を組み合わせたデータがほしいのですが、ご存知の方、ご教示願います。
- 682 名前:デフォルトの名無しさん mailto:sage [2023/01/23(月) 18:21:06.24 ID:g43oPRJS.net]
- >>670
名前の通り再帰処理でフォルダのツリーデータ構造を作ってから出力する事になる。 powershellの関数呼び出しは100ぐらいのネストでスタックオーバーフローするので、 ある程度動作確認が出来たら再帰処理を配列とループに変換するか、 C#なりで書き直す必要があるかも。
- 683 名前:デフォルトの名無しさん mailto:sage [2023/01/23(月) 23:52:13.30 ID:Aq+myoAC.net]
- >>670
https://www.powershellgallery.com/packages/Show-Tree/1.0.0 146行目を書き換え Write-Output ("{0}+---{1}" -f $start, ($PSDriveFullPath))
- 684 名前:670 mailto:sage [2023/01/24(火) 00:18:36.99 ID:splC6Inp.net]
- >>672
ありがとうございますm(_ _)m。できました。スクリプトの実行が無効になっているため、読み込むことができません。と出ましたが、ポリシーを変更してできました。 >>671 ありがとうございます。制限があるのですね。
- 685 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 20:31:25.08 ID:s0xdk+qH.net]
- @("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | convertfrom-string -delimiter "," | sort-object p1 -descending | convertto-csv -notypeinformation
"yyyy/MM/dd"っぽいと勝手に日付時間の形式に変換されるのですがされないようにできますか? windows10 PSVersion 5.1.19041.2364
- 686 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 21:02:50.26 ID:s0xdk+qH.net]
- @("`"2023/01/01`",`"123`"","`"2023/01/02`",`"abc`"","`"2023/01/03`",`"あいう`"") | `
convertfrom-string -delimiter "," | sort-object p1 -descending | foreach-object {"$($_.p1),$($_.p2)"} こうすれば出来たっぽいけど何かめんどくさい
- 687 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 21:55:45.34 ID:Igk1TEx9.net]
- >>674
日付でソートするならばConvertFrom-Stringによる日付処理のままDateTime型で扱うのが正しいのでは?
- 688 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 22:42:40.57 ID:s0xdk+qH.net]
- csv出力する際に "2023/01/01" が "2023/01/01 00:00:00" となるのを避けたいということです
ソート部分は別の処理をするかもしれないです わかり難くてすいません あとは tostring() で変換し直すかくらいでしょうか
- 689 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 23:16:16.35 ID:4iQ2gNuN.net]
- >>674
676 の方針で書き換え量少なめパターン @("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | convertfrom-string -delimiter "," | % { $_.P1 = $_.P1.ToShortDateString() ; $_ } | sort-object p1 -descending | convertto-csv -notypeinformation Convertfrom-String を使いつつ変換したくないという裏には深い事情がありそうだが その深い事情を無視していいなら新しくオブジェクトを作るのが楽かな @("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | %{ [PSCustomObject] @{ 'Date'=$_.split(',')[0]; 'content'=$_.split(',')[1] } }
- 690 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 23:25:37.64 ID:KpfZjU7w.net]
- 自分もConvertfrom-Stringさえ使わなければ楽だと思うが、
当初の質問通りConvertfrom-StringでDateTime型への自動変換を避ける方法、 という事なら $a = @("2023/01/01,123", "2023-01-02,abc", "2023 01 03,あいう") $t = @" {p1*:2023/01/01},{p2:123} {p1*:*},{p2:*} "@ $a | ConvertFrom-String -TemplateContent $t p1 p2 -- -- 2023/01/01 123 2023-01-02 abc 2023 01 03 あいう
- 691 名前:デフォルトの名無しさん mailto:sage [2023/02/08(水) 23:59:48.39 ID:s0xdk+qH.net]
- >>678−679
ありがとうございます、参考にさせて頂きます convertfrom-string を使っているのは前に使って動いてるからヨシッ!の精神と圧倒的な知識不足の為です
- 692 名前:674 mailto:sage [2023/02/09(木) 22:15:00.08 ID:Zgr5da8a.net]
- PSCustomObject なんて便利なものがあるんですね
おかげで Convertfrom-String も使わないで済むようになり 日付の自動変換もされなくなりました、ありがとうございました
- 693 名前:デフォルトの名無しさん [2023/02/09(木) 23:20:46.77 ID:wH9zoD6W.net]
- 本来、肩こりを和らげるマッサージの福利厚生の充実よりも、肩こりしない環境にすることが重要なわけだが、
PowerShellやってる人は、肩こりを和らげるマッサージを喜ぶ傾向が顕著
- 694 名前:デフォルトの名無しさん mailto:sage [2023/02/09(木) 23:53:02.68 ID:KDi1Xk2q.net]
- 秀逸な例えをしたと思ってそう
- 695 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 10:20:51.76 ID:UXgVE9re.net]
- 肩こりしない環境ってなんだろ
コマンドプロンプト?
- 696 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 10:29:00.89 ID:SZzF5oES.net]
- 自分の慣れてる環境のことだろ
- 697 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 10:36:58.88 ID:SshlofV9.net]
- rubyってことかもな
これを言ったのがいつも突然出てくるruby野郎だったら間違いなくrubyだと言える
- 698 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 11:52:35.79 ID:EJFy9nhI.net]
- 肩こりにはCUIはダメ
ぐいぐいするのが効くでしょう(秀逸)
- 699 名前:デフォルトの名無しさん mailto:sage [2023/02/10(金) 14:00:16.56 ID:fdH5JkI3.net]
- Ruby では「2023/01/01, 2023-01-02, 2023 01 03」の内、
最後の形式だけ、Date.parse で日付オブジェクトに変換できない 日付オブジェクトに変換せず、文字列のままソートするのが簡単 date_texts = %w(2023/01/03 2023/01/01 2023/01/02) p date_texts.sort # 日付の文字列でソート #=> ["2023/01/01", "2023/01/02", "2023/01/03"] # 要素内に空白を含むので、\ で要素内の空白をエスケープする date_texts = %w(2023/01/03\ あいう 2023/01/01\ 123 2023/01/02\ abc) p date_texts.sort # 全体の文字列でソート #=> ["2023/01/01 123", "2023/01/02 abc", "2023/01/03 あいう"]
- 700 名前:688 mailto:sage [2023/02/10(金) 14:01:04.70 ID:fdH5JkI3.net]
- Ruby で仮に、2列のCSV テキストとみなした場合でも、
sort_by で任意の列のソート順で、行をソートできる require 'csv' input = <<"EOT" 2023/01/03 あいう 2023/01/01 123 2023/01/02 abc EOT options = { col_sep:
- 701 名前: " " } # 空白区切り
p input_ary = CSV.parse( input, options ) # 2次元配列 #=> [ ["2023/01/03", "あいう"], ["2023/01/01", "123"], ["2023/01/02", "abc"] ] # 日付列でソートする p result_ary = input_ary.sort_by{ |row| row[ 0 ] }.map( &:itself ) #=> [ ["2023/01/01", "123"], ["2023/01/02", "abc"], ["2023/01/03", "あいう"] ] # 2次元配列を、CSV 文字列に変換する puts csv_str = result_ary.map( &:to_csv ).join カンマ区切りで出力 2023/01/01,123 2023/01/02,abc 2023/01/03,あいう [] - [ここ壊れてます]
- 702 名前:688 mailto:sage [2023/02/10(金) 17:56:45.48 ID:A9tz9okE.net]
- Ruby の日付オブジェクトには、数十種類の書式がある
require 'date' # デフォルトの書式は、下と同じ puts date = Date.parse( '2023/01/01' ) #=> 2023-01-01 # %F: %Y-%m-%d と同等 (ISO 8601の日付フォーマット) puts date.strftime( '%F' ) #=> 2023-01-01 # %T: 24時間制の時刻。%H:%M:%S と同等 puts date.strftime( '%F %T' ) #=> 2023-01-01 00:00:00
- 703 名前:デフォルトの名無しさん [2023/02/10(金) 21:41:15.34 ID:TDizb0jh.net]
- 目的と手段があべこべになってるって意味だよ、察しろよ
- 704 名前:デフォルトの名無しさん mailto:sage [2023/02/12(日) 21:55:38.94 ID:pO8qooq/.net]
- 確かにRubyを使うこと自体が目的になってる奴いるよな
- 705 名前:デフォルトの名無しさん mailto:sage [2023/02/18(土) 17:44:45.89 ID:WNIjE3rx.net]
- Excelを操作しようとしたら酷く遅い。
これは工夫が足りない感じ? やりたいのは3000行、100列ぐらいに関数が詰まってて、その中でエラーとなってるセルを見つけること。 関数が別のブックを参照してて、その別ブックは日々自動生成されるからその生成されかたによってはどうしてもエラーになってしまう。 VBAでも出来るけど、他と併せて考えるとPowerShell向きの処理だから、これで始めたのに。 PowerShellからVBAのプロシージャ呼び出せば、この部分の処理は一瞬だけど、それは本末転倒だし。
- 706 名前:デフォルトの名無しさん mailto:sage [2023/02/18(土) 18:06:52.69 ID:nz9Z1NDi.net]
- >>693
COMのIDispatch経由だからVBAと比較すれば当然遅くなるよ 一個一個のセルを見て回るのなんかは特に遅い powershell自体も遅いから遅さはさらに加速する ワークブックを開けてるならCOMからVBAコードを動的に流し込んで処理させた方が全然速いかもしれない CodeModule.InsertLines辺りでぐぐれば出てくると思う
- 707 名前:デフォルトの名無しさん mailto:sage [2023/02/18(土) 21:45:54.83 ID:RKENxwK/.net]
- 全セルまとめて取ればどんな言語でも早いんじゃない?
- 708 名前:デフォルトの名無しさん mailto:sage [2023/02/19(日) 01:42:49.14 ID:15y14fHP.net]
- 数式のチェックをするということならusedrange.formulaとかで二次元配列に入れてしまえば速いだろうね
- 709 名前:デフォルトの名無しさん mailto:sage [2023/02/19(日) 07:28:37.93 ID:xSIr/CQB.net]
- セルの値をチェックしたいのか数式をチェックしたいのかもわからんしそもそも既に作ってあるならその遅い部分のコード晒せばいいのに
としか思わん
- 710 名前:693 mailto:sage [2023/02/21(火) 12:34:29.62 ID:jIGEezda.net]
- PowerShellでRangeに対してforeachを使ったら糞遅かったが、Range.Cellsに対して使ったら爆速でした。
VBAで.Cellsを付けないことは無いが、PowerShellだと書き方が変わるから気付かんかった。 ソースは仕事で晒せないが、記憶を頼りに再現したのを後で書くよ。
- 711 名前:デフォルトの名無しさん mailto:sage [2023/02/21(火) 15:29:46.97 ID:y0oxbjUQ.net]
- やりたい内容によってはImportExcelとか使うといいかもしれない
- 712 名前:デフォルトの名無しさん mailto:sage [2023/02/21(火) 17:16:31.11 ID:mQxVjbPG.net]
- Excel操作は真面目にやるとCOMの参照の管理と解放が大変で避けちゃう。
完全に自分用なら雑でもいいんだけどさ。 VBScriptくらいに気楽にやらせて欲しい。
- 713 名前:デフォルトの名無しさん mailto:sage [2023/02/21(火) 18:44:18.75 ID:7Z23bFwT.net]
- あららSnoverさん去年退職しちゃったのか、、、
言語的には成熟してるし問題はないんだろうけど、残念だな
- 714 名前:デフォルトの名無しさん [2023/02/21(火) 19:36:25.83 ID:VTx8hARX.net]
- >>698
素直にExcel VBAを書いた方が安全だよ。
- 715 名前:デフォルトの名無しさん mailto:sage [2023/02/24(金) 13:12:14.11 ID:xAv3d2xt.net]
- gci -recでレジストリ検索出来るの便利だなって一昨日思った
- 716 名前:デフォルトの名無しさん mailto:sage [2023/02/27(月) 21:04:03.19 ID:5eoJ3K3o.net]
- 大規模な PowerShell モジュールは Install-Module での導入がオススメです
https://jpwinsup.github.io/blog/2023/02/27/UserInterfaceAndApps/PowerShell/PowerShell-ImportModule-FunctionOverflow/ Windows PowerShell では、 1 セッションのうち利用できる関数 (Function) の数の上限を変数 $MaximumFunctionCount にて制御しており、既定では 4096 となります。 Import-Module にて PowerShell モジュールを導入しますと、この $MaximumFunctionCount で管理する関数の数にカウントされ 4096 を超えた場合にエラーが生じます。 Install-Module では、本事象は発生しませんので、Install-Module を、ご利用いただくことを推奨いたします。 単機能のモジュールであれば、今回のような制限が生じるほど大規模な関数 (Function) 数とならないですが、クラウド製品に対し提供されるモジュールは、大規模な関数数となる傾向がございます。 クラウド製品に対する PowerShell モジュールのご利用にはインターネット (オンライン) への接続が必須となりますため、Install-Module も利用可能でございます。
- 717 名前:デフォルトの名無しさん mailto:sage [2023/02/28(火) 21:55:58.18 ID:NXRHGwBO.net]
- vscodeのプラグインどうにかしてくれないかな
せめて参照関連はちゃんとして欲しい
- 718 名前:デフォルトの名無しさん mailto:sage [2023/02/28(火) 23:08:46.00 ID:XEMkLhh3.net]
- PowerShellの構文が分からなくなったときに今話題のChatGPTで質問してみたら
的確な回答返ってきてすげぇ助かったわ。もうパソコン教室は廃業だろこれ
- 719 名前:デフォルトの名無しさん mailto:sage [2023/03/10(金) 20:16:52.26 ID:qXeg3GIX.net]
- ai のコード生成って結構すごいよね
コパイロット入れてるんだが、マジで打とうとしたコード先読みしてくる インテリセンスみたいな数文字打って残りの補完じゃなくて、まるまる予測してきて更に当たってるっていう
- 720 名前:デフォルトの名無しさん mailto:sage [2023/03/15(水) 14:42:36.44 ID:o8REigww.net]
- ここでいいですか
ttps://qiita.com/Midoliy/items/a033b763399c242dc5c5 C#をスクリプト言語として利用する方法 PowerShell 7.3.3 で、dotnet tool install -g dotnet-script を入力してもエラーになります↓ C:\Users\UserName0\AppData\Local\Temp\47744ec9-ca71-4312-b0e8-3f8bd18d5776\restore.csproj : error NU1101: パッケージ dotnet-scri pt が見つかりません。ソース Microsoft Visual Studio Offline Packages には、この ID のパッケージが存在しません。 ツール パッケージを復元できませんでした。 ツール 'dotnet-script' をインストールできませんでした。この失敗は次の原因で生じた可能性があります。 * プレビュー リリースをインストールしようとしており、--version オプションを使用してバージョンを指定しなかった。 * この名前のパッケージが見つかったが、.NET ツールではなかった。 * 恐らくインターネットの接続の問題で、必須の NuGet フィードにアクセスできない。 * ツールの名前の誤入力。 パッケージの名前付けの強制を含む他の理由については、https://aka.ms/failure-installing-tool にアクセスしてください
- 721 名前:デフォルトの名無しさん mailto:sage [2023/03/15(水) 15:33:19.80 ID:IBd2LSQO.net]
- そこ見てダメなら諦めたら
特にメリットないし
- 722 名前:デフォルトの名無しさん mailto:sage [2023/03/15(水) 21:33:00.90 ID:e2aqyp6Z.net]
- >>708
https://stackoverflow.com/questions/58012732/unable-to-find-package-no-packages-exist-with-this-id-in-source-net-core https://github.com/dotnet/sdk/issues/13429 を参考に英語のエラーメッセージでweb検索するとか。
- 723 名前:デフォルトの名無しさん mailto:sage [2023/03/17(金) 11:52:05.75 ID:1OmGmSd0.net]
- >>707
コパイロットとやらはインタラクティブシェルでも使える?興味あり gnureadlineうんこpsreadline最強と思ってたら思わぬ伏兵が… bingのchatgptが話題になってるし、標準で付いてもおかしくないけど
- 724 名前:デフォルトの名無しさん mailto:sage [2023/03/17(金) 14:15:57.93 ID:piFUHGnm.net]
- インタラクティブ(履歴)/スクリプトでもヒューリスティックにコンテキストを読んでくれるのは新しいね、もはや補完ではない気がするが
ところで-UseFussyが超便利
- 725 名前:デフォルトの名無しさん mailto:sage [2023/03/19(日) 10:19:36.25 ID:+AVX1Caz.net]
- https://www.powershellgallery.com/packages?q=Copilot
- 726 名前:デフォルトの名無しさん mailto:sage [2023/03/27(月) 09:23:21.18 ID:qNF02T37.net]
- f1で直近コマンドの、Alt-hで直近パラメータのヘルプがコマンドラインを汚さずにチラ見出来るけど
常時表示しておきたい
- 727 名前:デフォルトの名無しさん mailto:sage [2023/03/28(火) 15:38:45.60 ID:vZrgWFuJ.net]
- >>714
https://learn.microsoft.com/en-us/powershell/scripting/learn/shell/dynamic-help?view=powershell-7.4 フックされてるShowCommandHelpあたりを改造してみては
- 728 名前:デフォルトの名無しさん mailto:sage [2023/03/31(金) 09:29:33.35 ID:Hum0KYCd.net]
- コマンドプロンプトのstartコマンドのように
新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか
- 729 名前:デフォルトの名無しさん [2023/03/31(金) 10:04:55.21 ID:oEDBXBHf.net]
- Add-Type によって、自作のクラスを使う処理を書いて、一応ちゃんと動くのですが
同じことを 何度もやろうとすると 二度目以降は「The type 〜 already exists.」と出て止まってしまいます. そこで「既に そのタイプが存在しているかどうか」をチェックしたいのですが、これってどう書くんでしょうか
- 730 名前:デフォルトの名無しさん mailto:sage [2023/03/31(金) 22:12:52.48 ID:yFMegc6R.net]
- >>717
こんなん Add-Type @' public class MyClass { public void test() { } } '@ if ("MyClass" -as [type]) { "MyClass is exist" }
- 731 名前:デフォルトの名無しさん mailto:sage [2023/03/31(金) 22:21:06.75 ID:bSGiEzAG.net]
- >>716
(Start-Process -PassThru foo.exe).ProcessorAffinity = xxx xxxの所で使いたいプロセッサを指定する Start-Process -PassThru https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process#-passthru Process.ProcessorAffinity プロパティ https://learn.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.processoraffinity
- 732 名前:デフォルトの名無しさん mailto:sage [2023/03/31(金) 22:35:53.19 ID:yFMegc6R.net]
- >>719
>新しいウィンドウを作成せず という指定が抜けてね?
- 733 名前:716 mailto:sage [2023/03/31(金) 22:58:55.98 ID:Hum0KYCd.net]
- >>717
単純に try { [クラス] } catch { Add-Type 〜 } とか、知らんけど >>719 Start-Processを使わない場合のように新しいウィンドウなしで起動したいです
- 734 名前:デフォルトの名無しさん mailto:sage [2023/03/31(金) 23:29:03.95 ID:bSGiEzAG.net]
- https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process#-nonewwindow
-NoNewWindow 現在のコンソール ウィンドウで新しいプロセスを開始します。 Windows では、既定で PowerShell によって新しいウィンドウが開きます。
- 735 名前:716 mailto:sage [2023/03/31(金) 23:54:48.86 ID:Hum0KYCd.net]
- >>722
最初はそれでいいと思ったんですが、コンソールの取り合いになります (Start-Process netsh.exe -NoNewWindow とかで試すとわかりますが、くれぐれもご注意を) 取り合いにならないように -Wait も指定して (Start-Process netsh.exe -NoNewWindow -Wait -PassThuru).ProcessorAffinity = xxx とすると、-Wait が効きすぎて ProcessorAffinity をセットできないという罠
- 736 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 00:12:16.16 ID:rM0w1xSL.net]
- つまり.NETのProcessorAffinityは存在するプロセスにしか適用できないから無理でいんじゃね
知らんけどWin32APIとかで別の方法を探った方がいいんじゃね
- 737 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 00:25:58.89 ID:rM0w1xSL.net]
- たとえばWin32APIのCreateProcessにCREATE_SUSPENDEDというフラグがある
プロセスをサスペンド状態で作成してaffinity設定してからResumeThreadで開始 これでいけるんじゃね
- 738 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 03:49:24.51 ID:tD9Ph5o/.net]
- Start-Jobの中で実行したら上手いこと裏でやってくれないだろうか
- 739 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 09:42:35.62 ID:nbrNF8T0.net]
- Start-Process -NoNewWindow cmd.exe "/c start /affinity xxx /b foo.exe"
これくらいしか思い浮かばなかった
- 740 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 10:09:29.22 ID:rM0w1xSL.net]
- 定義が長くなったからこっちに貼り付けたよ
https://ideone.com/LOSuzD 使い方 bool [Win32API]::CreateProcessWithAffinity(appname, cmdline, affinity) affinityはプロセスに直接設定するAPIが見つからなかったのでGet-ProcessをResumeThread前に呼び出して指定してる サンプルはcmdを呼び出してpingをlocalhostに10回打ってる間にプロセス名とaffinity値を出してる
- 741 名前:727 mailto:sage [2023/04/01(土) 10:22:16.44 ID:nbrNF8T0.net]
- Start-Process -NoNewWindow -Wait cmd.exe "/c start /affinity xxx /b foo.exe"
こうだった
- 742 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 10:27:57.30 ID:rM0w1xSL.net]
- 寝ぼけてた。コールバックの部分下だけで良かったわ
System.Diagnostics.Process.GetProcessById(pInfo.dwProcessId).ProcessorAffinity = (IntPtr)affinity;
- 743 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 10:32:18.54 ID:rM0w1xSL.net]
- でもう一箇所、appnameに$nullを指定してもC#側型宣言で""に変換されてしまうので、CreateProcessの直前に下を追加しとくとcmdlineだけで動く
if (appname == "") { appname = null; }
- 744 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 10:52:36.56 ID:NrUMzMDg.net]
- これパイプすればいいんだよ
ポイントは () を使わないこと (Start-Process).ProcessorAffinity = xxx は NG Start-Process | ForEach-Object {} で OK (Start-Process) | ForEach-Object {} は NG & { Start-Process } | ForEach-Object {} でも OK
- 745 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 11:09:34.29 ID:rM0w1xSL.net]
- >>732
これ正解じゃない? 遠回りしたねえ
- 746 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 11:10:53.22 ID:rM0w1xSL.net]
- Start-Process cmd.exe -ArgumentList '/c echo hello world & ping 127.0.0.1 -n 10' -NoNewWindow -PassThru | %{ $_.ProcessorAffinity = 1; $_ | select Name, ProcessorAffinity }
- 747 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 14:38:06.95 ID:khXUWf7f.net]
- Start-Process cmd.exe -NoNewWindow -PassThru | % { $_.ProcessorAffinity = 1 } だと困る
Start-Process cmd.exe -NoNewWindow -PassThru -Wait | % { $_.ProcessorAffinity = 1 } か Start-Process cmd.exe -NoNewWindow -PassThru | % { $_.ProcessorAffinity = 1; Wait-Process -Id $_.Id }
- 748 名前:デフォルトの名無しさん [2023/04/01(土) 16:54:32.28 ID:SzOWT/hN.net]
- 717です. 反応してくださったかた ありがとうございました
>>718 if ("MyClass" -as [type]) → なるほど!…これでした! >>721 私も,とりあえずは try{ [MyClass] >$null } catch{ Add-Type -Path "〜.cs" >$null } で 済ませていたのですが 例外に たよる書き方は,なんとなくカッコ悪い感じがして(笑)
- 749 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 21:56:00.86 ID:sdpm0Gxz.net]
- >>716
(Start-Process -FilePath 〜〜〜 -ArgumentList 〜〜〜 -WindowStyle Hidden
- 750 名前: -PassThru).ProcessorAffinity = 1 []
- [ここ壊れてます]
- 751 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 22:32:49.48 ID:khXUWf7f.net]
- それでは Start-Process を使わない場合と違って入力も出力もできない
- 752 名前:デフォルトの名無しさん mailto:sage [2023/04/01(土) 22:58:19.34 ID:sdpm0Gxz.net]
- あ〜、
> コマンドプロンプトのstartコマンドのように > 新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか というか 新しいウィンドウを作成せず、 コマンドプロンプトのstartコマンドのように使うプロセッサを指定して起動するにはどうすれば良いですか という感じか。であればこれまでに出てた回答の方が正しいね。 ほぼ同じだけど自分なら $proc = Start-Process -FilePath 〜 -NoNewWindow -PassThru; $proc.ProcessorAffinity = 1; $proc.WaitForExit(); みたいにするかなぁ。(でもStart-Processじゃなく小回りのきくProcessStartInfoを使うかな?)
- 753 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 00:15:44.70 ID:l9+T+h5c.net]
- 質問です。
外部コマンドの標準出力やエラー出力を一緒に変数に入れたいのですが、 $result=外部コマンド.exe 2>&1 この式で一見動作はしてるようのですが、外部コマンドからエラー出力があった場合に赤い色が付き、powershell的なエラーメッセージも追加されてしまいます。 意図としては色とか追加メッセージとかは不要で、純粋に外部コマンドの標準出力やエラー出力を一緒に変数に取り込みたいだけなのですが、 そういう場合どう記述したら良いでしょうか。
- 754 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 00:47:59.12 ID:h0WbN+8B.net]
- 外部コマンドの引数が不要またはシンプルなら、
簡単で分かりやすいのはcmd上で標準出力にする方法 $result=cmd /c "外部コマンド.exe 2>&1"
- 755 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 01:46:53.77 ID:l9+T+h5c.net]
- >>741
cmd脱却を考えているので、できればpowershell流?の書き方があればお願いいたします
- 756 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 03:44:54.54 ID:byiZ93ic.net]
- >>742
Powershellでcmdを使いこなす技術を鍛えたほうが幸せになれると思うよ
|

|