【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
仕様があいまい
最後と言う言葉があいまい。
全体の文章の最後なのか、最終行を指すのか、どちらか分からないから
最終行だけがチェック対象なのか?
それとも、最終行以外も対象になるのか? >>632
>最終行が"てすと"じゃなかった場合は、"てすと"を追記したいです
これも、最終行が改行で終わっている場合と、終わっていない場合で、動作が変わる
abc\n → abc\nテスト
abc → abcテスト
上は、最終行の次の行に追加されるけど、
下は、最終行に追加される $path = "Documents\hoge.txt"
$text = "てすと"
$file = @(Get-Content $path)
for($i = $file.count; $i -ge 0; $i--)
{
if($file[$i] -match "^\s*$")
{
continue
}
if($file[$i] -match ".*$($text).*")
{
$file[$i] = $text
} else {
$file[$i] += "`n" + $text
}
break
}
$file | Out-File $path
Powershell勉強中なんだけどこんな感じ? 正直今のところ頂いた回答の中では>>658さんの回答が模範解答でした。 >>698
良いんだけど、>>658は>>681で言う三番目で、希望は一番目らしいから、あと一工夫だね
正直もう飽きたから他の人がんばって >>697でいいやん
自分の趣味じゃないから読みにくいけど、条件は満たしてる PSはマルチスレッド気軽に使えないの?
ググるとリモート、マルチプロセスとRunspaceのサンプルばっかり出てくるんだが
2.0だとTaskも無いからキビシイのかね >>702
つかえるんじゃない?
どんな処理をしたいということなの。 いやーなんかねHttpListenerのBeginGetContextでクラッシュするんです
マルチスレッド対応してないのかなと マルチスレッドというより(マルチスレッドだけど)
それが非同期に対応しているかという話ね。 原因わかった
別スレッドだとrunspaceが無いからpowershellコードが動かんのだとさ こんな記事あるけど使える?
RunspacePoolを使って、PowerShellを非同期実行
https://www.gmo.jp/report/single/?art_id=195 >>707
今日はそれを調べてた
GetContext使ってメインスレッドで同期的にコンテキストを受けて
ルーティング処理〜レスポンス閉じるまでをrunspaceでOneWay非同期処理するといい感じで動作してるっぽい >>279
こいつアホすぎてムカつく
わからんなら黙ってろかす! TrustedInstallerのままなのはOS不具合かな
最近こういうの放置でアップグレードしてくから困る 聞いてくれやおじさん
UIautomationとやらを探して2日たらし回しにされた
psのgui自動化ツールはこれでええのか 確かに探すの難しくなってるな
UI Automation PowerShell ExtensionsのDownload(再配布)
ttps://www.code-lab.net/?page_id=21648 UIautomationって旧来技術ってことでWin10では
あらたなことは行わないんじゃないのかな。
たしかGUIがWPFだよね。 ISE
VSCode
Visual Studio 2017
でPowerShell開発やってみたけど一番快適にDebugできるのはVSCodeだった 実行ポリシーを変更をBypassに変更してるんだが
.ps1ファイルを実行しようとすると1日1回くらい(その日の最初?)は以下の文章が出る
出なくする方法ありますか?
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"):
ちなみにGet-ExecutionPolicyすると
ちゃんとBypassと表示される コンテキストメニューから実行してるなら、関連付け設定が
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
になってるから、Set-ExecutionPolicy -Scope Process Bypass を実行するところでそれが出るんだと思う
関連付け設定を変えれば出てこなくなるよ ありがとう
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"に変えてみた
ついでにダブルクリックだけで実行できるように変えたら便利になった csvの中に時間とデータの2列あって、それの直線近似した切片を取りたいんだけどアルゴリズム組まないとだめ?
なおエクセルは入ってないパソコンで使いたい。 pythonでpandas+leastsquare >>720
単に公式に当てはめればいい
$data = import-csv "csvのパス" -Header X,Y
$meanX = $data.X | measure -Average | select -expand Average
$meanY = $data.Y | measure -Average | select -expand Average
$sd = $data | foreach { ($_.X - $meanX) * ($_.X - $meanX) } | measure -Average | select -expand Average
$cd = $data | foreach { ($_.X - $meanX) * ($_.Y - $meanY) } | measure -Average | select -expand Average
$slope = $cd / $sd
$meanY - $slope * $meanX >>720
Accord.Net使えばいいよ
それか今ならML.NETが良いのかね? >>722
ありがとうございます。簡潔に書かれていてすごい。
>>721
pythonでも出来るのですが、エクセル含めソフトインストールできないPCでの運用なので エクセルも使えない環境でデータ分析なんて
とんでもなく非効率だな
現実にはよくありそうな話だけど 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
GWRI8 >>726
装置とそれを制御するソフトウェアが入った専用PCが連動して動く仕組みのシステムで、そのPCのデータをその中で処理したいと思ってて。
大型の装置で、もし誤作動を起こしたら火災や死亡事故もあり得るのでソフト導入は難しい状況。エクセルくらいは問題ないと思うんだけど、許可下りず。 人命にかかわるならPowerShellでもだめだろ 線形回帰分析のためだけにエクセルを導入しようとする高レベルVBAエンジニアさん命を握られてしまった従業員さん 今回だけじゃなくて別のデータ分析する
機会も出てくるかもしれないだろ
エクセルに限らずソフトがインストールできないんじゃ
いろいろ車輪の再発明することになりそう そういう機会がなんども出てきてから検討すればいいよ
まあそうなったらエクセルじゃなくてデータ解析に適したツールを導入するべきだろうけどね
VBAerさんはとにかくVBAを使いたいって目的が先行するから困る なんでもかんでも再発明が悪という風潮はよろしくない
少量の些細な再発明を避けるために大規模なソリューションを導入すると
そのソリューションの管理コストや障害リスクの方が高くなってしまう なんで制御PCと同じのでやろうとしてるのか?
そもそもwi そういう設定なんだなというのは皆わかった上でディスカッションしてる
なので野暮なツッコミは無しにしようや >>735
今はデータをUSBで他のPCに移してから処理してる。
制御PCでやりたい理由は、USBはパスワード付きっていうのもあって面倒で、しかも常に最新の情報を求められるため日に数回USBで出し入れすることになるのでより面倒。
それが毎日となるとめちゃくちゃ面倒。
ということで不慣れなpowershell でやろうとした次第です。 別PCでC#の解析用アセンブリ作ってPowerShellから呼び出したらいいんじゃないの オフラインです。C♯は難しそうなので。
すみません、私事を語り過ぎました。元の話題に戻ってどうぞ 死亡事故が起こるようなマシンだろ
俺なら通常はネットから切り離しとくわ いや現実の問題設定は良い刺激になったよ
そういうのないと同じ話題がループしちゃうし そのPCで処理しても結局USBで持っていかないと駄目なんじゃ AddTypeでNuGet Packageを参照に追加できれば便利だと思うんだがなぜないんだろ
いちいちpackageダウンロードしてzip解答してdll探してAddTypeするの面倒くさい
AddType -PackageSource https://api.nuget.org/v3/index.json -PackageName Oracle.ManagedDataAccess -Version 12.2.1100
$connection = New-Object -TypeName Oracle.ManagedDataAccess.Client.OracleConnection
こんなんできたら絶対便利だろ こういうのは末端のユーザーじゃなくMicrosoftが責任持って整備すべき仕事だよなぁ >>747
Visual Studioだと全部やってくれるのにな csv読み込みのときに、♯が入ってる行が消えるのですが回避方法あるでしょうか?
バージョンは2のため、cat|convertfrom- csv を使っています。 cat|♯を消す処理|convertfrom- csv 半角井桁でも全角井桁でもなくシャープがダメ文字ってことなら、いわゆる機種依存文字に対して内部的に文字化けしてるのかね
Get-Contentの-Encodingパラメーターを変えて試行錯誤してみるのはどうだろ >>753
おっしゃる通りcat時点ではシャープのある行も問題なく表示されていたのでそこでシャープを適当な文字列に置換する事で回避出来ました。
なお文字化け等では無かったためencodingは関係ありませんでしたが、お二方ともアドバイスしていただきありがとうございました。 >>756
そんな仕様初めて聞いた
Excelは#で始まる行も読み込むよ >>756
そういう仕様なんだね。
プログラム内じゃないんだから勝手にコメントアウトしないで欲しい RFCではCSVのコメントなんて定義されてないんだがな
#がコメントとか方言です 「♯を含む行」が消えるって言ってるんだから、実は「#で始まる行」が消えてた、なんてことは流石にないでしょう と思って検証したらマジじゃねーかバーロー
v2では使えないけどcat -raw|convertfrom-csvなら無視されなくなるから、#がCSVコメントとして無視されてるのではなくて、#をコメント行相当のオブジェクトとして返しているGet-Content側がタチ悪いという話じゃないだろうか PCに入ってるPowerShellのバージョンを簡単に切り替える方法はないのでしょうか?
作成したスクリプトがバージョン2でも3でも動くか等の検証を行いたいのですが? ISEがインテリセンス使ったら落ちてたのが
KB4100403で修正されたらしい(未確認) エクセルに書き込む時、例えば
for(i=1; -le 1000;i++){
sheet.cells.item(i,1)=i*5
}
こんな感じにすると非常に動作が遅いのですがもっと高速にする方法はあるでしょうか。
なおvbaでは、
for i=1 to 1000
arr(i,1)=i*5
next
と配列に入れておいてから、
oSheet.Range(oSheet.Cells(1, 1), oSheet.Cells(UBound(arr, 1), UBound(arr, 2))) = arr
と一括で書き込むと速いのですが、PSでもこのような書き方はあるでしょうか。 >>769
速いかは知らんけどそれと同じようにするならこんな感じかね
$n = 1000
$arr = New-Object "object[,]" $n,1
1..$n | foreach { $arr[($_-1),0] = [int]$_*5 }
$sheet.Range($sheet.Cells.Item(1, 1), $sheet.Cells.Item($n, 1)) = $arr >>770
ありがとうございます。多次元配列を使えばよいのですね。
webで調べると多次元配列と多段階配列(ジャグ配列)がごっちゃになってるサイトもあって混乱していましたが、770さんの簡潔な記述をみて理解出来ました。 PowershellからExcelのユーザフォーム(コマンドボタン)を非表示かクリックできないようにしたいのですが、いくつか試してもうまく設定できませんでした。
ご存知の方がいたら、ご教示いただければ。 >>773
別のインスタンスからフォームを操作するってこと?
参考にVBAだとどうやるの? 以下で動くことは確認しましたが、できたらPowershellだけで完結したいです。
$excel = New-Object -ComObject Excel.Application;
$book = $excel.Workbooks.Open('〜ファイル名〜');
$num1 = $excel.Worksheets.count ;
$array = @() ;
for ( $i1 = 1 ; $i1 -le $num1 ; $i1++ ){ ;
if ( $excel.Worksheets.Item($i1).name.substring( 0, 4 ) -eq 'xxx_' ) { ;
$array += $excel.Worksheets.Item($i1).name ;
} ;
} ;
for( $i2=0; $i2 -lt $array.count; $i2++){ ;
$shtname = $array[$array.count-$i2-1] ;
$MDB_index = $excel.Worksheets.Item('MDB').index ;
$excel.Worksheets.Item($shtname).move( $excel.Worksheets.Item( $MDB_index ) ) ;
$excel.Worksheets.Item('MDB').move( $excel.Worksheets.Item( $shtname ) ) ;
$excel.Worksheets.Item($shtname).name = 'yy_' + $shtname.substring( 4, $shtname.length - 4 ) ;
} ;
$excel.run("Unable") * VBAのUnableの中身 ;
Sub Unable()
Dim SHTNAME As String
Dim NUMBER As Integer
Dim I1 As Integer
NUMBER = ThisWorkbook.Worksheets.Count
For I1 = 1 To NUMBER
SHTNAME = ThisWorkbook.Worksheets(I1).Name
If Mid(SHTNAME, 1, 3) = "yy_" Then
ThisWorkbook.Worksheets(I1).CBT1.Enabled = False
End If
Next
End Sub >>776
xxx_のシートをMDBの後ろに並べたいってことでいいんかね?
$book.Sheets[$book.Sheets.Count..1] | where { $_.name -like "xxx_*" } | foreach {
$_.move([Reflection.Missing]::Value, $book.Sheets("MDB"))
$_.name = $_.name -replace "^xxx_","yy_"
$_.OLEObjects("CBT1").Enabled = $false
} >>778
VBAに依存せず実行できました。感謝。 windows10ですが
Get-ItemPropertyでLastWriteTimeを見てみると
エクスプローラで表示される更新日時と異なるファイルが有りました
更新日時の方が作成日時より前の日付になってるので
おそらく LastWriteTimeの方が正しい日付だと思います
これを訂正するためにPSからエクスプローラの更新日付を取得したいのですが
エクスプローラの更新日時がどこから来ているものかさっぱりわかりません いくつかファイルを調べてみると、更新日時とLastWriteTimeの差が一週間離れているのも有るので
タイムゾーンの問題とは考えにくいです
よく見ると、作成日時もCreationTimeと10日くらいのずれが有りましたw
エクスプローラが詳細プロパティ以外の日付を参照してる意味が分かりません
windowsの強制メジャーアップデートで何度かクラッシュした影響でファイルが壊れてるのかも 「書き込みがあったら反応しよう」と思ってる人がたくさんいるからかな? わしはね、ローカルの小物guiでps始めよう思ってたらhtaというものを発見してしまったんじゃ 若者が「HTAって使えるんじゃね?」と思ってしまうのは仕方がない。
オッサン〜ジジイが「HTAを発見した」つったら「今まで何して生きてきたの?」としか言いようがない。
Windowsでのローカルの小物GUIは、今、滅亡の危機ですらある。
WordやExcelを使った自動化すら、今後もできるかどうか怪しい。 HTA軽くていいよね機能追加も楽だし
ランチャーにしてる ローカル実行できるスクリプトで動くGUIアプリに決まってるだろ。
Excel や Access の VBA がその代表格。
COM がベースだから切られる方向なのは分かる。
でも代替できるものがない。
いっとき PowerShell+WPF が期待を担ったが…
・呼ばれる側のアプリにコマンドレットの実装が必要
・.NET ごとオープンソースの世界に行ってしまって Windows そのものが切られそう
・そういうのは C# で書いて配れ、と明示的に言ってくれた方がまだ楽。
が、MS はダンマリを決め込んでいるんだよなぁ… >>793
>COM がベースだから切られる方向なのは分かる。
>でも代替できるものがない。
よく調べてないんだけどVisual Studio Tools for Officeとかはダメ? ■ このスレッドは過去ログ倉庫に格納されています