[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 09/03 04:39 / Filesize : 313 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

PowerShell -Part 6



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が立ててね!!

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を使いこなす技術を鍛えたほうが幸せになれると思うよ

757 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 11:17:09.81 ID:l9+T+h5c.net]
ためしにChatGPTに質問してみたら以下の回答でした
質問「powershell上から外部コマンドを実行し、その標準出力とエラー出力を、powershellによる出力の加工を抑止した状態で1つの変数に入れたい」
$output = & <コマンド> 2>&1 | Out-String
Out-Stringは盲点でした。一応文字列として取得できているのでこれでいいのかな



758 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 11:29:33.76 ID:yOzYb5by.net]
PowerShellはあてにならないからcmdに頼ることも多いよな

Write-Host Test 1
New-Item -Path target1 -ItemType Directory
New-Item -Path junction1 -ItemType Junction -Value target1
Write-Host Test 2
New-Item -Path test2 -ItemType Directory
Push-Location -Path test2
New-Item -Path target2 -ItemType Directory
New-Item -Path junction2 -ItemType Junction -Value target2

これが失敗するなんて想像してなかった

759 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 15:23:02.64 ID:9IrG8+0n.net]
>>745
PowerShell5.1だと失敗しないな
7.3は駄目だった ターゲットのパスを絶対パスにすれば作れる

New-Item -ItemType Junction can't create relative link #18251
https://github.com/PowerShell/PowerShell/issues/18251

760 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 16:46:18.09 ID:yOzYb5by.net]
ジャンクションなら絶対パス必須でもいいけど
シンボリックリンクでは相対パスが使えないと不便

>>745 のテストをシンボリックリンクに変えてもやっぱりおかしい
ターゲットがディレクトリなのにファイルのシンボリックリンクになる
条件次第で逆にすることもできる
タイプ間違いだと補完や削除をするときに困るんだよな
だから最初からcmd.exeでmklinkしてる

761 名前:デフォルトの名無しさん mailto:sage [2023/04/02(日) 21:47:00.28 ID:9IrG8+0n.net]
Target type detection (file/directory) for relative symlinks is still broken, even on Windows #15235
https://github.com/PowerShell/PowerShell/issues/15235

これか?
2年前に立ったissueなのにまだ直ってないみたい

762 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 07:48:59.39 ID:Jr4h81FG.net]
>>739
あの〜、コマンドプロンプトのstartだと1行の
start /B /AFFINITY 1 cmd.exe
のように「新しいウィンドウを作成せず、使うプロセッサを指定して起動する」には
小回りのきくProcessStartInfoを使うとどう書くの?

763 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 08:48:40.85 ID:hrmFy8ir.net]
.NETでの普通のやり方ならググるれば出てくるよ

764 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 21:13:34.50 ID:d+sLTFCG.net]
例示ではプロセス起動・Process型オブジェクト取得にStart-Processを使ったけど
>>739は普段はProcessStartInfo使ってるってだけじゃないの。
私も引数あるときはStart-Process(-ArgumentList)避けてProcessクラス使う。

765 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 21:20:59.87 ID:9kyxsKiX.net]
PowerShellってWebスクレイピングには向いてないですか?
Pythonで作った方がいいですか?
PowerShellは職場用のスクリプトを何個か作ったりして少し分かるのですが、Pythonはまったく不慣れなので迷ってます

766 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 21:35:29.28 ID:NHigh4Tg.net]
Poweshellでちょっスクレイピング
sloppy-content.blog.jp/archives/12057529.html
【PowerShell】SeleniumモジュールでWebスクレイピングしたい
https://zenn.dev/hara_power/articles/815e3f3dc1e5655c4c22

767 名前:デフォルトの名無しさん mailto:sage [2023/04/03(月) 22:09:14.13 ID:FTaZkaBO.net]
Windowsに限ればスクレイピング以外にもブラウザに直接細工する手段が充実してるからライブラリ頼みのpythonより向いてるとも言える



768 名前:752 mailto:sage [2023/04/04(火) 10:40:01.35 ID:4xPC11r9.net]
>>753
>>754
ありがとうございます
PowerShellでやってみようと思います

769 名前:デフォルトの名無しさん mailto:sage [2023/04/08(土) 22:48:22.89 ID:wqsbQ+QM.net]
PowerShellでPersonal Communicationsを操作しようと思い
以下のサイトを参考にしようとしたのですが
https://www.tekizai.net/entry/2021/10/04/063000
64bit版のPowershellでは出来ないようです
64bit版でも動かせるように変更はできないでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<313KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef