X



PowerShell -Part 5
レス数が1000を超えています。これ以上書き込みはできません。
0953デフォルトの名無しさん
垢版 |
2022/02/02(水) 01:43:07.06ID:eLtuTeT2
Get-Contentで取得したテキストファイルが
処理終わっても自分自身で開いていることが多い
別の処理で終わったこのテキストファイルを削除しようとすると
自分で開いているので削除出来ないでエラーが出る

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

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

Remove-Variable FilePath

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

  ○ とても役にたった
  ○ 役にたった
  ○ どちらともいえない
  ○ 役にたたなかった
  ● 全く役にたたなかった
0966デフォルトの名無しさん
垢版 |
2022/02/09(水) 12:21:56.14ID:3KsDo8lO
gcに-waitとか-tailとか付けると開きっぱなしになるけど、明示的に離せってスイッチは無かったっけ?
付けなけりゃ閉じてるものかと思ってた
0967デフォルトの名無しさん
垢版 |
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()
0968デフォルトの名無しさん
垢版 |
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()
0969デフォルトの名無しさん
垢版 |
2022/02/11(金) 00:44:40.14ID:xWKZ1gm4
>>968
教えていただきありがとうございます。
テキストボックスだけだと移動が確認できないなど知らなかったのでとても助かりました。
0970デフォルトの名無しさん
垢版 |
2022/02/12(土) 03:20:20.24ID:NDMck+ft
ネタだろ
0973デフォルトの名無しさん
垢版 |
2022/02/13(日) 17:33:00.74ID:zeKJdxT+
よろしくお願いします。
現在開いているexcelのアクティブブックを捕まる方法ないでしょうか??
例えば、アクティブブックのアクティブシートにのってるグラフの軸を全て変更したい時に、
excelからpowershell ISEに画面を変えて操作したいのです。
0975デフォルトの名無しさん
垢版 |
2022/02/13(日) 17:44:20.75ID:zeKJdxT+
>974
ありがとうございます。
xlwingsだとアクティブブックつかめるけど、グラフの細かな設定がない
openpyxlだとアクティブブックをつかめなさそう、
でpowershellでできないかな、と。
0977デフォルトの名無しさん
垢版 |
2022/02/13(日) 17:55:51.10ID:lPImUKwL
pandasに無いような高等な統計関数が必要でないかぎりpythonで完結したほうが楽なんじゃね
0978デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:02:06.97ID:zeKJdxT+
ありがとうございます。
まぁ、会社でみながexcel使ってるので、、こんな質問をしている次第です、、
0979デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:06:52.02ID:PEAS4D91
シートの名前やらインデックスがpwshでわかれば、その情報をpythonに渡してmatplotlibでtemp.jpgとかで吐き出したグラフをまたpwshで貼れば行ける気がする
0980デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:34:35.90ID:Z5jSGqeY
ActiveWorkBookプロパティで捕まえられるでしょ
VBAから呼んでもPowershellから呼んでもPythonから呼んでもいい
0982デフォルトの名無しさん
垢版 |
2022/02/13(日) 18:41:38.57ID:LaQ04ZoE
余計なお世話ついでに
ISEはもう終わったプロジェクトなので
後継のVSCode+Powershellプラグインに乗り換えるのがオススメ
0983デフォルトの名無しさん
垢版 |
2022/02/13(日) 20:32:19.65ID:zeKJdxT+
色々アドバイスありがとうございました。

それもそだな、と下記でいけました。お騒がせいたしました

$Excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")

$Excel.ActiveWorkbook.ActiveSheet.name
0984デフォルトの名無しさん
垢版 |
2022/02/21(月) 13:09:23.89ID:jIppNsU3
教えて下さい
powershellで再帰処理をしたいんですが、

"The script failed due to call depth overflow"

と言うエラーで最後まで処理してくれません。
再帰回数のスタックオーバーフローで
トランポリン処理が有効とまでは調べたのですが
上手く理解出来ず

↓↓
https://qiita.com/yumura_s/items/8a44a70e3e11c4eb1464

詳しい方、よろしくお願いします
0985デフォルトの名無しさん
垢版 |
2022/02/21(月) 13:24:10.95ID:Vv5lB4cH
そのメッセージの言わんとするところは、すげー効率悪いので再帰で書くな
というアドバイスです
0986デフォルトの名無しさん
垢版 |
2022/02/21(月) 13:39:08.84ID:jIppNsU3
対象データが階層構造になっていて、
網羅的に処理したいんですが、うーん
0987デフォルトの名無しさん
垢版 |
2022/02/21(月) 14:08:41.32ID:Vv5lB4cH
500階層あるデータ構造はさすがに扱ったことがない…
そもそも特定の枝が底なし沼なのだとしたら、それでも延々と潜り続ける、というのは本当に意図した挙動なのか?

底なし沼が時々存在して、それに興味が無いのならば素直な余再帰で書ける幅優先探索を勧める

深さ優先で頑張りたいなら、スタックとしてコールスタックを流用するのでなくて、明示的にスタックにpush/popすると少しは経済的
特定の深さに達したら諦める決め打ちもあり

トランポリンで遅延評価を積む利点は、入力データ構造を処理するというより、需要に応じて任意の深さのデータを出力できるという点にあるので、悪手かと
0988デフォルトの名無しさん
垢版 |
2022/02/21(月) 14:17:30.40ID:+uSXi1Gh
トランポリン?のやってることはSchemeで言うCPS相当だね。まずCPSを理解しないと何が起きてるのか判らないと思う。
であるならば理屈ではトランポリンなんて変な事しなくてもスクリプトブロックをクロージャにするやつだけで再帰をクロージャの連鎖呼び出しに置き換えることはできると思う。
0989デフォルトの名無しさん
垢版 |
2022/02/21(月) 14:38:31.70ID:Vv5lB4cH
(実装は暗黙のCPSかもしれないけど) schemeだとdelay/forceそのまんまじゃね

イテレータとかストリームとか色んな言い方があるけど、何にせよ処理すべきデータがまだ存在していないような時にのみ有効
もし処理対象のデータが既に存在しているのなら、単に無駄な計算を増やすだけだよ
0990デフォルトの名無しさん
垢版 |
2022/02/21(月) 14:43:51.48ID:+uSXi1Gh
再帰処理したいつってる本人が理解できないと意味ないからな
再帰が軽い言語で処理すりゃいいんじゃねーの
0991デフォルトの名無しさん
垢版 |
2022/02/21(月) 15:22:36.66ID:002PyiUh
コールスタック制限してない言語の方が珍しいと思うがね、スクリプト言語なら500-1000くらいが標準的か

とりあえず言語によって課される安全装置としてのコールスタック制限を回避したいのなら、>>984が求めている資料はこれだと思うhttps://www.python.org/doc/essays/graphs/(pwshじゃなくてすまん)
生リスト(配列)を使ってもいいけど、現実的な時間で可能なのか怪しい程の難問なので、これの出番かも

https://docs.microsoft.com/en-us/dotnet/api/system.collections.stack?view=net-6.0
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.stack-1?view=net-6.0
0993デフォルトの名無しさん
垢版 |
2022/02/21(月) 16:03:11.06ID:jIppNsU3
すみません、めちゃくちゃ難しいっす

なんとなくリンク先のスクリプトが
動かせればと思ったのですが…

やはり悪手なんですかね
0994デフォルトの名無しさん
垢版 |
2022/02/21(月) 16:22:43.74ID:Vv5lB4cH
データのサンプル、期待する出力を書いてくれれば具体的なコード提案できるかも(たぶん)
0995デフォルトの名無しさん
垢版 |
2022/02/21(月) 18:40:11.40ID:jIppNsU3
色々回答してありがとうございました

結局再帰を使わずループで代用する
こととしました

トランポリンはもう少し
勉強してみたいと思います
0996デフォルトの名無しさん
垢版 |
2022/02/21(月) 20:07:10.97ID:+uSXi1Gh
powershell内でC#埋め込めばいいんじゃないの
あいにくpowershellのクロージャはダイナミックスコープで使えたもんじゃないのでC#のサンプルだけ

Add-Type -TypeDefinition @"
using System;
public static class test {
 static int fib(int n) { //普通の再帰
  if (n < 2) {
   return n;
  } else {
   return fib(n - 1) + fib(n - 2);
  }
 }
 static void fibcps(int n, Action<int> cont) { // CPS(継続渡しスタイル)
  if (n < 2) {
   cont(n);
  } else {
   fibcps(n - 1, n1 =>
    fibcps(n - 2, n2 =>
     cont(n1 + n2)));
  }
 }
 public static void recurse() {
  for (var n = 0; n <= 20; ++n) {
   Console.WriteLine("fib {0}: {1}",n,fib(n)); //普通の再帰
   fibcps(n, r => Console.WriteLine("fibcps {0}: {1}",n,r)); // CPS(継続渡しスタイル)
  }
 }
}
"@
[test]::recurse()
0997デフォルトの名無しさん
垢版 |
2022/02/21(月) 21:16:04.35ID:+uSXi1Gh
一応powershell版。ただしpowershell関数は末尾再帰の最適化をしてくれないためCPSで書いてもただの効率悪い再帰にしかならない。
上のC#も32bit環境だと末尾再帰の最適化が働かないため64bit環境でのみ有効なコード。
function fib($n) {
 if ($n -lt 2) {
  $n
 } else {
  (fib ($n - 1)) + (fib ($n - 2))
 }
}
function fibcps($n, $cont) {
 if ($n -lt 2) {
  & $cont $n
 } else {
  fibcps ($n - 1) {param($fib1); $cont = $cont
   fibcps ($n - 2) {param($fib2);
    & $cont ($fib1 + $fib2) }.GetNewClosure()}.GetNewClosure()
 }
}
1..10 | %{ $r=fib $_; "fib($_):$r" }
1..10 | %{ fibcps $_ {param([int]$r) "fibcps($_):$r"}.GetNewClosure() }
0998デフォルトの名無しさん
垢版 |
2022/02/21(月) 21:38:24.93ID:MnJW8OUO
変なやり方を広めようとするやつの典型例
0999デフォルトの名無しさん
垢版 |
2022/02/22(火) 00:12:46.08ID:wYlI3N7E
あえて混乱させようとしてるようにしか思えない

仮に末尾最適化でシリアルなコードを得たとして、まさかそれが木の探索に有利だとでも?

呼び出しをstart-(thread)jobで行ってスレッド/プロセスをばら撒けば済む話じゃないの
コールスタック溢れるような計算であればあるほど、スケーラブルで高速
1000デフォルトの名無しさん
垢版 |
2022/02/22(火) 02:35:33.30ID:LHZaRsEg
スタックを使わない再帰呼び出しならスタックは溢れないなw
個々の再帰呼び出しをStart-ThreadJob/Wait/Receiveで機械的に置き換えればとりあえず動く雛形にはなる
代わりにプロセス/スレッドが溢れるけど、スレッドなら単に順番待ちに入るだけで悪さはしない

個々のワーカーが自身の子をwaitしている限りはオーバーヘッドでしかないので、メインプロセスを設けStart時に-StreamingHostで直接報告を挙げさせるべき
長く走ってる枝を殺す等、最適化の可能性は大

メモ化や大域脱出程度で済むような問題には薦めない
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 341日 2時間 5分 41秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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