PowerShell -Part 5

レス数が950を超えています。1000を超えると書き込みができなくなります。
2021/03/18(木) 00:29:52.04ID:/MpReTiX
前スレ
PowerShell -Part 4
https://mevius.5ch.net/test/read.cgi/tech/1577862511/

次スレは>>980が立ててね!!
871デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:24:43.19ID:V72yjyE9
>>870
以下コマンドをそれぞれコマンドプロンプトとPowerShellで実行して、aaa.txtに何が書き込まれているか確認してくれ
wsl --help > aaa.txt

あと「>>856の対処」とは何を指すのか具体的に示して
872デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:27:32.35ID:V72yjyE9
マイクロソフトが関与するオープンソース・コミュニティーは問題が解決してないのに解決したことにしてしまうずさんな所が多い
バグ票を閉じることを優先する隠蔽体質あると思う
873デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:34:07.64ID:V72yjyE9
共産圏の人間が仕切ってるのかと思うような閉じられ方する、まさにノルマ
2021/12/16(木) 20:11:17.38ID:q0ua6jst
そうだね
875デフォルトの名無しさん
垢版 |
2021/12/16(木) 20:20:13.49ID:Y2CVy/MB
マイクロソフト文化圏。
2021/12/16(木) 21:09:01.98ID:VSm+B60n
>>871
> is not a raw-bytes conduit to a file in PowerShell, unlike in cmd.exe.

Instead, PowerShell always decodes output from external programs (into .NET strings) before further processing (but not when printing directly to the display), based on the character encoding stored in [Console]::OutputEncoding.

Therefore, before your external-program call, you must (at least temporarily) set [Console]::OutputEncoding to match the actual character encoding used in your external program's output; e.g., [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
877デフォルトの名無しさん
垢版 |
2021/12/16(木) 21:15:42.41ID:V72yjyE9
従来型のパイプラインを選べない時点で設計思想がおかしいんですよ
$(xxx) みたいな特殊表現によるパイプが提供されてしかるべき
というかPowerShellのパイプラインを特殊表現に閉じ込めるべき
878デフォルトの名無しさん
垢版 |
2021/12/16(木) 21:56:24.21ID:V72yjyE9
OutputEncodingとコードページがごっちゃになってるのもよくない
OutputEncodingをUTF8に指定したら、cmd /? で英語ヘルプが返されるようになってしまう
この挙動は、コマンドプロンプト上のchcp コマンドでコードページを変えたときのcmd /?の挙動と同じ
2021/12/16(木) 22:23:10.88ID:ywwvfrpp
>>877
そもそも従来型のパイプラインは生バイト晒してたように聞こえるんだが、テキストモード(ascii)IOを忘れてないか

fopen等システムコールに行儀良く"b"フラグ渡してれば問題はないが、そうでない時にcmdはtypeや |を処理する際にコンソールのファント設定見に行く等奇怪な挙動をしてた
でもたまに制御文字をtypeして死んだり…

テキストモードを排除できれば可能かも
2021/12/16(木) 22:31:55.77ID:ywwvfrpp
gnuとかのプログラムは今でもioモード切り替えフラグ付いてたりするね

生バイトが欲しければProcessInfoとかからstdin/stdout引っこ抜いてIO.BinaryWriterに渡すとか
2021/12/16(木) 22:47:57.71ID:peIHdemY
文字列中に紛れたeof文字相当のバイトを見ても読み込みを続ける挙動は多分windows的には正しくないよな
そんな文字無くしてしまえ、と思うけど
882デフォルトの名無しさん
垢版 |
2021/12/17(金) 06:27:47.69ID:cFRRrt8D
wsl --helpのみっともない改行はUTF-16のL"\r\n"をテキストモードで出力するwslの変態行為がそもそもの原因だし

https://docs.microsoft.com/en-us/cpp/c-runtime-library/unicode-stream-i-o-in-text-and-binary-modes?view=msvc-170
883デフォルトの名無しさん
垢版 |
2021/12/17(金) 06:36:45.15ID:cFRRrt8D
PowerShell固有のパイプラインに、|, >, >> を使うのをやめて
例えば $|, $>, $>> のような特殊表現に閉じ込めてほしいんだが
今さら無理か
884デフォルトの名無しさん
垢版 |
2021/12/17(金) 07:27:36.04ID:cFRRrt8D
昔、MINGWのcatコマンドが0x0aを勝手に0x0d,0x0aへテキストモード変換する迷惑行為で人知れず苦しんだ人は多かったと思う
2021/12/17(金) 08:47:10.04ID:+hqMWYwb
c標準ライブラリの"t"フラグはホスト側でよしなに変換してくれという表明だけど、たぶん行論理セパレータ\n↔\r\n変換してくれるやつくらいに考えてる人が多いんじゃねえかな
2021/12/17(金) 09:02:49.38ID:z0PRPnA0
"t"はc規格には無いか、無指定の"w"フラグ等がテキストモードにデフォルトするというだけで
cっぽいopen関数備えてる言語(pythonとか)だと"b"との区別を意識させる為に"wt"とか受け付けるけど
2021/12/17(金) 09:38:27.97ID:cFRRrt8D
マイクロソフト謹製アプリが率先してやらかしてるってところが肝
2021/12/17(金) 10:04:59.46ID:YK+z10uu
それと直接関係あるかは再現しないのでちょっと不明
>>871はconhostをsjisに設定してない?
2021/12/17(金) 10:07:35.81ID:YK+z10uu
v7.2/wt(preview)
[console]のioデフォルトはutf8(=旧nobom)になってた
890デフォルトの名無しさん
垢版 |
2021/12/17(金) 10:09:02.77ID:cFRRrt8D
>>888
CP932は日本語OSの規定の設定だよ
再現しないとか何言ってるのかわからない
作られたファイルaaa.txtの文字コードの確認さえできないんなら回答しなくていいよ
2021/12/17(金) 10:14:30.90ID:YK+z10uu
>>890
原因分かってんのなら変えなよ…
win10パッケージ版(us_en)に日本語パック追加で入れるとデフォルトはこうなると思う
2021/12/17(金) 10:27:09.40ID:YK+z10uu
あとwin11非対応マシンでms配布のロールバック用iso(非ローカライズ版)イメージで再インストール→日本語パック選択した人も該当するはず
oem版はsjisが多いと思う
893デフォルトの名無しさん
垢版 |
2021/12/17(金) 10:32:50.05ID:cFRRrt8D
>>891
Windows Terminalでも起きるんだからconhost.exeは関係ないぞ
2021/12/17(金) 10:42:00.46ID:YK+z10uu
>>893
conhostも[console]もシステムのcpから拾ってくる
wtに関してはsetting.jsonからも設定できる
様々なエンコーディング切り替えられないソフトが混在してて、グローバルに切り替えるのがためらわれるならば
ps/cmd>ms-settings:~(スタート>歯車のやつ)からアプリ毎にエンコーディング設定するのがおすすめ
895デフォルトの名無しさん
垢版 |
2021/12/17(金) 10:56:53.95ID:cFRRrt8D
エンコーディング機能にAutoDetectがあれば良いだけなんだがな
簡単なことを難しくしてしまうのは無能の証なんだよ
PowerShellみててつくづくそう思う
2021/12/17(金) 11:26:52.18ID:aYaid5rJ
オートディテクトはギルティ、頭抱える事になるぞ
素性の良いデータで大体動けばいいような自動化なら、古き良きnkfでも噛ませ
ポータブルにしたいならPSGalleryに純pwsh実装のモジュールが転がってる、クオリティは知らん

i/oエンコーディングをシェルレベルで扱えるのはバベルの塔なwindows環境では重宝する
897デフォルトの名無しさん
垢版 |
2021/12/17(金) 11:27:13.62ID:cFRRrt8D
PowerShellのパイプラインそれ自体がすでに低速なのに文字コードの自動判定すらないとか無能すぎでしょ
898デフォルトの名無しさん
垢版 |
2021/12/17(金) 11:29:06.56ID:cFRRrt8D
>>896
古き良きnkfを噛ませられないからもめてるですよ
パイプでnkfに入力された時点で汚染されてるから
時すでにお寿司なのがPowerShell
2021/12/17(金) 12:26:32.74ID:YK+z10uu
リダイレクトの挙動が不自然に感じるのは、ホストの概念で躓いてるのでは
ホストはコンソールとも限らないし、coreバンドルのコンソールホスト以外にもiseやらaspやら色々あるわけで
なんで設定が分かれてるのか考えるべき
900デフォルトの名無しさん
垢版 |
2021/12/17(金) 12:35:31.53ID:cFRRrt8D
>>899
別にいろんなホストがあってもいいんだよ
昔ながらの標準入出力と棲み分けして提供すべきだったってこと
だけど、十把一絡げにしたせいで昔ながらのパイプ処理まで低速になってしまった
2021/12/17(金) 12:48:55.55ID:BQzVpcl1
>>900
>>856からrelatedで飛べる
https://github.com/PowerShell/PowerShell/issues/1908
で提案されてるような構文はあったら確かに便利かと思う

もちろんcoreの設計とは相容れないから、追加モジュールかwindows pwsh(新)でリリースすることになると思うけど
イイね押しとこう
902デフォルトの名無しさん
垢版 |
2021/12/17(金) 13:16:49.94ID:cFRRrt8D
むしろPowerShelll固有の構文を新しい構文に移行させてほしいくらいだわ
パイプラインにテキスト縛りがある時点でPowerShellは欠陥品なんだよ
903デフォルトの名無しさん
垢版 |
2021/12/29(水) 20:28:55.03ID:/Pws6ORw
PowerShellは以下コマンドをFunction化できない。
[console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(932); $OutputEncoding = [Text.Encoding]::GetEncoding(932);

Function内でしかスコープが有効でないことが原因。$global:OutputEncodingを変えてもダメ。
なのでchcpコマンド相当のことをやろうとしたら手入力するしかない

なんというか、PowerShellは他のシェル言語でできいることができない残念なシェル言語。
オワコン化待ったなし
904デフォルトの名無しさん
垢版 |
2021/12/29(水) 20:49:49.82ID:/Pws6ORw
([console])::OutputEncodingをFunction外にも適用できないことにはchcp相当の機能は実現できない
Powershellからchcpを呼ぶとcmdシェルを介してコマンドプロンプトの初期値が表示されるだけであり、グローバル設定とは無関係

([console])::OutputEncodingが効いたかどうかは、cmd /? で戻されるヘルプ文字列が日本語かどうかで判断できる
2021/12/29(水) 20:57:34.10ID:7YDJokPl
UNIXシェルは糞of糞
やっぱりPowerShellだよな

シェルスクリプトは文字通りの逐次実行
sleepy-yoshi.hatenablog.com/entry/20090917/p1
2021/12/29(水) 23:03:59.28ID:wj529v9h
>>903-904
ドットソースで実行してもだめなの?
function f1 {〜}
. f1
907デフォルトの名無しさん
垢版 |
2021/12/29(水) 23:16:02.98ID:/Pws6ORw
>>906
説明不足だった
やりたいことはコマンド入力じゃなくてSet-PSReadLineKeyHandler -Keyを使ったキーバインドなんだけど
ドット. で反映してくてもScriptBlockやFunctionのスコープに閉じ込められてしまうから解決にならない
908デフォルトの名無しさん
垢版 |
2021/12/29(水) 23:39:26.16ID:/Pws6ORw
ま、そういうエンコーディング切り替え機能をどれだけ充実させても既存のbashやCMDのようなプロセス間通信はできないのでやるだけ無駄ってのはわかってる
2021/12/30(木) 08:42:29.02ID:InFuAQoQ
PowerShellでバイナリ(もしくはエンコーディングが不明なデータ)を扱う
https://qiita.com/boukichi_numloc/items/0f4bb4e73f71c2f0a519
2021/12/30(木) 21:35:12.30ID:FEP7eJXA
powershell内部でcmd呼んだらいいのでは
何がしたいのかわからんけど
2021/12/30(木) 23:22:49.02ID:pA3aK4qE
PowerShellからcmd を呼んだら負け、みたいな抵抗感が少しある
2021/12/31(金) 19:53:42.99ID:YcD3GAD3
残念な仕様はあれども、ちゃんと書けば、ちゃんと動く
クソとは思わんな。便利は便利よ
2022/01/11(火) 22:54:51.08ID:rTZaFBoT
CSVを項目で検索し、ヒットした列を編集したいんだけど、パイプが理解しきれてないせいで上手いこといかない
$ArrCsvData | Where-Object{$_.CodeNo -match $Code} |
このあとにカンマ区切りのテキストファイルを該当列に上書きしたいんだけど、どうすればいいのでしょうか?
2022/01/11(火) 23:45:14.22ID:1S8cvNBi
>>913
まず、ArrCsvDataはCSVからオブジェクトに変換(ConverFrom-CSVやImport-CSV)した物なのかな
じゃないとプロパティで値を呼び出せないよ

「カンマ区切りのテキストファイルを該当列に上書きしたい」の意味が測り兼ねるけど、
条件に合致する行を編集したいなら

$ArrCsvData | ForEach-Object{ if($_.CodeNo -match $Code){$_.編集したい列名 = "編集後の文字列";$_ }

とやる。コツは編集後に「;$_ 」とやって出力する所。じゃないと編集だけして破棄する事になる。

さらにCSVで保存したいなら

〜 | Export-Csv -PSPath "保存先パス"
2022/01/11(火) 23:46:35.07ID:1S8cvNBi
ミス
if文の閉じカッコ忘れてた

$ArrCsvData | ForEach-Object{ if($_.CodeNo -match $Code){$_.編集したい列名 = "編集後の文字列";$_ }



$ArrCsvData | ForEach-Object{ if($_.CodeNo -match $Code){$_.編集したい列名 = "編集後の文字列"} ; $_ }
2022/01/12(水) 00:21:17.01ID:B+xDwNUa
いちいち空行挿むなスカスカ脳
2022/01/12(水) 01:11:14.14ID:0oGT7bUk
>>915
教えていただきありがとうございます

CSVは
「A001,,」
「B001,かきくけこ,12345」
のようなフィールドで
$Code = "A001"を検索し
「A001,あいうえお,12345」
のような内部のテキストファイルがあり、編集したい列名を指定せずにまとめて編集したいと思っています。
実際には編集する項目が多くループさせながら格納だと長くなってしまうため、省略できないかと思い相談させていただきました。
2022/01/12(水) 21:13:44.63ID:vTY0CDWm
gc $csv_in -Encoding Default | %{ $fields = $_ -split ","; if ($fields[0] -match $Code) { $fieldsを加工; $fields -join "," } else { $_ } } | Out-File $csv_out -Encoding Default
2022/01/13(木) 01:49:18.52ID:sU2jW0+6
>>918
ありがとうございます
まだ理解できていないところもありますので勉強しながら試させていただきます
2022/01/18(火) 20:28:41.01ID:4KOVvciD
get-aliasをalias、またはget-serviceをservice、
自作の関数でもget-testとしたらtest、のように
エイリアス定義無しでも
get-を省略して実行出来てしまう(または、省略したらget-*扱いになる)のですが
これについて記載されたドキュメントが何処にあるか
教えて頂けないでしょうか
921デフォルトの名無しさん
垢版 |
2022/01/19(水) 20:37:21.76ID:QgcNfSy6
>>920
https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_parsing?view=powershell-7.2

PowerShell がコマンド入力を解析すると、コマンドレットまたはネイティブ実行可能ファイルへのコマンド名の解決が試みされます。 コマンド名が完全に一致しない場合、PowerShell は既定の動詞としてコマンドの前 Get- に付加されます。
2022/01/20(木) 15:57:54.33ID:PUohEL+U
PowerShellバカにしてたけど、安定性半端ないわ
適当にササッと書いたやつがなんのエラーもなくずっと正確に動いとる
2022/01/20(木) 16:02:20.23ID:Aa91Vk9H
>>921
ありがとうございます!
このドキュメントが見つからず困っていました
助かりました
2022/01/20(木) 17:34:26.20ID:I7UNJZAr
正直、PowerShellって名前がダサいと思う
925デフォルトの名無しさん
垢版 |
2022/01/20(木) 19:23:46.46ID:qK2oGbTr
チカラこそパワー!
2022/01/20(木) 19:45:12.86ID:N7Uy6cYb
ぱわわしぇる!
927デフォルトの名無しさん
垢版 |
2022/01/20(木) 19:54:27.39ID:INnqrIt/
名前負けしてるなあ、とは思うけど
2022/01/20(木) 20:28:47.30ID:Ibae9TV2
富士通が昔PowerCobolとか出してたからPowerなんちゃらは不安になる
929デフォルトの名無しさん
垢版 |
2022/01/20(木) 20:31:33.85ID:6YV8Mf/D
うちはウルトラCとかいうインタープリターだったなー
2022/01/20(木) 22:25:31.06ID:yvXRNpR1
力貝

宝貝みたいなもんだなきっと
2022/01/20(木) 22:31:19.45ID:ogjAY3PM
>>927
そう?
方向性はともかくshよりだいぶ高機能になってると思う
2022/01/21(金) 14:41:49.71ID:Q8HlpjEI
質問です。

get-childitemのデフォルトのソート順は何でしょうか?(sort-objectを明示しない場合の並び順)

ソート順について記載されているドキュメントの所在でも良いです。
2022/01/21(金) 20:37:48.38ID:QAFbTLmU
>>932
NTFSなら何もしなくてもUNICODEのコード順だかでソートされて出てくる
要するにファイルシステム次第
934デフォルトの名無しさん
垢版 |
2022/01/21(金) 20:45:32.61ID:D6eDuhqM
>>933
さて、どうかな
MicrosoftはSJIS時代のソート順をひきずってると思うぞ
935デフォルトの名無しさん
垢版 |
2022/01/21(金) 22:44:52.31ID:Q8HlpjEI
932です。先ほどの質問についてご回答頂きありがとうございます。予めソートされていることがわかり、安心しました。

追加ですみませんが、もう1点質問をさせてください。(先ほどの質問は、当疑問からの派生でした。)

■前提事項
比較元と比較先でソート順を変えてdiffを取った場合、バイナリによる比較とハッシュ値による比較では結果が異なります。
具体的に申し上げますと、下記ディレクトリ構成の「file1.txt」を異なる内容にした場合、
バイナリ比較では、比較元の「修正前.xlsx」と比較先の「file1.txt」で差分を出力します。(ディレクトリの違いによるアンマッチを出力する。)
ハッシュ値の比較では、比較元の「file1.txt」と比較先の「file1.txt」で差分を出力します。(同ディレクトリ配下のアンマッチを出力する。)

■質問
なぜハッシュ値による比較では、比較元と比較先でソート順が違うのに同ディレクトリの差分のみを出力できるのか。(データ型の違いにヒントがあるのかなと思っていますが、解明まで至っておりません。)

■コード
$master = Get-ChildItem -LiteralPath [比較元ディレクトリ] -Recurse -File | Sort-Object{$_.LastWriteTime}
$work = Get-ChildItem -LiteralPath [比較先ディレクトリ] -Recurse -File | Sort-Object{$_.FullName}

@(Compare-Object (Get-Content -Encoding Byte $master.FullName) (Get-Content -Encoding Byte $work.FullName) -PassThru)

@(Compare-Object -Property Hash (Get-FileHash $master.FullName) (Get-FileHash $work.FullName) -PassThru)

■ディレクトリ構成(比較元と比較先で同一)
dir1
└─dir2
└─dir3
├─PG1
│ file1.txt
│ file2.txt
│ file3.txt

└─PG2
修正前.xlsx
936デフォルトの名無しさん
垢版 |
2022/01/21(金) 22:50:11.95ID:Q8HlpjEI
長文になりすみませんでした。
ディレクトリ構成が崩れてしまいましたが、以下の通りです。
 dir1\dir2\dir3\PG1\file*.txt
 dir1\dir2\dir3\PG2\修正前.xlsx

別の場所で質問すべきということでしたら、その旨をお伝えください。
当スレに相応しくないようでしたら無視頂いて構いません。申し訳ございませんでした。
2022/01/21(金) 22:51:59.59ID:2Ya+eSMz
例えば、ソード結果が異なる、1,2,3 と、3,2,1 を比べれば、2しか一致しない
2022/01/22(土) 18:26:51.31ID:wDrU8P/z
>>917
Ruby で作ってみた

require 'csv'
# ruby ./script.rb ./input.csv (デフォルトは、$stdout)
# ruby ./script.rb ./input.csv > 出力ファイル

# 2列目に、カンマ・改行・シングル/ダブルクォーテーションを入れてみた
csv_text = %(A001,"あ,い\nう'え""お",123) #=> "A001,\"あ,い\nう'え\"\"お\",123"
csv_ary = CSV.parse_line( csv_text ) #=> ["A001", "あ,い\nう'え\"お", "123"]

# 引数は入力ファイル名・input.csv
CSV.filter( File.open( ARGV[ 0 ] ) ) do |row| # 1行ずつ処理する
if row[ 0 ] == csv_ary[ 0 ]
( 0...csv_ary.length ).each do |idx|
row[ idx ] = csv_ary[ idx ] # すべての列を差し替える
end
end
end

入力ファイル・input.csv
A001,,
B,1,2
A001,1,2

出力。A001で始まる、2行が置換された
A001,"あ,い
う'え""お",123
B,1,2
A001,"あ,い
う'え""お",123
2022/01/22(土) 18:35:03.63ID:95Wn62Jb
キチガイが来た
2022/01/22(土) 18:54:41.80ID:MgA+2TRu
キチガイは見えない
2022/01/22(土) 19:21:27.37ID:kAQ/cYNL
目的とやってることがとっちらかってるな
なんで比較するのにLastWriteTimeでソートしてんの
2022/01/26(水) 20:55:59.87ID:wcWyeiko
https://i.imgur.com/uWA4d1c.png
タスクマネージャーから手動で子プロセスだけ終了させることはできるけど
PowerShellでやるには Get-Process -Name explorer のあと
どうやって子プロセスのPIDを取得すればいいでしょうか?教えてください
2022/01/26(水) 22:28:49.77ID:KYTViaCV
>>942
Get-WmiObjectかGet-CimInstance使ったら?
(Get-Process -Name explorer).Id | %{Get-CimInstance Win32_Process -Filter "ParentProcessId=$_"}
>>22 でも出てるよ
2022/01/26(水) 23:22:40.50ID:z4xHZvF2
最近PowerShell使い始めたんだけど
大きなシステムを作るとき、メインと複数のサブルーチンとかも基本1つのファイルで完結させるのか?それともファイルを何個も分けるのか?
どっちだとしても可読性下がる気がする
2022/01/26(水) 23:29:53.21ID:z4xHZvF2
PowerShell ISEでスクリプトウィンドウは何で左側に表示できないんだろ
左側のほうが俺はやりやすいわ
2022/01/26(水) 23:54:26.65ID:BYfIsc0u
>>945
Microsoftはpowershell開発にはvscodeの方がおすすめだと言ってるよ
https://docs.microsoft.com/ja-jp/powershell/scripting/dev-cross-plat/vscode/using-vscode?view=powershell-7.2
2022/01/27(木) 02:33:22.29ID:sf3Kg0Os
>>943
ありがとうございます。これで試してみます
2022/01/27(木) 08:04:44.84ID:EosWc+ux
>>944
そもそも大きなシステムをPowerShellでは作らない
2022/01/27(木) 09:23:06.79ID:p8Bx/YYe
>>944
>>948の通りPowerShellで大きなシステムを作る事自体がアンチパターンの極み
どうやっても可読性最悪だし破綻は避けられない
2022/01/27(木) 10:21:25.25ID:tOnT0cfV
powershellで大きめのものを組むならC#で組むときみたいな箱庭を作る発想は完全に捨てて、UNIX的な思考に切り替えるべき
完成度の高い単独で機能するコマンドを作って組み合わせていくようにすることで、ドメインを拡大させない
コマンド同士の細かい相互作用を作り込んではいけない
2022/01/29(土) 09:01:01.42ID:oEiS6XOx
Unix コンポーネント: 小さいことは美徳である
https://web.archive.org/web/20080709051701/http://www.os-omicron.org/~takano/private/trans/bongo-bong_j.html#:~:text=%E3%82%92%E6%8E%A2%E3%81%9B)-,Unix%20%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88,-%3A%20%E5%B0%8F%E3%81%95%E3%81%84%E3%81%93%E3%81%A8%E3%81%AF
2022/01/30(日) 01:37:19.06ID:ZZo5v4fB
>>951
ちょっと読んでみたらIEのCOMベースってすばらしいよね真似しよが結論になってて時代を感じた
さてBonoboはUnix界でうまくいったのでしょうか
https://en.wikipedia.org/wiki/Bonobo_(GNOME)
2022/02/02(水) 01:43:07.06ID:eLtuTeT2
Get-Contentで取得したテキストファイルが
処理終わっても自分自身で開いていることが多い
別の処理で終わったこのテキストファイルを削除しようとすると
自分で開いているので削除出来ないでエラーが出る

処理が終わっても閉じない原因か対処法はないでしょうか
954デフォルトの名無しさん
垢版 |
2022/02/02(水) 02:18:48.08ID:DC2596zT
>>953
明示的にオブジェクトを破棄する。
2022/02/02(水) 07:51:22.34ID:eLtuTeT2
>>954
なるほど破棄すると繋がりが消えるのか
ありがとうございます
2022/02/02(水) 23:39:08.14ID:eLtuTeT2
すみません、オブジェクト破棄を以下のように解釈していたのですが
そうなるとRemobe-Itemでファイルを削除するとき、変数に入れずにフルパスで指定するのか?と思ったけどやっぱり違うと思うし
改めて変数に入れるのも多分違うと思い、すっきりしない状態です。
多分破棄するの意味を間違って、こちらが解釈してると思うのですが、この場合どう書いてますでしょうか?

$lines = (Get-content $FilePath-as [string[]]

Remove-Variable FilePath

Remobe-Item $FilePath
2022/02/03(木) 07:21:37.66ID:OMU2Br15
remove variableであってるとおもう。
GCに回収させるとより安全。
$nullを代入でもいけるかな
2022/02/03(木) 07:41:16.46ID:OMU2Br15
ん?ファイル開いているのはlinesじゃないか?
linesを破棄しよう
2022/02/03(木) 16:23:23.37ID:VbK4RRek
gcでファイル開きっぱなしなんてないと思うけど
削除できないってパターンはありそうだな
削除できるまで無限ループでいいんじゃね
2022/02/03(木) 20:01:53.14ID:gI5tR0VQ
Get-content終わってもファイル開きっぱなしなんてあるの?
物凄いデカいファイルだったらあり得るのか?
961デフォルトの名無しさん
垢版 |
2022/02/03(木) 23:08:22.41ID:mIHwLL5k
Get-content(cat)はcat.exeと違うバッファリング方法だからユーザーから見れば開きっぱなしに感じる場合もあるかも
962デフォルトの名無しさん
垢版 |
2022/02/06(日) 00:04:34.70ID:D4g/hsrG
同じ変数を使い回すのにこだわっている阿呆だな
2022/02/06(日) 01:29:48.39ID:2aKrrA/x
      ___   ━┓  ___    ━┓
     / ―  \  ┏┛/ ―\   ┏┛
    /  (●)  \ヽ ・. /ノ  (●)\  ・
  /   (⌒  (●) /. | (●)   ⌒)\
  /      ̄ヽ__) /   |   (__ノ ̄  |
/´     ___/     \        /
|        \          \     _ノ
|        |          /´     `\
--------------------------------------
 このスレはあなたにとって役にたちましたか?

  ○ とても役にたった
  ○ 役にたった
  ○ どちらともいえない
  ○ 役にたたなかった
  ● 全く役にたたなかった
2022/02/06(日) 14:34:16.42ID:m5li3VVD
そもそもファイルを削除できなかったことが無い
2022/02/07(月) 07:35:36.67ID:83JX6KKe
削除できないのは他の要因で起こり得るから何とも
2022/02/09(水) 12:21:56.14ID:3KsDo8lO
gcに-waitとか-tailとか付けると開きっぱなしになるけど、明示的に離せってスイッチは無かったっけ?
付けなけりゃ閉じてるものかと思ってた
2022/02/09(水) 23:40:08.91ID:WBXgVt22
WindowsFormを使いGUIを作ろうと思っていますがtextboxのイベントハンドラが理解できていません
VBAでいうAfterUpdateをやろうと思っているのですが、
textbox1のフォーカスが別に移ったらlabel1にテストと表記したいのですが
そういった処理は可能でしたら下のどこを直せばいいのでしょうか?

Add-Type -AssemblyName system.windows.forms
Add-Type -AssemblyName system.drawing

$form = New-Object System.Windows.Forms.Form

$textbox1 = [System.Windows.Forms.textbox]@{
location = New-Object System.Drawing.point(10,10)
size = New-Object system.drawing.size(100,100)
}

$label1 = [System.Windows.Forms.Label]@{
location = New-Object System.Drawing.point(10,30)
size = New-Object system.drawing.size(250,20)
}

$form.Controls.Add($label1)
$form.Controls.Add($textbox1)

$textbox1.leave
({
$label1.text = "テスト"
})

$result = $form.ShowDialog()
2022/02/10(木) 19:36:03.95ID:/6XFwXXi
>>967
>$textbox1.leave
ここで行を分けてしまうとpowershellのパーサは一旦解釈を終えてしまうからイベントハンドラとして登録できてない。
それとイベンントハンドラの名前は頭にadd_〜を付ける決まりになってる(なぜかは知らない)
従って下のように記述する。
$textbox1.add_leave({
$label1.text = "テスト"
})

それとテキストボックスだけではフォーカスの移動が確認できないから
ボタンとか適当なフォーカスを持つコントロールを配置しておく
$button1 = [System.Windows.Forms.Button]@{ Location="10,50"; Size="80,20"; Text="ボタン"; FlatStyle="popup"}
$form.Controls.Add($button1)
$textbox1.add_leave({ $label1.text = "leave" })
$textbox1.add_enter({ $label1.text = "enter" })
$label1.text = "テスト"
$result = $form.ShowDialog()
2022/02/11(金) 00:44:40.14ID:xWKZ1gm4
>>968
教えていただきありがとうございます。
テキストボックスだけだと移動が確認できないなど知らなかったのでとても助かりました。
970デフォルトの名無しさん
垢版 |
2022/02/12(土) 03:20:20.24ID:NDMck+ft
ネタだろ
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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