前スレ
PowerShell -Part 4
https://mevius.5ch.net/test/read.cgi/tech/1577862511/
次スレは>>980が立ててね!!
探検
PowerShell -Part 5
■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 00:29:52.04ID:/MpReTiX
611デフォルトの名無しさん
2021/10/22(金) 10:07:54.24ID:EjatPKif .psファイルは普通のPCでは実行できないよ
612デフォルトの名無しさん
2021/10/22(金) 10:55:51.24ID:/YA0OWyv >>611
誰もポストスクリプトファイル実行する話なんかしてないけどね
誰もポストスクリプトファイル実行する話なんかしてないけどね
613デフォルトの名無しさん
2021/10/22(金) 13:06:34.54ID:SA+7zjBD 上の方にあるpowershellスクリプトをバッチファイル内に埋め込む方法使えば、普通のWindows 10 PCなら動かせますよ
ポストスクリプトも一応チューリング完全だから、実行系さえあれば動かせますねwww
ポストスクリプトも一応チューリング完全だから、実行系さえあれば動かせますねwww
614デフォルトの名無しさん
2021/10/22(金) 20:46:03.99ID:6MiPd5ZV あーウゼー
615デフォルトの名無しさん
2021/10/22(金) 21:21:39.78ID:EVzz2nOu >>611
拡張子間違ってるぞ
拡張子間違ってるぞ
616デフォルトの名無しさん
2021/10/22(金) 22:24:13.62ID:8L7RGAQS VSCode の拡張機能・GrapeCity のExcel Viewer じゃ、ダメなのか?
他にも、Rainbow CSV とか
他にも、Rainbow CSV とか
617デフォルトの名無しさん
2021/10/22(金) 23:08:57.50ID:fpd3u34i >>616
スレチ
スレチ
618デフォルトの名無しさん
2021/10/23(土) 00:12:21.69ID:pYmoDx9D 代替案を出しただけでスレチとか
世界征服したいですとか質問が来たらどうすんだ
世界征服したいですとか質問が来たらどうすんだ
619デフォルトの名無しさん
2021/10/23(土) 07:48:25.45ID:YfqEVQfQ バカじゃねぇの?
620デフォルトの名無しさん
2021/10/23(土) 08:53:25.35ID:p7WIutVI >>618
PSで解決できる案を出せばそれはスレの趣旨に沿うだろ
PSで解決できる案を出せばそれはスレの趣旨に沿うだろ
621デフォルトの名無しさん
2021/10/23(土) 10:07:48.57ID:bwy1yWHL PSで世界征服
622デフォルトの名無しさん
2021/10/23(土) 10:22:51.64ID:LN9x/bbj Excel入ってない環境で内容を確認するだけなら使えそう
同じ処理を繰り返し実行するならスクリプト作るのがベスト
CSVなら外部ライブラリ導入せずともpowershellだけで処理出来るし
心を込めた手作業派はスレチ
同じ処理を繰り返し実行するならスクリプト作るのがベスト
CSVなら外部ライブラリ導入せずともpowershellだけで処理出来るし
心を込めた手作業派はスレチ
623デフォルトの名無しさん
2021/10/23(土) 21:14:23.04ID:j/f4QfO8 powershellの方がVBより文法的に楽だろJK
624デフォルトの名無しさん
2021/10/23(土) 21:31:40.91ID:Q4dm2fcp シジルが気になる人はそれなりにいるんじゃないかな?
まぁ、俺もVBの文法は肌に合わなくて、どうしてもマクロじゃないとダメって時だけしか触りたくないけど
まぁ、俺もVBの文法は肌に合わなくて、どうしてもマクロじゃないとダメって時だけしか触りたくないけど
625デフォルトの名無しさん
2021/10/23(土) 22:19:22.89ID:EHtNtO17 VBAマクロはGitとかの管理がしんどくてコードレビューも辛い
626デフォルトの名無しさん
2021/10/23(土) 23:12:10.13ID:ChfdQawL PowerShellでCOMのIDispatchな操作やるとオブジェクト参照リークしまくるから別の専用プロセスでやるよね?
627デフォルトの名無しさん
2021/10/24(日) 07:49:15.35ID:9JgQl7FC 連想配列を学習中なのですが…
$a = @{"a"=10 ; "b"=20; "c"=30 } などとして連想配列を作り
> $a.count
3 # たしかに要素数は 3
なのに
> $a.length
1
lengthは 1 になるのは何故? …っていうか、1って何の長さ?
普通の配列だと、要素数は lengthでも countでも同じなのに
$a = @{"a"=10 ; "b"=20; "c"=30 } などとして連想配列を作り
> $a.count
3 # たしかに要素数は 3
なのに
> $a.length
1
lengthは 1 になるのは何故? …っていうか、1って何の長さ?
普通の配列だと、要素数は lengthでも countでも同じなのに
628デフォルトの名無しさん
2021/10/24(日) 07:57:43.39ID:l/N511if >>626
別プロセスでもよいけど、スクリプトブロック内で参照するオブジェクト作って、ブロックの外側でGC呼び出すだけでも十分じゃない?
別プロセスでもよいけど、スクリプトブロック内で参照するオブジェクト作って、ブロックの外側でGC呼び出すだけでも十分じゃない?
629デフォルトの名無しさん
2021/10/24(日) 08:09:09.46ID:l/N511if630デフォルトの名無しさん
2021/10/24(日) 08:14:44.25ID:l/N511if 配列は
$a = 1,2,3
,$a | gm
するとCountがAliasPropertyでLengthがPropertyって出てくるね
$a = 1,2,3
,$a | gm
するとCountがAliasPropertyでLengthがPropertyって出てくるね
631デフォルトの名無しさん
2021/10/24(日) 08:17:36.78ID:j8yOk2Jj New V3 Language Features
https://devblogs.microsoft.com/powershell/new-v3-language-features/
You can now use Count or Length on any object, even if it didn’t have the property.
If the object didn’t have a Count or Length property, it will will return 1 (or 0 for $null).
Objects that have Count or Length properties will continue to work as they always have.
PS> $a = 42
PS> $a.Count
1
https://devblogs.microsoft.com/powershell/new-v3-language-features/
You can now use Count or Length on any object, even if it didn’t have the property.
If the object didn’t have a Count or Length property, it will will return 1 (or 0 for $null).
Objects that have Count or Length properties will continue to work as they always have.
PS> $a = 42
PS> $a.Count
1
632デフォルトの名無しさん
2021/10/24(日) 08:23:20.00ID:l/N511if なるほどー
勉強になりました。ありがとう
勉強になりました。ありがとう
633デフォルトの名無しさん
2021/10/24(日) 08:28:32.82ID:9JgQl7FC つまり lengthなんてのが無くても 1は返る…と.
たしかに tabキーでの補完は出なかったけれど
でも 配列には lengthあるし、個人的にはrubyでもlength使えてたので…うっかり書きそうな気はするが、
…とりあえず勉強になりました
たしかに tabキーでの補完は出なかったけれど
でも 配列には lengthあるし、個人的にはrubyでもlength使えてたので…うっかり書きそうな気はするが、
…とりあえず勉強になりました
634デフォルトの名無しさん
2021/10/24(日) 08:29:58.92ID:l/N511if635デフォルトの名無しさん
2021/10/24(日) 08:35:16.11ID:l/N511if 自分もRuby使ってるから分かりますわー
powershellではプロパティを大文字始まりのCamelCaseで書く様にすると
慣れるの早くなると思います
powershellではプロパティを大文字始まりのCamelCaseで書く様にすると
慣れるの早くなると思います
636デフォルトの名無しさん
2021/10/24(日) 08:46:22.73ID:JG8zeEOx $a.Countで1が変えるよりエラーを返して欲しいな
637デフォルトの名無しさん
2021/10/24(日) 09:21:28.43ID:l/N511if blogの記事読むとForEach-Objectした際に
列挙可能なものかそうでないかの判定を行わずに済ませるためみたいです
確かにv2の頃は出力が一個だけだった時のために@()でくくってましたわ
それよりもForEach-Objectの省略記法で
(ls).FullName
ができるの初めて知りました.これは便利
列挙可能なものかそうでないかの判定を行わずに済ませるためみたいです
確かにv2の頃は出力が一個だけだった時のために@()でくくってましたわ
それよりもForEach-Objectの省略記法で
(ls).FullName
ができるの初めて知りました.これは便利
638デフォルトの名無しさん
2021/10/24(日) 09:51:12.20ID:1SVJ9Wvp639デフォルトの名無しさん
2021/10/24(日) 10:47:06.59ID:l/N511if foreachできるかいちいち判定するより便利だし、よいと思うけどな
実際、自分で書くスクリプトはめっちゃ恩恵にあずかってる
実際、自分で書くスクリプトはめっちゃ恩恵にあずかってる
640デフォルトの名無しさん
2021/10/24(日) 11:21:20.50ID:7IRX6L2k 知ってれば便利だし、知らなくてもあまり害にならないからね
今回の質問のケースも調べる気がなく急いでたならCount使えばいい案件
シェル言語は厳格さより楽さ優先でいい
惜しむらくはPSがもっと普及していれば変な癖も含めて常識になるけど、そこまで至ってないところ
今回の質問のケースも調べる気がなく急いでたならCount使えばいい案件
シェル言語は厳格さより楽さ優先でいい
惜しむらくはPSがもっと普及していれば変な癖も含めて常識になるけど、そこまで至ってないところ
641sage
2021/10/24(日) 13:02:54.56ID:cIzJWM7z こんな感じのコードでもエラーが出ない為と書いてあったね
$x = dir
for ($i = 0; $i –lt $x.Count; $i++)
{
$x[$i] …
}
$x.gettype() で調べると値が1つならSystem.IO.FileSystemInfo
2つ以上ならSystem.Arrayで配列
配列と1つの値で同じコードで出来るのは個人的には楽でいいと思う
$x = dir
for ($i = 0; $i –lt $x.Count; $i++)
{
$x[$i] …
}
$x.gettype() で調べると値が1つならSystem.IO.FileSystemInfo
2つ以上ならSystem.Arrayで配列
配列と1つの値で同じコードで出来るのは個人的には楽でいいと思う
642デフォルトの名無しさん
2021/10/24(日) 15:45:25.76ID:dQwbGYLm jQuery Object も、0, 1, 2以上でも、配列として同じ書き方ができる。
0でもエラーにならず、単にループしないだけ
0, 1, 2以上で、表現・型を変えるものは、大変
0でもエラーにならず、単にループしないだけ
0, 1, 2以上で、表現・型を変えるものは、大変
643デフォルトの名無しさん
2021/10/24(日) 17:38:58.32ID:jz1DejpB >>641
配列を期待してるのに1要素が返る場合に配列で返らないのは階層データ構造を作る場合とても困る
gcはいつも$hagelist = [string[]](gc hage.txt)
ってやってるわら
ハゲが一人だと配列にならないしハゲがいないと$nullになるし
要素数0、1、2以上で型が変わる仕様はいつ見ても気持ち悪い
配列を期待してるのに1要素が返る場合に配列で返らないのは階層データ構造を作る場合とても困る
gcはいつも$hagelist = [string[]](gc hage.txt)
ってやってるわら
ハゲが一人だと配列にならないしハゲがいないと$nullになるし
要素数0、1、2以上で型が変わる仕様はいつ見ても気持ち悪い
644デフォルトの名無しさん
2021/10/24(日) 18:40:57.32ID:1SVJ9Wvp まあこの手の仕様はどっちが正解とかはないので結局は好き嫌いでしかないよね
個人的には単一の値と配列を同一に扱いたい時は@(…)で充分なような気がする
個人的には単一の値と配列を同一に扱いたい時は@(…)で充分なような気がする
645デフォルトの名無しさん
2021/10/25(月) 07:12:04.32ID:UuRFLqCB ForEach-Objectだと配列のネストをフラットにしてくれるけどforeachだとそうならないから
@()でくくるので全て解決ってことにはならないんじゃないかな
あと,エラー出してくれる動作の方が好みなら
Set-StrictMode -Version Latest
にするとエラーになりますよ
@()でくくるので全て解決ってことにはならないんじゃないかな
あと,エラー出してくれる動作の方が好みなら
Set-StrictMode -Version Latest
にするとエラーになりますよ
646デフォルトの名無しさん
2021/10/25(月) 23:46:47.63ID:ahXaOei7 countが使えるから何だって感じ
外部テキストファイル扱う時は0バイト、1行のみ、複数行のテスト必須だな
外部テキストファイル扱う時は0バイト、1行のみ、複数行のテスト必須だな
647デフォルトの名無しさん
2021/10/26(火) 00:05:31.73ID:lX9x28FW そうしたければそうすればいいんじゃないかな?
俺は必須だとは思わないけど
俺は必須だとは思わないけど
648デフォルトの名無しさん
2021/10/26(火) 09:37:37.38ID:t3bhaUes いちいちバイト数や行数を調べるより
何も考えずに@()を使ったほうが分かりやすい
何も考えずに@()を使ったほうが分かりやすい
649デフォルトの名無しさん
2021/10/26(火) 11:39:01.57ID:lX9x28FW 配列に$nullや空文字列が含まれる場合のチェックはどのみち必要になるだろうからv3記法がスッキリ書けて嬉しい
@()で括るのは想定外の挙動になるのと、もうすでにもっと簡易な記法が言語サポートされてるんだから使う必要ない
@()で括るのは想定外の挙動になるのと、もうすでにもっと簡易な記法が言語サポートされてるんだから使う必要ない
650デフォルトの名無しさん
2021/10/28(木) 11:41:35.91ID:d18Bz9B/ powershelle初心者だけどこんなバッチファイルを書き換えたい場合どうやって置き換えたらいいかな?
%%j(2番目トークン)の参照方法が分からないので教えてください。
for /F "tokens=1-2" %%i in (%TBL%) do (
if "%1" == "%%i" (
set MSG=%%j
)
)
%%j(2番目トークン)の参照方法が分からないので教えてください。
for /F "tokens=1-2" %%i in (%TBL%) do (
if "%1" == "%%i" (
set MSG=%%j
)
)
651デフォルトの名無しさん
2021/10/28(木) 12:37:45.38ID:ZmBUU4bO 対応が付きやすいようになるべく同じかきかたしたらこんな感じかな
Get-Content $env:TBL -Encoding Oem | ForEach-Object {
$a, $b = -split $_
if ( $args[0] -eq $a ) {
$msg = $b
}
}
Get-Content $env:TBL -Encoding Oem | ForEach-Object {
$a, $b = -split $_
if ( $args[0] -eq $a ) {
$msg = $b
}
}
652デフォルトの名無しさん
2021/10/28(木) 12:38:27.35ID:ZmBUU4bO 半角スペースが消えちゃって見辛い(泣
653デフォルトの名無しさん
2021/10/28(木) 12:57:14.68ID:d18Bz9B/654653
2021/10/28(木) 16:19:34.64ID:rsKCMs1x >>651でやりたい動きになりました!
本当にありがとうございます!
本当にありがとうございます!
655デフォルトの名無しさん
2021/10/28(木) 21:48:59.07ID:ZmBUU4bO ForEach-Objectはパイプからの入力を逐次に処理するイメージなので、なるべくまとめて処理するxargsとは逆の動作かな
Get-Contentはオプションなしだと行区切りの配列を返すので
自動変数$_には一行文の文字列が入る
-split演算子は右辺のみだと右辺の文字列を空白区切りで配列にして返すので
先頭の2つを受け取って処理してると
バッチと違って、対話環境で一つずつ動作を確認しながら動かせるので
いろいろ試して見ると早く慣れると思う
Get-Contentはオプションなしだと行区切りの配列を返すので
自動変数$_には一行文の文字列が入る
-split演算子は右辺のみだと右辺の文字列を空白区切りで配列にして返すので
先頭の2つを受け取って処理してると
バッチと違って、対話環境で一つずつ動作を確認しながら動かせるので
いろいろ試して見ると早く慣れると思う
656デフォルトの名無しさん
2021/10/28(木) 22:57:28.09ID:BKXGS6EF みんなForeach-objectってよく覚えてるよね
省略形の%ばっかり使ってて忘れがちだわ
省略形の%ばっかり使ってて忘れがちだわ
657デフォルトの名無しさん
2021/10/29(金) 09:10:35.42ID:354Lg8uj vscodeでスクリプト書いてると略すなって怒られるからね
658デフォルトの名無しさん
2021/10/29(金) 13:55:51.86ID:o1+BEtnt ターミナルでポチポチ動かす時は%や?を使ってる
コマンドレットもlsやcdを使ってるし
スクリプトはvscで指摘されるし補完も効くからエイリアス使わないかな
コマンドレットもlsやcdを使ってるし
スクリプトはvscで指摘されるし補完も効くからエイリアス使わないかな
659デフォルトの名無しさん
2021/10/29(金) 14:41:44.53ID:+PKyqpbv660デフォルトの名無しさん
2021/10/29(金) 18:01:47.11ID:83FlvPlk スクリプトで低速のforeach-objectなんて使わないから、
結局本名で書く機会なんて無い。
結局本名で書く機会なんて無い。
661デフォルトの名無しさん
2021/10/29(金) 19:43:20.82ID:o1+BEtnt 俺は結構使ってるなあ
662デフォルトの名無しさん
2021/10/29(金) 22:42:07.83ID:354Lg8uj663デフォルトの名無しさん
2021/10/29(金) 22:52:08.43ID:AeZX10et ボトルネックになるような場所に使うなってのは当然だが
使う場所が無いってのはどうなんだろ
使う場所が無いってのはどうなんだろ
664デフォルトの名無しさん
2021/10/30(土) 00:33:36.76ID:AwW6Wn8r 早すぎる最適化は諸悪の根源定期
性能改善を覚えるとそれが目的化するんや
そこに山があるんや
性能改善を覚えるとそれが目的化するんや
そこに山があるんや
665デフォルトの名無しさん
2021/11/02(火) 01:45:01.96ID:MFLvMhie666デフォルトの名無しさん
2021/11/02(火) 01:50:33.01ID:MFLvMhie iwr や gciなども アイリアス元なんか覚えてない
667デフォルトの名無しさん
2021/11/02(火) 01:51:33.79ID:MFLvMhie668デフォルトの名無しさん
2021/11/02(火) 07:40:44.52ID:+RlBaHPb669デフォルトの名無しさん
2021/11/02(火) 07:45:59.56ID:BCReJeM/ gciは使わないなぁ
lsか、補完でエイリアス元を使うかどっちか
オプション指定が必要な時はget-childitemですね
invoke-restmethodはproxy指定しないといけないから、コマンド履歴から呼び出してる
本当によく使うならプロファイルに書くんだけど、そこまででもない
lsか、補完でエイリアス元を使うかどっちか
オプション指定が必要な時はget-childitemですね
invoke-restmethodはproxy指定しないといけないから、コマンド履歴から呼び出してる
本当によく使うならプロファイルに書くんだけど、そこまででもない
670デフォルトの名無しさん
2021/11/02(火) 07:53:21.41ID:BCReJeM/671デフォルトの名無しさん
2021/11/02(火) 18:18:01.02ID:xDEug3LM >>670
$array | &{process{ 何か処理 }}
スクリプトブロックのprocess部はパイプから受け取ったオブジェクトを1つずつ処理するのでこれでループ処理書ける
良いところ
パイプから渡せる
当然begin部とend部も使える
動作速度は%どころかforeach文すら上回る
悪いところ
&で呼び出すとスコープ周りが面倒臭い(ドットソースで呼べばいいだけだが)
$array | &{process{ 何か処理 }}
スクリプトブロックのprocess部はパイプから受け取ったオブジェクトを1つずつ処理するのでこれでループ処理書ける
良いところ
パイプから渡せる
当然begin部とend部も使える
動作速度は%どころかforeach文すら上回る
悪いところ
&で呼び出すとスコープ周りが面倒臭い(ドットソースで呼べばいいだけだが)
672デフォルトの名無しさん
2021/11/02(火) 18:52:00.08ID:BCReJeM/ すげー!
見た目Foreach-Objectと大して変わんないように見えるけど、なんで早いんだろう?
見た目Foreach-Objectと大して変わんないように見えるけど、なんで早いんだろう?
673デフォルトの名無しさん
2021/11/02(火) 19:10:27.17ID:BCReJeM/ 全然意味ない例だけど試してみた
PS C:\> Measure-Command { ls -Recurse c:\Qt | & { process{$_.fullname > $null} } }
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 196
Ticks : 51967700
TotalDays : 6.01478009259259E-05
TotalHours : 0.00144354722222222
TotalMinutes : 0.0866128333333333
TotalSeconds : 5.19677
TotalMilliseconds : 5196.77
PS C:\> Measure-Command { ls -Recurse c:\Qt | % {$_.fullname > $null} }
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 190
Ticks : 61909279
TotalDays : 7.16542581018519E-05
TotalHours : 0.00171970219444444
TotalMinutes : 0.103182131666667
TotalSeconds : 6.1909279
TotalMilliseconds : 6190.9279
確かに速いね!不思議
PS C:\> Measure-Command { ls -Recurse c:\Qt | & { process{$_.fullname > $null} } }
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 196
Ticks : 51967700
TotalDays : 6.01478009259259E-05
TotalHours : 0.00144354722222222
TotalMinutes : 0.0866128333333333
TotalSeconds : 5.19677
TotalMilliseconds : 5196.77
PS C:\> Measure-Command { ls -Recurse c:\Qt | % {$_.fullname > $null} }
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 190
Ticks : 61909279
TotalDays : 7.16542581018519E-05
TotalHours : 0.00171970219444444
TotalMinutes : 0.103182131666667
TotalSeconds : 6.1909279
TotalMilliseconds : 6190.9279
確かに速いね!不思議
674デフォルトの名無しさん
2021/11/02(火) 20:10:29.35ID:cNrRrDlB 裏を返せばforeachは毎回スコープの是正処理が走るから遅いということか
675デフォルトの名無しさん
2021/11/02(火) 21:22:55.57ID:BCReJeM/ PS C:\> Measure-Command { ls -Rec c:\Qt |&{Begin{$f = [System.Collections.ArrayList]::new(); $d = [System.Collections.ArrayList]::new()} Process{if($_.Mode[0] -eq 'd'){$d.Add($_)}else{$f.Add($_)}} End{Write-Host "Directory: $($d.count), File: $($f.count)"}} }
Directory: 4915, File: 50123
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 645
Ticks : 56455459
TotalDays : 6.53419664351852E-05
TotalHours : 0.00156820719444444
TotalMinutes : 0.0940924316666667
TotalSeconds : 5.6455459
TotalMilliseconds : 5645.5459
PS C:\> Measure-Command { ls -Rec c:\Qt |ForEach-Object -Begin{$f = [System.Collections.ArrayList]::new(); $d = [System.Collections.ArrayList]::new()} -Process{if($_.Mode[0] -eq 'd'){$d.Add($_)}else{$f.Add($_)}} -End{Write-Host "Directory: $($d.count), File: $($f.count)"} }
Directory: 4915, File: 50123
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 736
Ticks : 67362805
TotalDays : 7.79662094907407E-05
TotalHours : 0.00187118902777778
TotalMinutes : 0.112271341666667
TotalSeconds : 6.7362805
TotalMilliseconds : 6736.2805
なるほどなぁ
Directory: 4915, File: 50123
Days : 0
Hours : 0
Minutes : 0
Seconds : 5
Milliseconds : 645
Ticks : 56455459
TotalDays : 6.53419664351852E-05
TotalHours : 0.00156820719444444
TotalMinutes : 0.0940924316666667
TotalSeconds : 5.6455459
TotalMilliseconds : 5645.5459
PS C:\> Measure-Command { ls -Rec c:\Qt |ForEach-Object -Begin{$f = [System.Collections.ArrayList]::new(); $d = [System.Collections.ArrayList]::new()} -Process{if($_.Mode[0] -eq 'd'){$d.Add($_)}else{$f.Add($_)}} -End{Write-Host "Directory: $($d.count), File: $($f.count)"} }
Directory: 4915, File: 50123
Days : 0
Hours : 0
Minutes : 0
Seconds : 6
Milliseconds : 736
Ticks : 67362805
TotalDays : 7.79662094907407E-05
TotalHours : 0.00187118902777778
TotalMinutes : 0.112271341666667
TotalSeconds : 6.7362805
TotalMilliseconds : 6736.2805
なるほどなぁ
676デフォルトの名無しさん
2021/11/02(火) 21:31:08.82ID:k6b2gzuo PowerShellのForeach-Objectは一体何をしているのか
https://tech.guitarrapc.com/entry/2013/03/09/210303
https://tech.guitarrapc.com/entry/2013/03/09/210303
677デフォルトの名無しさん
2021/11/02(火) 21:53:02.25ID:0RYZAUU5 凄い懐かしい書き込みを見てしまった、書いた記憶ないよ
678デフォルトの名無しさん
2021/11/02(火) 22:32:36.74ID:BCReJeM/ え?もしかして???
実践ガイドブック買ってましたよ!
会社の備品でですが
実践ガイドブック買ってましたよ!
会社の備品でですが
679デフォルトの名無しさん
2021/11/03(水) 00:42:33.36ID:5s18AOu6 2022/1からの電子帳簿保存法改正の関係で、フォルダに格納した電子取引のファイルを
検索できるようにするためにWindowsPowerShellを使ってみようかと思っています。
ひとまずファイルの命名規則を社員に周知して、それを
Get-ChildItem -Name -Recurse | Where-Object { $_ -match ・・・
で正規表現で検索できそうなのは分かったのですが、これをサーバーの上位階層で使うと
それなりに時間がかかりそうです。
そこで以下質問なのですが、
電子取引ファイルを格納するフォルダにも新たに命名規則を適用したうえで
Get-ChildItem * | Where-Object { $_.PSIsContainer }
のようにフォルダ名のみを検索するコマンドを使って、
「サーバー上位階層以下の全てのフォルダから、
複数のAAAで始まるフォルダ名のフォルダの中のみを対象に
BBBで始まる電子取引ファイルのみを表示する」
というコマンドは可能でしょうか?
検索できるようにするためにWindowsPowerShellを使ってみようかと思っています。
ひとまずファイルの命名規則を社員に周知して、それを
Get-ChildItem -Name -Recurse | Where-Object { $_ -match ・・・
で正規表現で検索できそうなのは分かったのですが、これをサーバーの上位階層で使うと
それなりに時間がかかりそうです。
そこで以下質問なのですが、
電子取引ファイルを格納するフォルダにも新たに命名規則を適用したうえで
Get-ChildItem * | Where-Object { $_.PSIsContainer }
のようにフォルダ名のみを検索するコマンドを使って、
「サーバー上位階層以下の全てのフォルダから、
複数のAAAで始まるフォルダ名のフォルダの中のみを対象に
BBBで始まる電子取引ファイルのみを表示する」
というコマンドは可能でしょうか?
680デフォルトの名無しさん
2021/11/03(水) 03:45:40.30ID:RbvYqhXw こんな感じですかね
$dir_list = Get-ChildItem -rec -Directory -Filter 'AAA*'
foreach($d in $dir_list) { Get-ChildItem "$($d.FullName)\BBB*" -File }
$dir_list = Get-ChildItem -rec -Directory -Filter 'AAA*'
foreach($d in $dir_list) { Get-ChildItem "$($d.FullName)\BBB*" -File }
681デフォルトの名無しさん
2021/11/03(水) 03:55:12.55ID:XfZZ+0lv Ruby で作った
# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file は抽出されない
src_dir = "C:/Users/Owner/Documents/Ruby/test"
glob_pattern = src_dir + "/**/*" # 以下のすべてのファイル
# 指定する語句
dir_substr = "/test1"
file_substr = "test"
target_files = Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select { |full_path|
# フルパスのフォルダ名だけを取り出して、その先頭から、src_dirの部分を削除する。
# つまり、src_dir見た、相対パスのフォルダパスだけにする。
# そこから、include?で、指定の語句で始まる、フォルダ名を含むものだけを抽出する
File.dirname( full_path ).delete_prefix( src_dir ).
include?( dir_substr )
}
.select { |full_path|
# ファイル名だけを取り出して、指定の語句で始まる、ファイル名を含むものだけを抽出する
File.basename( full_path ).start_with?( file_substr )
}
puts target_files
出力
C:/Users/Owner/Documents/Ruby/test/csv/test10/test10.rb
C:/Users/Owner/Documents/Ruby/test/test141/test.ini
# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file は抽出されない
src_dir = "C:/Users/Owner/Documents/Ruby/test"
glob_pattern = src_dir + "/**/*" # 以下のすべてのファイル
# 指定する語句
dir_substr = "/test1"
file_substr = "test"
target_files = Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select { |full_path|
# フルパスのフォルダ名だけを取り出して、その先頭から、src_dirの部分を削除する。
# つまり、src_dir見た、相対パスのフォルダパスだけにする。
# そこから、include?で、指定の語句で始まる、フォルダ名を含むものだけを抽出する
File.dirname( full_path ).delete_prefix( src_dir ).
include?( dir_substr )
}
.select { |full_path|
# ファイル名だけを取り出して、指定の語句で始まる、ファイル名を含むものだけを抽出する
File.basename( full_path ).start_with?( file_substr )
}
puts target_files
出力
C:/Users/Owner/Documents/Ruby/test/csv/test10/test10.rb
C:/Users/Owner/Documents/Ruby/test/test141/test.ini
682681
2021/11/03(水) 09:08:04.21ID:XfZZ+0lv >>681
基準とするフォルダが、C:/Users/Owner/Documents/Ruby/test の時、
出力
C:/Users/Owner/Documents/Ruby/test/csv/test10/test10.rb
C:/Users/Owner/Documents/Ruby/test/test141/test.ini
は、
基準フォルダのフルパス/csv/test10/test10.rb
基準フォルダのフルパス/test141/test.ini
そこで、フォルダ名に含まれる語句が、test1 の場合、
基準フォルダの直下・子だけでなく、/csv/test10/test10.rb など、
子孫のフォルダ名に含まれる場合も抽出している
基準とするフォルダが、C:/Users/Owner/Documents/Ruby/test の時、
出力
C:/Users/Owner/Documents/Ruby/test/csv/test10/test10.rb
C:/Users/Owner/Documents/Ruby/test/test141/test.ini
は、
基準フォルダのフルパス/csv/test10/test10.rb
基準フォルダのフルパス/test141/test.ini
そこで、フォルダ名に含まれる語句が、test1 の場合、
基準フォルダの直下・子だけでなく、/csv/test10/test10.rb など、
子孫のフォルダ名に含まれる場合も抽出している
683デフォルトの名無しさん
2021/11/03(水) 09:42:35.20ID:ZuZHjCnO これはRuby信者を装ったRubyアンチ
684デフォルトの名無しさん
2021/11/03(水) 12:57:54.90ID:iUEuUW7J ファイルシステム走査するのが遅いのは仕方ないからCSVでパスと検索フラグ保持するのがよさそう
685デフォルトの名無しさん
2021/11/03(水) 13:30:44.29ID:Xpnui0Lt ローカルドライブの話ならWindows Searchサービスの機能って使えないの
あれ何なの
あれ何なの
686デフォルトの名無しさん
2021/11/03(水) 14:28:09.82ID:S9aFy+Xx ゴミ
687デフォルトの名無しさん
2021/11/03(水) 14:45:47.88ID:Sv+q3Yur688デフォルトの名無しさん
2021/11/03(水) 14:46:11.73ID:RbvYqhXw 検索出来ればよいだけで、サーバーがWindowsなら、Everything使ってもいいんじゃないでしょうか
689デフォルトの名無しさん
2021/11/03(水) 14:47:13.93ID:NXjfZMEM インデックス貼ればいいんでは。知らんけど。
690デフォルトの名無しさん
2021/11/03(水) 14:48:03.76ID:RbvYqhXw691デフォルトの名無しさん
2021/11/03(水) 14:54:32.83ID:RbvYqhXw ファイル名検索で十分そうなんで、全文検索の例は違うかと
692デフォルトの名無しさん
2021/11/03(水) 15:12:50.54ID:A+jxlAHC まずは目標性能を提示した上で実測するところからじゃろ
693デフォルトの名無しさん
2021/11/03(水) 15:25:21.20ID:RbvYqhXw 680で試してもらって、もっと速度が必要ならEverythingを検討するのがよいと思います
694601
2021/11/03(水) 16:05:48.67ID:5s18AOu6 ありがとうございます。
PGかじっただけの事務方でWindowsPowerShellも5日くらい前から
仕事の合間に調べ始めた初心者なので>>680の中身もパッと見よくわかりませんが
明日にでも調べながら試してみます。
Rubyは名前しか知らないのでごめんなさい。
上手くいかないようならEverythingというのを試してみます。
PGかじっただけの事務方でWindowsPowerShellも5日くらい前から
仕事の合間に調べ始めた初心者なので>>680の中身もパッと見よくわかりませんが
明日にでも調べながら試してみます。
Rubyは名前しか知らないのでごめんなさい。
上手くいかないようならEverythingというのを試してみます。
695679
2021/11/03(水) 16:06:34.89ID:5s18AOu6 ↑なぜか名前が601になってました
696デフォルトの名無しさん
2021/11/03(水) 20:50:39.41ID:RbvYqhXw ここら辺が参考になると思います
https://docs.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-string-substitutions?view=powershell-5.1
https://docs.microsoft.com/en-us/dotnet/api/system.io.directoryinfo?view=net-5.0&viewFallbackFrom=net-4.8#properties
https://docs.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-string-substitutions?view=powershell-5.1
https://docs.microsoft.com/en-us/dotnet/api/system.io.directoryinfo?view=net-5.0&viewFallbackFrom=net-4.8#properties
698デフォルトの名無しさん
2021/11/05(金) 03:47:54.25ID:UB8UVAT8 >>673
実は配列にもドット演算子が定義されていて、こういう書き方も出来る
処理も速く、書きやすいので記述量のコスパがいい
配列.要素のプロパティ名 → 要素のプロパティ名配列
Measure-Command { (ls -Recurse c:\Qt).fullname > $null} }
実は配列にもドット演算子が定義されていて、こういう書き方も出来る
処理も速く、書きやすいので記述量のコスパがいい
配列.要素のプロパティ名 → 要素のプロパティ名配列
Measure-Command { (ls -Recurse c:\Qt).fullname > $null} }
699デフォルトの名無しさん
2021/11/05(金) 04:18:51.55ID:UB8UVAT8 >>679
自分もファイル検索するスクリプト作ってるが、
速度は Where-Object と -match がボトルネックになってた
PSは特定の演算子の左オペランドを配列にすることでフィルタになるんだが、
これは処理が速いので置き換えた方がいい
配列 | Where-Object{ if($_ -match "正規表現"){$_} }
は、
配列 -match "正規表現"
で置き換えられる。
ただしパイプ処理ではなくなるので使用メモリは増える。
自分もファイル検索するスクリプト作ってるが、
速度は Where-Object と -match がボトルネックになってた
PSは特定の演算子の左オペランドを配列にすることでフィルタになるんだが、
これは処理が速いので置き換えた方がいい
配列 | Where-Object{ if($_ -match "正規表現"){$_} }
は、
配列 -match "正規表現"
で置き換えられる。
ただしパイプ処理ではなくなるので使用メモリは増える。
700デフォルトの名無しさん
2021/11/05(金) 04:57:04.64ID:booIrJ0X ワイルドカードで事足りるならget-childitemのfilterオプションが早いんじゃない?
701デフォルトの名無しさん
2021/11/05(金) 05:09:54.73ID:UB8UVAT8 確かに
702デフォルトの名無しさん
2021/11/07(日) 20:09:58.83ID:xhLNYeNd シェルスクリプト板にも書いてしまったんやが
スクリプト内で関数をサブプロセスで動かして出力も表示させる書き方ってどうすればええんや?
shでの func & 的なことをしたい
スクリプト内で関数をサブプロセスで動かして出力も表示させる書き方ってどうすればええんや?
shでの func & 的なことをしたい
703679
2021/11/07(日) 21:31:53.47ID:eC/ipH+D 脱線話になってしまうんですが、そもそもの国税庁の通達らしきものが全く流れてきていない中で
営業チラシとかからこの電子帳簿保存法の話を知って自分で調べている次第で…
で、調べてみると
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/pdf/0021005-038.pdf
の2ページ目、検索要件として
「@取引年月日・取引先・金額で検索できること」
「A日付または金額の指定範囲検索」
「B2つ以上の任意の項目による検索」
とあり、そうなるとファイル名の命名規則に上記3項目を組み込み、
正規表現で検索する必要があるかな、という結論になったわけですが…
どうもこの2ページ目の※1に該当してABが不要になる可能性があり、
さらには
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/pdf/0021006-031_06.pdf
の問12によると、そもそも既存のファイル管理だけしていれば検索機能要らないんじゃ…
というところに行きついたのが先週金曜の夜になります。
税理士に聞いても持ってる情報はこちらと大差なく、どう転んでいくか分からない状況 (;´д`)
営業チラシとかからこの電子帳簿保存法の話を知って自分で調べている次第で…
で、調べてみると
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/pdf/0021005-038.pdf
の2ページ目、検索要件として
「@取引年月日・取引先・金額で検索できること」
「A日付または金額の指定範囲検索」
「B2つ以上の任意の項目による検索」
とあり、そうなるとファイル名の命名規則に上記3項目を組み込み、
正規表現で検索する必要があるかな、という結論になったわけですが…
どうもこの2ページ目の※1に該当してABが不要になる可能性があり、
さらには
https://www.nta.go.jp/law/joho-zeikaishaku/sonota/jirei/pdf/0021006-031_06.pdf
の問12によると、そもそも既存のファイル管理だけしていれば検索機能要らないんじゃ…
というところに行きついたのが先週金曜の夜になります。
税理士に聞いても持ってる情報はこちらと大差なく、どう転んでいくか分からない状況 (;´д`)
704デフォルトの名無しさん
2021/11/08(月) 00:13:47.57ID:bmKVlrQF 大変ですね。。。
税務署に問い合わせれば教えてくれるもんなんでしょうか?
税務署に問い合わせれば教えてくれるもんなんでしょうか?
705デフォルトの名無しさん
2021/11/08(月) 00:23:43.73ID:bmKVlrQF >>702
バックグラウンドで動かすのはstart-jobだけど、receive-jobしないといけないから、shと同じ雰囲気で動かすのは難しいんじゃないかな?
バックグラウンドで動かすのはstart-jobだけど、receive-jobしないといけないから、shと同じ雰囲気で動かすのは難しいんじゃないかな?
706デフォルトの名無しさん
2021/11/08(月) 00:48:09.32ID:j5xrb+V9707デフォルトの名無しさん
2021/11/08(月) 01:18:37.98ID:bmKVlrQF 標準出力じゃなくてファイルに出力するなら、何も考えなくてよくて簡単なんですけどねぇ
708デフォルトの名無しさん
2021/11/08(月) 14:40:09.96ID:ATC6W+sR (echo foo &) | Receive-Job -Wait
709デフォルトの名無しさん
2021/11/08(月) 15:36:36.21ID:J2dLpPYS 配列にしてファイル名取得してコピーする動きさせたです
以下のようなイメージを浮かべていますが上手くいかなくてどう書いたらいいか有識者の方教えてください
$aaa[0]=〜.txt
$aaa[1]=〜.log
$aaa[2]=〜.sh
foreach($i in 0..2){
copy-item -force aaa[$i] $コピー先
}
$?で戻り値判定
以下のようなイメージを浮かべていますが上手くいかなくてどう書いたらいいか有識者の方教えてください
$aaa[0]=〜.txt
$aaa[1]=〜.log
$aaa[2]=〜.sh
foreach($i in 0..2){
copy-item -force aaa[$i] $コピー先
}
$?で戻り値判定
710デフォルトの名無しさん
2021/11/08(月) 15:58:10.99ID:J2dLpPYS 自己解決したかも
下記でうまく動きましたわ頭悪い書き方かもしれないが
$aaa=@(ファイルパス,ファイルパス,ファイルパス)
$aaa | foreach-object { copy-item -force $aaa コピー先}
下記でうまく動きましたわ頭悪い書き方かもしれないが
$aaa=@(ファイルパス,ファイルパス,ファイルパス)
$aaa | foreach-object { copy-item -force $aaa コピー先}
711デフォルトの名無しさん
2021/11/08(月) 17:02:26.88ID:UsmHmtDw パスの引数はliteralpath使った方がいいよ
普通のpathだとワイルドカードが有効になって面倒なことになる
普通のpathだとワイルドカードが有効になって面倒なことになる
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★5 [BFU★]
- 高市政権にパイプ役不在…日中高まる緊張 公明党の連立離脱影響、自民内にも懸念「自分でまいた種は自分で刈り取ってもらわないと」★2 [ぐれ★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- 【速報】 日経平均の下落率3%超す、財政懸念で長期金利上昇 [お断り★]
- 【こんなの初めて…】民泊には既にキャンセルも 中国の渡航自粛で ★2 [ぐれ★]
- 台湾声明 「台湾は独立した主権国家、中国は台湾を統治したことがなく、中国は口出しする権利ない」 中国が高市首相に抗議で ★7 [お断り★]
- 日経平均、49000円割れ 国賊高市を許すな [402859164]
- 【正論】有識者「高市早苗に合理的配慮をしなかった野党が悪い」 [175344491]
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 日経平均、49000円割れ 国賊高市を許すな ★2 [402859164]
- 吉村はん「高市さんは発言を撤回する必要ないですよ。中国の大阪総領事が謝罪すべき」 [256556981]
- 高市政権「中国さん、日本はいつでも対話に応じるで」 [834922174]
