X

PowerShell -Part 6

■ このスレッドは過去ログ倉庫に格納されています
2022/02/13(日) 18:36:12.07ID:LaQ04ZoE
前スレ
PowerShell -Part 5
https://mevius.5ch.net/test/read.cgi/tech/1615994992/

次スレは>>980が立ててね!!
2023/01/07(土) 15:16:28.02ID:fgMMnpAg
>>661,662
すげー。ありがとうございます。
664デフォルトの名無しさん
垢版 |
2023/01/08(日) 03:23:42.25ID:nZw+zsKC
0.005を足した数値にしたいと書いてないのが不思議

質問者は聞き方がわかっていない
2023/01/08(日) 09:53:58.06ID:n7Qx+Bf+
ちなみに、v5でも[regex]::Replace()のMatchEvaluatorにスクリプトブロックを渡せるから
>>662より手軽さが劣るけど同様の事ができる。
666デフォルトの名無しさん
垢版 |
2023/01/09(月) 14:33:22.12ID:2QUdKeZJ
サブディレクトリ以下の全てのファイルに対し、ゾーン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;
}
2023/01/09(月) 15:34:37.62ID:2yNmR2Eh
>>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の代わりにパイプでオブジェクトごと渡してもいいと思う
668デフォルトの名無しさん
垢版 |
2023/01/09(月) 15:52:05.35ID:2QUdKeZJ
>>667
ありがとうございます。
勉強になりました。
2023/01/10(火) 05:44:39.22ID:bjV4/8ri
例えば、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
2023/01/23(月) 12:43:06.27ID:y+pH12Ov
Tree /fとget-childitem select-object Full name,を組み合わせたデータがほしいのですが、ご存知の方、ご教示願います。
2023/01/23(月) 18:21:06.24ID:g43oPRJS
>>670
名前の通り再帰処理でフォルダのツリーデータ構造を作ってから出力する事になる。
powershellの関数呼び出しは100ぐらいのネストでスタックオーバーフローするので、
ある程度動作確認が出来たら再帰処理を配列とループに変換するか、
C#なりで書き直す必要があるかも。
2023/01/23(月) 23:52:13.30ID:Aq+myoAC
>>670
https://www.powershellgallery.com/packages/Show-Tree/1.0.0
146行目を書き換え Write-Output ("{0}+---{1}" -f $start, ($PSDriveFullPath))
673670
垢版 |
2023/01/24(火) 00:18:36.99ID:splC6Inp
>>672
ありがとうございますm(_ _)m。できました。スクリプトの実行が無効になっているため、読み込むことができません。と出ましたが、ポリシーを変更してできました。
>>671
ありがとうございます。制限があるのですね。
2023/02/08(水) 20:31:25.08ID:s0xdk+qH
@("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
2023/02/08(水) 21:02:50.26ID:s0xdk+qH
@("`"2023/01/01`",`"123`"","`"2023/01/02`",`"abc`"","`"2023/01/03`",`"あいう`"") | `
convertfrom-string -delimiter "," | sort-object p1 -descending | foreach-object {"$($_.p1),$($_.p2)"}
こうすれば出来たっぽいけど何かめんどくさい
2023/02/08(水) 21:55:45.34ID:Igk1TEx9
>>674
日付でソートするならばConvertFrom-Stringによる日付処理のままDateTime型で扱うのが正しいのでは?
2023/02/08(水) 22:42:40.57ID:s0xdk+qH
csv出力する際に "2023/01/01" が "2023/01/01 00:00:00" となるのを避けたいということです
ソート部分は別の処理をするかもしれないです
わかり難くてすいません
あとは tostring() で変換し直すかくらいでしょうか
2023/02/08(水) 23:16:16.35ID:4iQ2gNuN
>>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] } }
2023/02/08(水) 23:25:37.64ID:KpfZjU7w
自分も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 あいう
2023/02/08(水) 23:59:48.39ID:s0xdk+qH
>>678−679
ありがとうございます、参考にさせて頂きます
convertfrom-string を使っているのは前に使って動いてるからヨシッ!の精神と圧倒的な知識不足の為です
681674
垢版 |
2023/02/09(木) 22:15:00.08ID:Zgr5da8a
PSCustomObject なんて便利なものがあるんですね
おかげで Convertfrom-String も使わないで済むようになり
日付の自動変換もされなくなりました、ありがとうございました
682デフォルトの名無しさん
垢版 |
2023/02/09(木) 23:20:46.77ID:wH9zoD6W
本来、肩こりを和らげるマッサージの福利厚生の充実よりも、肩こりしない環境にすることが重要なわけだが、
PowerShellやってる人は、肩こりを和らげるマッサージを喜ぶ傾向が顕著
2023/02/09(木) 23:53:02.68ID:KDi1Xk2q
秀逸な例えをしたと思ってそう
2023/02/10(金) 10:20:51.76ID:UXgVE9re
肩こりしない環境ってなんだろ
コマンドプロンプト?
2023/02/10(金) 10:29:00.89ID:SZzF5oES
自分の慣れてる環境のことだろ
2023/02/10(金) 10:36:58.88ID:SshlofV9
rubyってことかもな
これを言ったのがいつも突然出てくるruby野郎だったら間違いなくrubyだと言える
2023/02/10(金) 11:52:35.79ID:EJFy9nhI
肩こりにはCUIはダメ
ぐいぐいするのが効くでしょう(秀逸)
2023/02/10(金) 14:00:16.56ID:fdH5JkI3
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 あいう"]
689688
垢版 |
2023/02/10(金) 14:01:04.70ID:fdH5JkI3
Ruby で仮に、2列のCSV テキストとみなした場合でも、
sort_by で任意の列のソート順で、行をソートできる

require 'csv'

input = <<"EOT"
2023/01/03 あいう
2023/01/01 123
2023/01/02 abc
EOT

options = { col_sep: " " } # 空白区切り

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,あいう
690688
垢版 |
2023/02/10(金) 17:56:45.48ID:A9tz9okE
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
691デフォルトの名無しさん
垢版 |
2023/02/10(金) 21:41:15.34ID:TDizb0jh
目的と手段があべこべになってるって意味だよ、察しろよ
2023/02/12(日) 21:55:38.94ID:pO8qooq/
確かにRubyを使うこと自体が目的になってる奴いるよな
2023/02/18(土) 17:44:45.89ID:WNIjE3rx
Excelを操作しようとしたら酷く遅い。
これは工夫が足りない感じ?

やりたいのは3000行、100列ぐらいに関数が詰まってて、その中でエラーとなってるセルを見つけること。
関数が別のブックを参照してて、その別ブックは日々自動生成されるからその生成されかたによってはどうしてもエラーになってしまう。

VBAでも出来るけど、他と併せて考えるとPowerShell向きの処理だから、これで始めたのに。
PowerShellからVBAのプロシージャ呼び出せば、この部分の処理は一瞬だけど、それは本末転倒だし。
2023/02/18(土) 18:06:52.69ID:nz9Z1NDi
>>693
COMのIDispatch経由だからVBAと比較すれば当然遅くなるよ
一個一個のセルを見て回るのなんかは特に遅い
powershell自体も遅いから遅さはさらに加速する
ワークブックを開けてるならCOMからVBAコードを動的に流し込んで処理させた方が全然速いかもしれない
CodeModule.InsertLines辺りでぐぐれば出てくると思う
2023/02/18(土) 21:45:54.83ID:RKENxwK/
全セルまとめて取ればどんな言語でも早いんじゃない?
2023/02/19(日) 01:42:49.14ID:15y14fHP
数式のチェックをするということならusedrange.formulaとかで二次元配列に入れてしまえば速いだろうね
2023/02/19(日) 07:28:37.93ID:xSIr/CQB
セルの値をチェックしたいのか数式をチェックしたいのかもわからんしそもそも既に作ってあるならその遅い部分のコード晒せばいいのに

としか思わん
698693
垢版 |
2023/02/21(火) 12:34:29.62ID:jIGEezda
PowerShellでRangeに対してforeachを使ったら糞遅かったが、Range.Cellsに対して使ったら爆速でした。

VBAで.Cellsを付けないことは無いが、PowerShellだと書き方が変わるから気付かんかった。

ソースは仕事で晒せないが、記憶を頼りに再現したのを後で書くよ。
2023/02/21(火) 15:29:46.97ID:y0oxbjUQ
やりたい内容によってはImportExcelとか使うといいかもしれない
2023/02/21(火) 17:16:31.11ID:mQxVjbPG
Excel操作は真面目にやるとCOMの参照の管理と解放が大変で避けちゃう。
完全に自分用なら雑でもいいんだけどさ。
VBScriptくらいに気楽にやらせて欲しい。
2023/02/21(火) 18:44:18.75ID:7Z23bFwT
あららSnoverさん去年退職しちゃったのか、、、
言語的には成熟してるし問題はないんだろうけど、残念だな
702デフォルトの名無しさん
垢版 |
2023/02/21(火) 19:36:25.83ID:VTx8hARX
>>698
素直にExcel VBAを書いた方が安全だよ。
2023/02/24(金) 13:12:14.11ID:xAv3d2xt
gci -recでレジストリ検索出来るの便利だなって一昨日思った
2023/02/27(月) 21:04:03.19ID:5eoJ3K3o
大規模な 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 も利用可能でございます。
2023/02/28(火) 21:55:58.18ID:NXRHGwBO
vscodeのプラグインどうにかしてくれないかな
せめて参照関連はちゃんとして欲しい
2023/02/28(火) 23:08:46.00ID:XEMkLhh3
PowerShellの構文が分からなくなったときに今話題のChatGPTで質問してみたら
的確な回答返ってきてすげぇ助かったわ。もうパソコン教室は廃業だろこれ
2023/03/10(金) 20:16:52.26ID:qXeg3GIX
ai のコード生成って結構すごいよね
コパイロット入れてるんだが、マジで打とうとしたコード先読みしてくる
インテリセンスみたいな数文字打って残りの補完じゃなくて、まるまる予測してきて更に当たってるっていう
2023/03/15(水) 14:42:36.44ID:o8REigww
ここでいいですか

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 にアクセスしてください
2023/03/15(水) 15:33:19.80ID:IBd2LSQO
そこ見てダメなら諦めたら
特にメリットないし
2023/03/15(水) 21:33:00.90ID:e2aqyp6Z
>>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検索するとか。
2023/03/17(金) 11:52:05.75ID:1OmGmSd0
>>707
コパイロットとやらはインタラクティブシェルでも使える?興味あり
gnureadlineうんこpsreadline最強と思ってたら思わぬ伏兵が…

bingのchatgptが話題になってるし、標準で付いてもおかしくないけど
2023/03/17(金) 14:15:57.93ID:piFUHGnm
インタラクティブ(履歴)/スクリプトでもヒューリスティックにコンテキストを読んでくれるのは新しいね、もはや補完ではない気がするが

ところで-UseFussyが超便利
2023/03/19(日) 10:19:36.25ID:+AVX1Caz
https://www.powershellgallery.com/packages?q=Copilot
2023/03/27(月) 09:23:21.18ID:qNF02T37
f1で直近コマンドの、Alt-hで直近パラメータのヘルプがコマンドラインを汚さずにチラ見出来るけど
常時表示しておきたい
2023/03/28(火) 15:38:45.60ID:vZrgWFuJ
>>714
https://learn.microsoft.com/en-us/powershell/scripting/learn/shell/dynamic-help?view=powershell-7.4

フックされてるShowCommandHelpあたりを改造してみては
2023/03/31(金) 09:29:33.35ID:Hum0KYCd
コマンドプロンプトのstartコマンドのように
新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか
717デフォルトの名無しさん
垢版 |
2023/03/31(金) 10:04:55.21ID:oEDBXBHf
Add-Type によって、自作のクラスを使う処理を書いて、一応ちゃんと動くのですが
同じことを 何度もやろうとすると 二度目以降は「The type 〜 already exists.」と出て止まってしまいます.
そこで「既に そのタイプが存在しているかどうか」をチェックしたいのですが、これってどう書くんでしょうか
2023/03/31(金) 22:12:52.48ID:yFMegc6R
>>717
こんなん
Add-Type @'
public class MyClass {
public void test() {
}
}
'@

if ("MyClass" -as [type]) {
"MyClass is exist"
}
2023/03/31(金) 22:21:06.75ID:bSGiEzAG
>>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
2023/03/31(金) 22:35:53.19ID:yFMegc6R
>>719
>新しいウィンドウを作成せず
という指定が抜けてね?
721716
垢版 |
2023/03/31(金) 22:58:55.98ID:Hum0KYCd
>>717
単純に try { [クラス] } catch { Add-Type 〜 } とか、知らんけど

>>719
Start-Processを使わない場合のように新しいウィンドウなしで起動したいです
2023/03/31(金) 23:29:03.95ID:bSGiEzAG
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process#-nonewwindow
-NoNewWindow
現在のコンソール ウィンドウで新しいプロセスを開始します。 Windows では、既定で PowerShell によって新しいウィンドウが開きます。
723716
垢版 |
2023/03/31(金) 23:54:48.86ID:Hum0KYCd
>>722
最初はそれでいいと思ったんですが、コンソールの取り合いになります
(Start-Process netsh.exe -NoNewWindow とかで試すとわかりますが、くれぐれもご注意を)
取り合いにならないように -Wait も指定して
(Start-Process netsh.exe -NoNewWindow -Wait -PassThuru).ProcessorAffinity = xxx
とすると、-Wait が効きすぎて ProcessorAffinity をセットできないという罠
2023/04/01(土) 00:12:16.16ID:rM0w1xSL
つまり.NETのProcessorAffinityは存在するプロセスにしか適用できないから無理でいんじゃね
知らんけどWin32APIとかで別の方法を探った方がいいんじゃね
2023/04/01(土) 00:25:58.89ID:rM0w1xSL
たとえばWin32APIのCreateProcessにCREATE_SUSPENDEDというフラグがある
プロセスをサスペンド状態で作成してaffinity設定してからResumeThreadで開始
これでいけるんじゃね
2023/04/01(土) 03:49:24.51ID:tD9Ph5o/
Start-Jobの中で実行したら上手いこと裏でやってくれないだろうか
2023/04/01(土) 09:42:35.62ID:nbrNF8T0
Start-Process -NoNewWindow cmd.exe "/c start /affinity xxx /b foo.exe"

これくらいしか思い浮かばなかった
2023/04/01(土) 10:09:29.22ID:rM0w1xSL
定義が長くなったからこっちに貼り付けたよ
https://ideone.com/LOSuzD
使い方
bool [Win32API]::CreateProcessWithAffinity(appname, cmdline, affinity)
affinityはプロセスに直接設定するAPIが見つからなかったのでGet-ProcessをResumeThread前に呼び出して指定してる
サンプルはcmdを呼び出してpingをlocalhostに10回打ってる間にプロセス名とaffinity値を出してる
729727
垢版 |
2023/04/01(土) 10:22:16.44ID:nbrNF8T0
Start-Process -NoNewWindow -Wait cmd.exe "/c start /affinity xxx /b foo.exe"
こうだった
2023/04/01(土) 10:27:57.30ID:rM0w1xSL
寝ぼけてた。コールバックの部分下だけで良かったわ
System.Diagnostics.Process.GetProcessById(pInfo.dwProcessId).ProcessorAffinity = (IntPtr)affinity;
2023/04/01(土) 10:32:18.54ID:rM0w1xSL
でもう一箇所、appnameに$nullを指定してもC#側型宣言で""に変換されてしまうので、CreateProcessの直前に下を追加しとくとcmdlineだけで動く
if (appname == "") { appname = null; }
2023/04/01(土) 10:52:36.56ID:NrUMzMDg
これパイプすればいいんだよ
ポイントは () を使わないこと

(Start-Process).ProcessorAffinity = xxx は NG
Start-Process | ForEach-Object {} で OK
(Start-Process) | ForEach-Object {} は NG
& { Start-Process } | ForEach-Object {} でも OK
2023/04/01(土) 11:09:34.29ID:rM0w1xSL
>>732
これ正解じゃない?
遠回りしたねえ
2023/04/01(土) 11:10:53.22ID:rM0w1xSL
Start-Process cmd.exe -ArgumentList '/c echo hello world & ping 127.0.0.1 -n 10' -NoNewWindow -PassThru | %{ $_.ProcessorAffinity = 1; $_ | select Name, ProcessorAffinity }
2023/04/01(土) 14:38:06.95ID:khXUWf7f
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 }
736デフォルトの名無しさん
垢版 |
2023/04/01(土) 16:54:32.28ID:SzOWT/hN
717です. 反応してくださったかた ありがとうございました

>>718
if ("MyClass" -as [type]) → なるほど!…これでした!

>>721
私も,とりあえずは
try{ [MyClass] >$null } catch{ Add-Type -Path "〜.cs" >$null }
で 済ませていたのですが
例外に たよる書き方は,なんとなくカッコ悪い感じがして(笑)
2023/04/01(土) 21:56:00.86ID:sdpm0Gxz
>>716
(Start-Process -FilePath 〜〜〜 -ArgumentList 〜〜〜 -WindowStyle Hidden -PassThru).ProcessorAffinity = 1
2023/04/01(土) 22:32:49.48ID:khXUWf7f
それでは Start-Process を使わない場合と違って入力も出力もできない
2023/04/01(土) 22:58:19.34ID:sdpm0Gxz
あ〜、
> コマンドプロンプトのstartコマンドのように
> 新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか
というか
 新しいウィンドウを作成せず、
 コマンドプロンプトのstartコマンドのように使うプロセッサを指定して起動するにはどうすれば良いですか
という感じか。であればこれまでに出てた回答の方が正しいね。
ほぼ同じだけど自分なら
$proc = Start-Process -FilePath 〜 -NoNewWindow -PassThru; $proc.ProcessorAffinity = 1; $proc.WaitForExit();
みたいにするかなぁ。(でもStart-Processじゃなく小回りのきくProcessStartInfoを使うかな?)
2023/04/02(日) 00:15:44.70ID:l9+T+h5c
質問です。
外部コマンドの標準出力やエラー出力を一緒に変数に入れたいのですが、
$result=外部コマンド.exe 2>&1
この式で一見動作はしてるようのですが、外部コマンドからエラー出力があった場合に赤い色が付き、powershell的なエラーメッセージも追加されてしまいます。
意図としては色とか追加メッセージとかは不要で、純粋に外部コマンドの標準出力やエラー出力を一緒に変数に取り込みたいだけなのですが、
そういう場合どう記述したら良いでしょうか。
2023/04/02(日) 00:47:59.12ID:h0WbN+8B
外部コマンドの引数が不要またはシンプルなら、
簡単で分かりやすいのはcmd上で標準出力にする方法
$result=cmd /c "外部コマンド.exe 2>&1"
2023/04/02(日) 01:46:53.77ID:l9+T+h5c
>>741
cmd脱却を考えているので、できればpowershell流?の書き方があればお願いいたします
2023/04/02(日) 03:44:54.54ID:byiZ93ic
>>742
Powershellでcmdを使いこなす技術を鍛えたほうが幸せになれると思うよ
2023/04/02(日) 11:17:09.81ID:l9+T+h5c
ためしにChatGPTに質問してみたら以下の回答でした
質問「powershell上から外部コマンドを実行し、その標準出力とエラー出力を、powershellによる出力の加工を抑止した状態で1つの変数に入れたい」
$output = & <コマンド> 2>&1 | Out-String
Out-Stringは盲点でした。一応文字列として取得できているのでこれでいいのかな
2023/04/02(日) 11:29:33.76ID:yOzYb5by
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

これが失敗するなんて想像してなかった
2023/04/02(日) 15:23:02.64ID:9IrG8+0n
>>745
PowerShell5.1だと失敗しないな
7.3は駄目だった ターゲットのパスを絶対パスにすれば作れる

New-Item -ItemType Junction can't create relative link #18251
https://github.com/PowerShell/PowerShell/issues/18251
2023/04/02(日) 16:46:18.09ID:yOzYb5by
ジャンクションなら絶対パス必須でもいいけど
シンボリックリンクでは相対パスが使えないと不便

>>745 のテストをシンボリックリンクに変えてもやっぱりおかしい
ターゲットがディレクトリなのにファイルのシンボリックリンクになる
条件次第で逆にすることもできる
タイプ間違いだと補完や削除をするときに困るんだよな
だから最初からcmd.exeでmklinkしてる
2023/04/02(日) 21:47:00.28ID:9IrG8+0n
Target type detection (file/directory) for relative symlinks is still broken, even on Windows #15235
https://github.com/PowerShell/PowerShell/issues/15235

これか?
2年前に立ったissueなのにまだ直ってないみたい
2023/04/03(月) 07:48:59.39ID:Jr4h81FG
>>739
あの〜、コマンドプロンプトのstartだと1行の
start /B /AFFINITY 1 cmd.exe
のように「新しいウィンドウを作成せず、使うプロセッサを指定して起動する」には
小回りのきくProcessStartInfoを使うとどう書くの?
2023/04/03(月) 08:48:40.85ID:hrmFy8ir
.NETでの普通のやり方ならググるれば出てくるよ
2023/04/03(月) 21:13:34.50ID:d+sLTFCG
例示ではプロセス起動・Process型オブジェクト取得にStart-Processを使ったけど
>>739は普段はProcessStartInfo使ってるってだけじゃないの。
私も引数あるときはStart-Process(-ArgumentList)避けてProcessクラス使う。
2023/04/03(月) 21:20:59.87ID:9kyxsKiX
PowerShellってWebスクレイピングには向いてないですか?
Pythonで作った方がいいですか?
PowerShellは職場用のスクリプトを何個か作ったりして少し分かるのですが、Pythonはまったく不慣れなので迷ってます
2023/04/03(月) 21:35:29.28ID:NHigh4Tg
Poweshellでちょっスクレイピング
http://sloppy-content.blog.jp/archives/12057529.html
【PowerShell】SeleniumモジュールでWebスクレイピングしたい
https://zenn.dev/hara_power/articles/815e3f3dc1e5655c4c22
2023/04/03(月) 22:09:14.13ID:FTaZkaBO
Windowsに限ればスクレイピング以外にもブラウザに直接細工する手段が充実してるからライブラリ頼みのpythonより向いてるとも言える
755752
垢版 |
2023/04/04(火) 10:40:01.35ID:4xPC11r9
>>753
>>754
ありがとうございます
PowerShellでやってみようと思います
2023/04/08(土) 22:48:22.89ID:wqsbQ+QM
PowerShellでPersonal Communicationsを操作しようと思い
以下のサイトを参考にしようとしたのですが
https://www.tekizai.net/entry/2021/10/04/063000
64bit版のPowershellでは出来ないようです
64bit版でも動かせるように変更はできないでしょうか?
2023/04/08(土) 23:26:55.43ID:ymsLMaB3
64bit環境用のPersonal CommunicationsのOCXやらが無い場合は32bitのpowershellからCreateObjectするしかないとは思うけど
そのサイトのVBA版では環境に関する言及がないね
32bit版Officeを使っているという前提で書いてるのかもしれないが試してみないと判らないね
758デフォルトの名無しさん
垢版 |
2023/04/10(月) 20:51:54.13ID:4PCv5Fk3
すいません、当方SEで技術的な質問です
administrator権限のユーザーでLinuxサーバーからパスワード認証でなく、秘密鍵と認証鍵の認証方式でwindowsサーバーにSSHを掛けたいのですが、administrator権限のユーザーですと、パスワードを聞かれてしまいます
他の権限のユーザーは問題無く認証されます
administrator権限では認証方式のSSHは使えないのでしょうか?
2023/04/10(月) 21:12:02.69ID:bM8RH+P4
>>758
http://superuser.com/questions/1407020/ddg#1407042
760デフォルトの名無しさん
垢版 |
2023/04/10(月) 21:31:04.64ID:4PCv5Fk3
>>759
ありがとうございます
明日、業務で試してみます
2023/04/14(金) 21:40:03.65ID:qiPEiEw+
Windowsのディスプレイ設定で拡大率を100%以外にしてると
フォームの文字がぼやけるんだけど、なにか解決策はありますか?


Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.text= "タイトルはぼやけない"
$label = New-Object System.Windows.Forms.Label
$label.Size = New-Object System.Drawing.Size(300,20)
$label.Text = "ディスプレイ拡大率が100%以外だと文字がぼやける"
$form.Controls.Add($label)
$form.ShowDialog()
2023/04/14(金) 21:40:32.33ID:qiPEiEw+
ちなみにOSはWindows11です
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況