- 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が立ててね!!
- 841 名前:デフォルトの名無しさん mailto:sage [2023/07/10(月) 10:11:13.02 ID:CzqO5vr+.net]
- 後はstyle属性をシングルクォーテーションで括ってるのが気になった
全体の括りをシングルにして属性値をダブルに変更で動くと思うよ
- 842 名前:デフォルトの名無しさん mailto:sage [2023/07/10(月) 10:51:54.81 ID:ixw20e1S.net]
- シングルとダブルは変わりませんでした…
実際はPowerShellでメール本文内に変数を当てこむので シングルのままでいこうと思います あと下線だけ赤色は私の勘違いでした 赤下線の時は文字も赤くして問題なかったのでとりあえず解決しました お手数おかけしました ご助言くださった方ありがとうございました
- 843 名前:デフォルトの名無しさん mailto:sage [2023/07/13(木) 11:56:03.10 ID:cnmTEsiX.net]
- 二週間ほど前に自分で調べて書いたのに、どうやって書いて動かしたのか全く思い出せなくて困ってます
自分で自分が信じられないんですが、教えてください。 やりたいこと:Read-Hostで指定したフォルダに存在するフォルダを取得し、各フォルダに指定したファイルをコピーする 引っかかっている点: 1)$input = Read-Host "コピー先フォルダを指定" たとえばここでcopyと入力。規定のフォルダがC:\作業とする。 入力の結果、c:\作業\copyとして、ここにあるサブフォルダを取得したいので $inputをc:\作業\copyにしたい。 2)Get-ChildItem でディレクトリ名のみ取得するには? それでforeachでやってたと思うんですが・・・。
- 844 名前:デフォルトの名無しさん mailto:sage [2023/07/13(木) 13:50:42.52 ID:K8IsBXo8.net]
- Get-ChildItem -LiteralPath ([IO.Path]::Combine("C:\作業", (Read-Host "コピー先フォルダを指定"))) -Directory -Name
- 845 名前:デフォルトの名無しさん mailto:sage [2023/07/13(木) 17:51:09.66 ID:cnmTEsiX.net]
- >>829
わー初見のコード でもおかげでなんとかできました。ありがとう。
- 846 名前:デフォルトの名無しさん mailto:sage [2023/07/14(金) 04:02:22.77 ID:vOCFwCnb.net]
- 多分いままで書いてたコードはこれ
# 規定のフォルダのパスを作成 $parent = join-path 'c:\作業' $input # 上記パスのサブフォルダ作成 $names = ls -pspath $parent -di | % name 下記はエイリアス(関数の別名) ls := get-childitem % := foreach-object
- 847 名前:デフォルトの名無しさん mailto:sage [2023/07/14(金) 04:02:59.81 ID:vOCFwCnb.net]
- # 上記パスのサブフォルダ作成
↓ # 上記パスのサブフォルダ名を取得
- 848 名前:820 mailto:sage [2023/07/18(火) 17:12:35.63 ID:jBHsPJa3.net]
- >>822
遅くなりました。 set-location -pathで場所を指定したら、指定したフォルダのownerを取得できました。ありがとうございます。 get-Childitem -recruse -file ┃select-Object directoryName ,name ,extension ,Length Creationtime, lastACCESStime ,lastwriteTime, fullname ┃Export‐csv ‐Encodeing default xxx.csv と一緒にできなかったのが悔やまれます。
- 849 名前:デフォルトの名無しさん mailto:sage [2023/07/18(火) 18:02:52.05 ID:uMqw2ex7.net]
- そういう時はadd-memberするんだよ
- 850 名前:デフォルトの名無しさん mailto:sage [2023/07/18(火) 20:02:12.51 ID:x3+Ehzia.net]
- >>822の何がだめで、あるいは何が分からなくて、そのコマンドに組み込めなかったのか分からんな。
起点ディレクトリ自体の情報もCSVに含めたい、って事なのかな。
- 851 名前:デフォルトの名無しさん mailto:sage [2023/07/18(火) 22:45:48.56 ID:BpIlHiPB.net]
- powershellの学習曲線は険しい
本人が納得したならもうそれでいいだろう
- 852 名前:820 mailto:sage [2023/07/19(水) 08:31:15.42 ID:wWAjwZqt.net]
- >>835
そうです。
- 853 名前:デフォルトの名無しさん mailto:sage [2023/07/19(水) 15:47:04.50 ID:mqKqy4GV.net]
- ならこんな感じで。
$dirPath = "起点ディレクトリのフルパス" [IO.FileInfo]::new($dirPath) | %{$_; $_ | Get-ChildItem -Recurse -File} | Select-Object DirectoryName, Name, Extension, Length, CreationTime, LastAccessTime, LastWriteTime, FullName, @{N="Owner";E={($_ | Get-Acl).Owner};} | Export-Csv -Encoding Default xxx.csv CSVの出力先がフルパスなら、Set-Locationはいらない。
- 854 名前:820 mailto:sage [2023/07/24(月) 18:16:28.42 ID:yY3fBN5A.net]
- >>838
ありがとうございますm(_ _)m とりあえずownerを取得できました。列の入れ替えはPowerQueryで対処します。 neme,Extensio,owner,...したかったのですが。
- 855 名前:デフォルトの名無しさん mailto:sage [2023/08/02(水) 23:31:49.70 ID:8Lc0dkYb.net]
- Pythonでやったら楽なのに…と思う処理も他のメンバーに配る可能性を考えると泣く泣くpowershellでやることになる
嫌いな言語ではないけど凝った処理を書こうとすると見た目の癖が強いソースコードになりがち
- 856 名前:デフォルトの名無しさん mailto:sage [2023/08/05(土) 08:55:12.86 ID:4wFerhHK.net]
- Pythonは見た目の癖が強くないとでも?
- 857 名前:デフォルトの名無しさん mailto:sage [2023/08/05(土) 09:35:04.11 ID:wvUeqD5z.net]
- 泣く泣くpowershellに草
- 858 名前:デフォルトの名無しさん mailto:sage [2023/08/06(日) 22:29:47.72 ID:5CExyS7F.net]
- 質問なのですがパイプラインの結果を関数に渡して先頭からk番目を取り出すには一体どうすればorz
やりたいことはパイプラインの結果を検証する処理をサブルーチン化したい(k番目を取り出すのはその第一歩) とりあえず書いたがうまく行ってないやつ: function Test-RegEnt($reg_query_result, $exp_type, $exp_value) { $reg_query_result | Select-Object -Index 2 } Write-Output ("Test_A1:" + ($result | Select-Object -Index 2)) # 2行目が意図通りselectされる(" RegisteredOwner REG_SZ Admin") $result2 = Test-RegEnt($result, 'REG_SZ', 'Admin') Write-Output ("Test_A2:" + $result2) # A1と同じ結果になるかと思いきや、'Admin' になる
- 859 名前:デフォルトの名無しさん mailto:sage [2023/08/06(日) 22:31:40.76 ID:5CExyS7F.net]
- 先頭3行抜かしましたorz
$result = reg query 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion' /v 'RegisteredOwner' $cnt = 0 $result | ForEach-Object{ "TEST[$cnt}:" + $_; $cnt++ } この次に>>843のコード。
- 860 名前:デフォルトの名無しさん mailto:sage [2023/08/06(日) 22:48:34.72 ID:5CExyS7F.net]
- んまーなんかこれだとうまく行ったけんども思ってたのと違う……
function Test-RegEnt($exp_type, $exp_value) { $Input | Select-Object -Index 2 } $result = reg query 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion' /v 'RegisteredOwner' $cnt = 0 $result | ForEach-Object{ "TEST[$cnt}:" + $_; $cnt++ } Write-Output ("Test_A1:" + ($result | Select-Object -Index 2)) $result2 = ($result | Test-RegEnt('REG_SZ', 'Admin')) # パイプラインの結果を引数ではなくパイプで渡す Write-Output ("Test_A2:" + $result2) 実はパイプラインの結果(オブジェクトの配列)は関数引数に渡せなかったりするので
- 861 名前:?
つなみにfunctionの引数部分で [array]$reg_query_result としてみてもうまく行かなかった。 [] - [ここ壊れてます]
- 862 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 03:16:48.48 ID:SSXgsNNw.net]
- 文法が違う。
Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin' とか Test-RegEnt $result 'REG_SZ' 'Admin' とか。 または function Test-RegEnt { Param ( [Parameter(ValueFromPipeline=$true)] [string] $reg_query_result, [string] $exp_type, [string] $exp_value ) Begin { $cnt = 0 } Process { $cnt++ $idx = $cnt - 1 if ($idx -eq 2) { $reg_query_result return } } } $result | Test-RegEnt -exp_type 'REG_SZ' -exp_value 'Admin'
- 863 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 06:50:14.57 ID:L1yQ0BJe.net]
- >>846
レス㌧クス $Input利用(>>845)とBegin { } Process { }利用の違いはわかりた $resultが数億オブジェクトだったりしたら後者の方がパイプラインがスムーズに流れてよさげ(未検証 一方、 >実はパイプラインの結果(オブジェクトの配列)は関数引数に渡せなかったりするので?(>>845) については関数の呼び出し箇所が $result | Test-RegEnt -exp_type 'REG_SZ' -exp_value 'Admin' # (1) OK Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin' # (2) NG (エラー) やったから、これは「パイプラインの結果は関数引数には渡せない」((1)のように書くしかない)ということでFA?
- 864 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 06:54:08.66 ID:FZVMVghc.net]
- Select-ObjectのSkipとFirst使えばできるのでは?
- 865 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 06:56:57.16 ID:FZVMVghc.net]
- 関数でやりたいという要件を見落としていた
- 866 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 07:04:28.71 ID:FZVMVghc.net]
- >>843
> $result2 = Test-RegEnt($result, 'REG_SZ', 'Admin') $result2 = Test-RegEnt $result 'REG_SZ' 'Admin' でやりたいことはできるのではないでしょうか
- 867 名前:デフォルトの名無しさん mailto:sage [2023/08/07(月) 22:40:57.49 ID:SSXgsNNw.net]
- パイプラインと引数のどちらでも動くようにしたいなら
function Test-RegEnt { Param ( [Parameter(ValueFromPipeline=$true)] [string[]] $reg_query_result, [string] $exp_type, [string] $exp_value ) Begin { $cnt = 0 } Process { foreach ($item in $reg_query_result) { $cnt++ $idx = $cnt - 1 if ($idx -eq 2) { $item break } } } } あくまでシンプルめのサンプルなんでSelect-Object -Index 2と全く同じ挙動とか期待しないように。 ※作りこむならパイプが繋がってるのかチェックして分岐の処理書いたりする。 なお、大量のデータをパイプラインに流すのはお勧めできない。 パイプラインは途中での打ち切りとか難しいし、 結局は普通にループ処理書いた方が速いし制御しやすいし分かりやすい事が多い気がする。
- 868 名前:デフォルトの名無しさん mailto:sage [2023/08/10(木) 07:01:52.35 ID:3iQsMBl9.net]
- レス㌧クス、しかしながら大量データを引数で関数に渡すのはメモリ消費量、応答速度ともに悪くなることがわかったからやめるわサーセン;;;
どういうことかというと、bigfile.txtが(1行何か書いたいた後 Ctrl+A Ctrl+V Ctrl+V を22回反復とかで作った) 4194305行の巨大なテキストファイルだったとして、 function Test-FileContent([string[]] $lines) { $cnt = 0; foreach ($line in $lines) { $cnt++; Write-Host "cnt=" $cnt } } $lines = Get-Content .\bigfile.txt # (1) Test-FileContent($lines) # Get-Content完了後の結果を引数で渡す とするとお、「cnt= 1」が表示される前に(1)で永劫の時間待たされるますが、 function Test-FileContent() { $cnt = 0; foreach ($line in $Input) { $cnt++; Write-Host "cnt=" $cnt } } Get-Content .\bigfile.txt | Test-FileContent # Get-Contentが読んだら即パイプで渡す とすると*即座に*「cnt= 1」以降のカウントが始まる
- 869 名前:デフォルトの名無しさん mailto:sage [2023/08/10(木) 07:07:45.76 ID:3iQsMBl9.net]
- つなみに
>$resultが数億オブジェクトだったりしたら後者の方がパイプラインがスムーズに流れてよさげ(>>847) も検証すた、 >>847のレスポンスが即時のコードと似通っているが関数内でBEGIN { } PROCESS { }でなく$Inputをforeachループで回した場合、 すわなち function Test-FileContent() { $cnt = 0; foreach ($line in $Input) { $cnt++; Write-Host "cnt=" $cnt } } Get-Content .\bigfile.txt | Test-FileContent とすると、、「cnt= 1」が表示される前に永劫の時間待たされる、、、 というわけで、パイプライン(の後段まで)に大量のデータを無駄に流すなというのは真やが 生じてしまった大量のデータはむしろパイプラインにしか流さないのが正義……
- 870 名前:デフォルトの名無しさん mailto:sage [2023/08/10(木) 07:10:57.08 ID:3iQsMBl9.net]
- >>852の肝心のところに誤記が合ったスマンヌorz
*即座に*「cnt= 1」以降のカウントが始まるコードは正しくはこれ↓ function Test-FileContent() { BEGIN { $cnt = 0 } PROCESS { $cnt++; Write-Host "cnt=" $cnt } } Get-Content .\bigfile.txt | Test-FileContent
- 871 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 18:46:06.42 ID:I7dwFhkG.net]
- パイプの利点は個数を意識しなくて済むことだけど中断が一切できないしデメリットの方が多い
よっぽどの事情でもない限りコマンドレット自作しても遅いだけで良い事なんて1つもない 公式のselect -firstなんかはパイプの流儀に従ってないから似た事をしようとしてもあれ?って自らの間違いに気付くんだよ powershellの深遠を覗くとそのいい加減さにガッカリするだけ
- 872 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 19:17:06.70 ID:SL3m3m5F.net]
- 一番の利点はメモリの節約です
- 873 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 19:30:40.13 ID:I7dwFhkG.net]
- メモリなんて遅さで相殺される
powershell + 大量データ = 遅くて不採用
- 874 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 19:42:42.98 ID:bAYgNtyZ.net]
- >>857
使いどころを履き違えるとそうなる
- 875 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 19:56:15.04 ID:I7dwFhkG.net]
- >>858
パイプに希望を見てるのかな その認識では近く失望させられるだろう
- 876 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 20:07:52.72 ID:PQblbJTG.net]
- 一番良いのは、Windowsを使わない
これにかぎる こんなクソなOSを世界中から捨てるべき
- 877 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 20:09:59.59 ID:SL3m3m5F.net]
- Windowsは汎用事務処理端末としては競合なしだ
- 878 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 20:27:11.32 ID:SL3m3m5F.net]
- メモリ効率とスループットは交換できるようなものではない
手軽さが不要ならPythonでも使っておけばいい
- 879 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 21:36:23.24 ID:55Ub7uv5.net]
- いまだにPowerShellがWindows専用だと思ってるアホを真っ先に捨てるべき
- 880 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:05:41.72 ID:FP8PIUGD.net]
- で>>843の質問に戻るのですだが、動かなかったのは単純だが根本的な誤解してたのが原因……
C/C++と同じだろうというつもりで >$result2 = Test-RegEnt($result, 'REG_SZ', 'Admin') という呼び出し方に書いたが、これだと「Test-RegEntの第一引数$reg_query_resultに「配列」@($result, 'REG_SZ', 'Admin')を渡す」という意味になる ので、関数内で >$reg_query_result | Select-Object -Index 2 とやったら当然そのindex=2の要素 'Admin' が関数の出力となってた、というしくみ
- 881 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:07:08.58 ID:FP8PIUGD.net]
- 正しくは>>846式に
>Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin' またはその省略表記としては >Test-RegEnt $result 'REG_SZ' 'Admin' # カンマ区切りではなくてスペース区切り にせねばならなかった ことがわかったorz 止むにやまれない事情で昨日一日で1500行書いてデバッグしたらその過程でわかった|||。n_
- 882 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:11:54.59 ID:FP8PIUGD.net]
- あと他のスクリプトをincludeするときの欠き方が気づかないとわかりにくい……
util.ps1 を同じフォルダにある someapp.ps1 からインクルードする場合は '.\util.ps1' ではダメで、 .'.\util.ps1' にしないとutil.ps1で定義した何物も呼び出せないorz ここで先頭の「.」はutil.ps1のスクリプトスコープを呼び出し元のスコープと同じにするという意味やがちょう紛らわしい……
- 883 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:20:54.21 ID:FP8PIUGD.net]
- あと関数内においては代入文、[void]にキャストした文、if文とかの条件式 を除く全ての文が出力を持つ、
という仕様のせいで危うく恐ろしいバグを作り込むところやった;;; function Show-ErrDlg($msg) { $wsobj = new-object -comobject wscript.shell $wsobj.popup($msg, 0, 'エラー', 0 -bor 16) }
- 884 名前:function Test-Equipment1() {
$result = (何かのテスト) if (!$result) { Show-ErrDlg('何かのテスト failed.') } return $result } でとするとテストが失敗したときも [] - [ここ壊れてます]
- 885 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:25:27.54 ID:FP8PIUGD.net]
- if (!(Test-Equipment1) { exit 1 }
(テスト正常終了の表示処理) でテスト正常終了の表示が出るorz これは何でかというと$wsobj.popup($msg, 0, 'エラー', 0 -bor 16) 」がクリックされたボタンの番号を出力する結果、$resultがまたしても配列 @( (「なんかのテスト」の結果), ($wsobj.popup()でクリックされたボタンの番号) ) となりこれが Test-Equipment1() の戻り値となり、それをif文で評価したら最後の要素
- 886 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:27:54.43 ID:FP8PIUGD.net]
- (OKボタンのコード6)と評価されるため、!6なので常に偽になるというしくみ、、、、
こう修正すたら直った function Show-ErrDlg($msg) { $wsobj = new-object -comobject wscript.shell [void] $wsobj.popup($msg, 0, 'エラー', 0 -bor 16) # [void]付ける } わかるかこんなもん…… および原理的にlint的な機械的チェックもできない……
- 887 名前:デフォルトの名無しさん mailto:sage [2023/08/11(金) 23:35:32.35 ID:FP8PIUGD.net]
- これはデフォルトで出力無しとして、
なんかの接頭辞を付けた文だけが結果がパイプに出力されるるようにする仕様であるべきだった希ガス (出力が無いというミスはすぐ気づける てかWrite-Outputを省略可能としているのがそもその誤り…… ※ 個人の感想です いっぱい連投したがTeamsのつもりでShift+Enterしたら投稿されてしまったせいやスマンヌorz いじょ
- 888 名前:デフォルトの名無しさん 転載ダメ mailto:sagete [2023/08/12(土) 00:58:59.52 ID:H+b+A9qi.net]
- ============================
function Hoge([int]$num) { echo "Debug" return ($num + 1) } $a = Hoge(1) echo $a ============================ こうすると $a には Debug と 2 の2つが入る ============================ function Hoge([int]$num) { .{ echo "Debug" } | Out-Null return ($num + 1) } $a = Hoge(1) echo $a ============================ こうすると $a には 2 の1つしか入らない 不要なところは 「 .{ ~~~ } | Out-Null 」で表示を抑制したら楽になるかも
- 889 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 01:19:17.04 ID:DbL0Mu2X.net]
- >>843に言える事はパイプで何番目とかいう考えは捨てた方がいい
パイプは途中で処理を打ち切る機能が欠落してるから何番目だけに用があろうが全ストリームを読み終わるまで終わらない
- 890 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 08:19:31.33 ID:IRt4i0hm.net]
- ほぼ誤差だが |Out-Null より $null= で処理した方がパフォーマンスがよく、可読性も高い
- 891 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 08:23:13.14 ID:ueiwXwrP.net]
- PowerShell スクリプトのパフォーマンスに関する考慮事項
https://learn.microsoft.com/ja-jp/powershell/scripting/dev-cross-plat/performance/script-authoring-considerations
- 892 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 22:00:12.59 ID:pISu+im0.net]
- >>872
わかりた パイプラインの打ち切りは、実現方法はあるが円満な解決方法はなさげ(どれもこれもなんかしらのミソがつく パイプで$n番目、というだけならSelect-Objectしたらv3以降ならn+1番目以降を打ち切ってくれる $n = 2 Get-Content .\bigfile.txt | Select-Object -Index $n | Foreach-Object { Write-Output "cnt=${n}: $_" } # bigfile.txtが1億行あっても瞬時に戻って来る が、これは「Select-Object -Index ~」部分を関数化したら元の木阿弥になる function Select-Nth($n) { $Input | Select-Object -Index $n | Foreach-Object { Write-Output "cnt=${n}: $_" } } Get-Content .\bigfile.txt | Select-Nth(2) # bigfile.txtを1億行全部読み込んでからおもむろに出力する 構文的に$_を使った関数やフィルタとしては書けない データを見て条件が成立したら打ち切り、というのになるともっとマンドクセ…… https://winscript.jp/powershell/308
- 893 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 22:23:22.94 ID:pISu+im0.net]
- >>871
それな! ワカル ㌧クス、 >>873 わかりた function Hoge([int]$num) { [void].{ echo "Debug" } return ($num + 1) } $a = Hoge(1) echo $a でも逝けた
- 894 名前:デフォルトの名無しさん mailto:sage [2023/08/12(土) 22:55:15.75 ID:zGmVrirz.net]
- 関数の出力が意図せず(うっかり)複数個所から行われ分かりにくい点は
バッチとかシェルスクリプトの挙動に合わせすぎた為だろうね。 例えばping.exeを対象2か所に実行するバッチ(.bat)をパイプで繋げたら、 バッチ1つの実行で、ping2回の20行程度がパイプに流れる。 PowerShellスクリプトや関数もこれと同じだと考えればそんな違和感ないはずなんだけど、 元々他の言語なんかで「関数の戻り値は1つ(明示的な1つor関数末尾の1つ)」とか 「明示的に変数格納や出力などしなければ、メソッドや関数の戻り値は捨てられる」 って事に慣れてるし、PowerShellも同じ文法だから同じ挙動を期待しちゃう。 上でも出てるけど、標準ではパイプに流さない仕様とした方が 敬遠される点が減ったと思う。
- 895 名前:デフォルトの名無しさん mailto:sage [2023/08/14(月) 13:31:51.80 ID:4NX3l0Vm.net]
- パイプはスレ違いのバッチスレでドヤ顔ワンライナーするぐらいしか能が無いと言っても過言
- 896 名前:デフォルトの名無しさん mailto:sage [2023/08/14(月) 21:15:06.40 ID:5teSXOgl.net]
- 1GiB程度のファイルを処理するときにはパイプは重宝するよ
- 897 名前:デフォルトの名無しさん mailto:sage [2023/08/15(火) 05:53:15.07 ID:WIzBRZyi.net]
- バッチファイルのパイプはメカニズムが違う
あれは実質一時ファイルを作って次段に渡しているだけなので遅い、と言おうと思ったが "*<CR><LF>" を2^23個書き並べたbigfile.txtに対してコマンドプロンプトで type bigfile.txt | find /C "*" とやったら「瞬時に」 4194304 と返って来るのに、PowerShellで Get-Content .\bigfile.txt | find.exe /C "*" とやったら永劫の時間待たされた後 FIND: パラメーターの書式が違います と言われた後Ctrl+Cにも応答しなくなた……どうなってるのこれ……
- 898 名前:デフォルトの名無しさん mailto:sage [2023/08/15(火) 14:11:57.72 ID:e55ZiwZ3.net]
- そりゃパイプで外部コマンドに送ったら1行ずつfind.exe実行して終了するだろうから
おかしなことにもなるだろうよ
- 899 名前:デフォルトの名無しさん mailto:sage [2023/08/15(火) 15:18:16.71 ID:qi/dYdNU.net]
- > あれは実質一時ファイルを作って次段に渡しているだけなので遅い
それはシングルタスクだったDOS時代の話だろ NTのcmd.exeには当てはまらない
- 900 名前:デフォルトの名無しさん mailto:sage [2023/08/15(火) 15:39:41.88 ID:LS4gbGEC.net]
- cmd.exeはパイプやfor /Fのコマンドとかワーカースレッドを生成して
別タスク(子環境)としてデータの送り手や受け手を作ってるかな
- 901 名前:デフォルトの名無しさん mailto:sage [2023/08/24(木) 22:36:16.57 ID:W+JHQ2GG.net]
- Get-WinEventでSystem.evtxだかのファイルを処理させるとコマンドレットが終了しても一定時間プロセスがファイル掴みっぱなしになるのどうにかしてくれ
わざわざ別プロセスでGet-WinEvent用のpowershell起動させる間抜けなコードになったぞ
- 902 名前:デフォルトの名無しさん mailto:sage [2023/08/25(金) 11:28:27.28 ID:WAOpDjEy.net]
- 処理速度都合なのかな〜って思ってるけど閉じる手段は提供して欲しい。
自分は.NETのクラス使って処理書いちゃった。
- 903 名前:デフォルトの名無しさん mailto:sage [2023/09/04(月) 19:42:45.42 ID:hSX1x29k.net]
- エクスプローラでファイル選択してコピーして
(Get-ClipBoard -Format FileDropList).GetType().ToString() → System.Collections.Generic.List`1[System.Management.Automation.PSObject] うん。 Get-ClipBoard -Format FileDropList | %{$_.GetType().ToString()} → System.Collections.Generic.List`1[System.Management.Automation.PSObject] うn? foreach( $info in Get-ClipBoard -Format FileDropList ){ $info.GetType().ToString() } → System.Collections.Generic.List`1[System.Management.Automation.PSObject] えぇ… Get-ClipBoard -Format FileDropList | %{$_} | %{$_.GetType().ToString()} → System.IO.FileInfo … [System.IO.FileInfo[]](Get-ClipBoard -Format FileDropList) | %{$_.GetType().ToString()} → System.IO.FileInfo うーん… $list = Get-ClipBoard -Format FileDropList $list | %{$_.GetType().ToString()} → System.IO.FileInfo まぁ… なんか不必要に使いづらい気がするのは自分だけかな。
- 904 名前:デフォルトの名無しさん mailto:sage [2023/09/06(水) 19:07:34.39 ID:1kNnDW8h.net]
- $(Get-ClipBoard -Format FileDropList) | %{$_.GetType().ToString()}
→ System.IO.FileInfo バッドノウハウの領域だなー
- 905 名前:デフォルトの名無しさん mailto:sage [2023/09/12(火) 10:37:58.96 ID:EIIMdpOe.net]
- 隠し属性が設定されたファイルが排他されてるとかで読めない状況のときに
-ForceついたGet-Contentで読もうとすると隠し属性解除されるのは理由あるんだろうか
- 906 名前:デフォルトの名無しさん mailto:sage [2023/09/12(火) 13:50:19.66 ID:KE5ufRbn.net]
- 質問で申し訳ない
AccessでエクスポートしたxlsxをPowershellでComObjectを作成してOpenしたいんだけど 破損している云々で発行元を信用しますか?ってダイアログのせいでOpen出来ない https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbooks.open ここによると15個目の引数で1を指定(xlRepairFile)すれば良さそうなんだけど Powershellで実行するとOpenプロパティが無いよって怒られる。 実際のコードはこう $excel = New-Object -ComObject Excel.Application $excel.Visible = $True $fileName = (Get-ChildItem "test.xlsx").FullName $book = $excel.Workbooks.Open($fileName, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, 1)
- 907 名前:デフォルトの名無しさん mailto:sage [2023/09/12(火) 16:40:21.35 ID:OgaNelN6.net]
- CSVでエクスポートしなよ
- 908 名前:デフォルトの名無しさん mailto:sage [2023/09/12(火) 17:47:39.83 ID:EIIMdpOe.net]
- とりあえずこうすると回避できた。
using namespace Microsoft.Office.Interop.Excel $excel = New-Object -ComObject Excel.Application $excel.Visible = $True $fileName = (Get-ChildItem "test.xlsx").FullName $param = @([Type]::Missing) * 15 $param[0] = $fileName $param[14] = [XlCorruptLoad]::xlRepairFile $workbooks = $excel.Workbooks $book = $workbooks.Open.Invoke($param)
- 909 名前:デフォルトの名無しさん mailto:sage [2023/09/12(火) 18:53:31.49 ID:uneKtCE6.net]
- >>891
あざす!めっちゃ参考になるます
- 910 名前:デフォルトの名無しさん 転載ダメ mailto:sagete [2023/09/13(水) 02:20:54.13 ID:E0UN4wqY.net]
- $param = @([Type]::Missing) * 15
は $param = @([Type]::Missing) * 0xFF のほうが人にやさしい気がする
- 911 名前:デフォルトの名無しさん mailto:sage [2023/09/13(水) 07:53:07.83 ID:mwnND43t.net]
- は?
- 912 名前:デフォルトの名無しさん mailto:sage [2023/09/13(水) 09:33:15.43 ID:ozJmt5GG.net]
- ひ?
- 913 名前:デフォルトの名無しさん mailto:sage [2023/09/13(水) 23:41:10.61 ID:tgD8Mqqk.net]
- >>893の後者は配列に255を掛けてるように見えるのだが
人にやさしい部分てどこ?
- 914 名前:デフォルトの名無しさん mailto:sage [2023/09/14(木) 03:25:22.93 ID:37z8xtDS.net]
- マスクしてるのかと思ったわ
ちゃんとソース見てなかった すまんこ
- 915 名前:デフォルトの名無しさん [2023/09/16(土) 23:53:08.17 ID:DkE7QlfD.net]
- PowershellのGUI使って簡単な時報を作りたい。
System.Windows.Forms.Timerを使って作ったんだが今何時判定で$Aの数字が毎回リセットされるんでIntervalの回数だけ別ウィンドウが開きまくる。 使い方間違ってるか?教えてくれさい。 $timerTestTick { 【適当に現在時表示】 if(【指定した時間になったら】-and【$Aがtrueなら】){ start-prosess 【音楽ファイルを別ウィンドウで再生して処理継続】 $A = false } } $timerTest.Add_Tick($timerTestTick) $timerTest.Interval = 200 $timerTest.Enabled = $TRUE $timerTest.Start() 【適当にフォーム作って表示】
- 916 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 01:59:03.31 ID:ENG0J7cr.net]
- >$Aの数字が毎回リセットされるんで
それ$Aを更新しようとする度に毎回スクリプトブロックで別の$Aが生成されるからやね ([ref]$A).Value = $false と書けば元の$Aを探しにいくから更新できると思う Powershellのはまりポイントの1つやね
- 917 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 03:18:20.18 ID:LjIc1dUH.net]
- powershellでGUIって、c#使えない宗教的理由でもあるの?
- 918 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 05:45:06.34 ID:5It5oWIy.net]
- >>899
スクリプトブロックていうのが働いてるのか。とりあえず試してみるありがとう。 >>900 宗教的理由というより書けないから出来ることで色々やってみてた。 というかPowerShell単体でC#つかえるの?
- 919 名前:デフォルトの名無しさん [2023/09/17(日) 09:35:27.80 ID:LYUgOkBe.net]
- PowerShellでGUI作れるんか!
知らんかった これは興味ある
- 920 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 09:48:58.34 ID:oJeCWV6s.net]
- >>902
システム管理のサンプル スクリプト https://learn.microsoft.com/ja-jp/powershell/scripting/samples/sample-scripts-for-administration 公式ドキュメントならここの「UI 要素の作成」って所を見てみるといい
- 921 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 13:31:47.95 ID:LJFSWd1b.net]
- GUI作れるとかマジか
ワザワザHTMLソース内部に仕込んでWEBベースでやりとりしてた俺は一体・・・
- 922 名前:デフォルトの名無しさん mailto:sage [2023/09/17(日) 14:04:19.59 ID:ENG0J7cr.net]
- 一応.NET言語の1つではあるからGUIは普通に作れるが
俺はC#コード埋め込んでFuncやAction経由で必要時にpowershellと連携する感じの使い方だな Powershellのコードだけで作るの自体が割と面倒なのや型チェックが働かない辺りとかかあんまメリットを感じない
- 923 名前:デフォルトの名無しさん mailto:sage [2023/09/26(火) 21:32:36.63 ID:cR6Dxv5m.net]
- htaの代わりとしてforms呼び出して組んでたけどcssが便利すぎて最近は使ってないな...
wpfはどうなんだろうか...
- 924 名前:デフォルトの名無しさん mailto:sage [2023/09/29(金) 04:49:25.46 ID:wxGTflxT.net]
- まじでかいな
- 925 名前:デフォルトの名無しさん [2023/10/01(日) 14:37:52.98 ID:nRV7BOcHv]
- 防災訓練とか災害ボランティアって工ラヰなーとかスコ゛ヰなーとか思われるとでも思っちゃってるのかな
都心まで数珠つなぎて゛騒音に温室効果ガスにコロナにとまき散らさせて気候変動させて海水温上昇させて地球破壊して 日本どころか世界中で土砂崩れに洪水、暴風、熱中症、森林火災にと災害連發させて JALだのАΝΑだのクソアイヌドゥだの酒飲んで業務してるクサイマークだのゴキブリフライヤ−だの殺人テ囗リストに 天下り賄賂癒着してる世界最悪の殺人腐敗テロ組織公明党斉藤鉄夫ら国土破壊省をスル一しながら何寝ぼけたことやってんだかな こういう安易な自己満足が気候変動テロを肯定してさらなる多くの人々を死に追いやってることを自覚しろや力ス 憲法カ゛ン無視で人権に財産権にと侵害して威力業務妨害して私腹を肥やしてる諸悪の根源を殲滅して 災害の連発を食い止めることこそ本質だといい加減、気づけやオナニーバカ (羽田)ttps://www.call4.jp/info.php?Type=itеms&id=I0000062 , ttΡs://haneda-Рroject.jimdofreе.com/ (成田)ttps://n-souonhigaisosyoudan.amebaownd.com/ (テロ組織)тtps://i.imgur.com/hnli1ga.jpеg
- 926 名前:デフォルトの名無しさん [2023/10/06(金) 21:47:54.00 ID:ESX4xHYZ.net]
- 日付を元に指定範囲内の一意の数字を出すってできる?
200ぐらいある今日の一言的なものを毎日ランダムで出したいんだがアプリケーションを再起動すると変数リセットされて別の単語出てしまうのを抑止したい。
- 927 名前:デフォルトの名無しさん mailto:sage [2023/10/06(金) 22:00:29.66 ID:7j+1PDTD.net]
- その日の初回の結果をファイルに出力して
2回目以降はそのファイルを読み込みに行けば良いのでは
- 928 名前:デフォルトの名無しさん [2023/10/06(金) 22:04:29.98 ID:ESX4xHYZ.net]
- >>910
それしかないかなぁ ファイル出力を避けたかったんだが
- 929 名前:デフォルトの名無しさん [2023/10/06(金) 22:35:50.48 ID:ESX4xHYZ.net]
- >>910
できそうだからファイル出力の方向でやってみるありがとう。
- 930 名前:デフォルトの名無しさん [2023/10/06(金) 22:36:00.82 ID:ESX4xHYZ.net]
- >>910
できそうだからファイル出力の方向でやってみるありがとう。
- 931 名前:デフォルトの名無しさん mailto:sage [2023/10/06(金) 23:26:20.49 ID:WmRjQTiM.net]
- その条件なら日付をシード値とみなせるんだから
別の単語が出てくる方がおかしいんじゃないのか 基礎的な論理思考力が欠けているね
- 932 名前:デフォルトの名無しさん mailto:sage [2023/10/06(金) 23:44:27.78 ID:7j+1PDTD.net]
- あ、-SetSeedって完全固定の疑似乱数なのか。
再起動したら変わると思ってた。
- 933 名前:デフォルトの名無しさん mailto:sage [2023/10/07(土) 04:01:41.30 ID:lBZtWf6D.net]
- Get-Random -SetSeed $(Get-Date -Format "yyyymmdd") -Maximum 200
- 934 名前:デフォルトの名無しさん mailto:sage [2023/10/07(土) 06:18:44.31 ID:xTEoYklV.net]
- >>916
seedなんてもんがあったのか! ありがとう!
- 935 名前:デフォルトの名無しさん mailto:sage [2023/10/07(土) 15:47:42.69 ID:lBZtWf6D.net]
- 912 と 913 をワンライナーで視覚化しただけやぞ
- 936 名前:デフォルトの名無しさん mailto:sage [2023/10/08(日) 20:27:09.33 ID:bO8eXdHU.net]
- >>906
wpfも普通にいけるけど、vsのデザイナーがないと厳しいから、じゃあc#でいいかとなりがち htaの代替としたらwpfかwinformで枠だけ作ってwebview2埋め込むのがおすすめ qiitaでも記事があったはず
- 937 名前:デフォルトの名無しさん mailto:sage [2023/10/08(日) 22:07:55.52 ID:SlOLtELZ.net]
- webview2ランタイム自体の埋め込み手段がなあ
- 938 名前:デフォルトの名無しさん [2023/10/20(金) 16:26:02.69 ID:3co0KDj6.net]
- こんにちは
フォルダの配下のすべてのテキストファイルを結合した文字列を出力したいです フォルダ直下のファイルだけなら Get-Content *.txt でできました 該当するファイルの一覧は Get-ChildItem -Recurse -Filter "*.txt" -Name でできましたが Get-ChildItem -Recurse -Filter "*.txt" -Name | Get-Content としてもエラーになります
- 939 名前:デフォルトの名無しさん mailto:sage [2023/10/20(金) 19:30:02.44 ID:qU4/oN+w.net]
- 「 -Name」が不要。
- 940 名前:デフォルトの名無しさん mailto:sage [2023/10/20(金) 20:49:00.72 ID:3co0KDj6.net]
- できました!
- 941 名前:デフォルトの名無しさん mailto:sage [2023/10/31(火) 16:01:28.45 ID:Vjqv9VpS.net]
- PSNativeCommandPreserveBytePipe が楽しみすぎる
|

|