PowerShell -Part 5

■ このスレッドは過去ログ倉庫に格納されています
2021/03/18(木) 00:29:52.04ID:/MpReTiX
前スレ
PowerShell -Part 4
https://mevius.5ch.net/test/read.cgi/tech/1577862511/

次スレは>>980が立ててね!!
2021/04/03(土) 12:35:34.20ID:1anAZoL9
インストールマニュアルとセットにして、正攻法で使って貰うのが一番だな
2021/04/03(土) 13:31:57.32ID:vSOTAguS
>>99
ガチガチに管理されたPCには無理な方法
2021/04/03(土) 13:47:46.96ID:1anAZoL9
ネット経由で持ってきたファイルだと、batファイルも実行不可能なのな
よくできてる
2021/04/03(土) 13:55:06.60ID:PDe42KrN
むしろガチガチに管理してくれれば個別にスクリプト実行なんてしなくて済むのに
2021/04/03(土) 14:11:40.41ID:Bi+zSKdB
batで済む事はbatが無難
済まない事はps1よりもexeが無難
2021/04/03(土) 14:26:34.09ID:vSOTAguS
>>101
ZoneIDのセキュリティブロックのことなら、イントラネットや信頼されたサイトだと問題ない
2021/04/03(土) 14:32:21.88ID:1anAZoL9
自分の別のPCからteamsのファイル共有で持ってきただけなんだけどね
2021/04/03(土) 15:18:17.29ID:sC0R2LUF
>>98
ExecutionPolicy の話?
なら、-Command 使ってるから要らんよ
他にもバイパスする方法は色々あるし
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/
107デフォルトの名無しさん
垢版 |
2021/04/03(土) 20:22:37.90ID:1+c+Mqlb
-Scope CurrentUser なら権限いらないんじゃね
2021/04/03(土) 21:42:59.31ID:pdE0Ehe0
PwerShell はファイル行数を取得しようとうっかり wc -l ファイルパス を呼ぶと延々と戻ってこない
2021/04/04(日) 14:18:40.58ID:wP1wKXuq
> Get-Command wc
Get-Command : 用語 'wc' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されま
せん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく
ださい。
2021/04/04(日) 14:52:39.08ID:GCV7dd01
>>108
即座にエラー出るけどな
2021/04/04(日) 15:36:10.86ID:/BDkV6c4
>>109,110
失礼。 書き間違えた。wc はGit for Windowsに付属のwc.exeのこと。
正しくは以下のとおり。
cat ファイルパス | wc -l

catが遅いのかパイプが遅いのか両方なのか。
2021/04/04(日) 15:41:20.32ID:BHN4NYpU
cygwinやmsysだとか、c:直下に入りたがるintel系のコンパイラとか、あちこちにパス通してると遅くなった気がする
ハッシュとかしてないんだろうか?する方法あったら知りたい
2021/04/04(日) 15:43:52.16ID:BHN4NYpU
とりあえずパスの先の方に移してみたら、win/unix-likeで同名コマンド結構あるので衝突気にしないならだが
2021/04/04(日) 15:45:18.85ID:/BDkV6c4
>>112
cat はcat.exeじゃなくてGet-Contentのaliasでした
wc -l ファイルパス は普通に速いからwc.exeの問題でもない
よって Get-Contentまたはパイプの問題ってことになりそう
2021/04/04(日) 15:53:23.09ID:/BDkV6c4
Get-Contentのcatだけじゃなくて cat.exe も遅いのか判断しようにもリダイレクトやパイプが関係してきて計時できない
2021/04/04(日) 15:58:56.72ID:2OR59bwQ
concatenateの略だということはもう忘れられている
2021/04/04(日) 16:00:48.51ID:BHN4NYpU
>>114
gcは何も言わなければStringのObject[]を返すと思うので、ストリームを期待しているだろうwcの移植に渡すのは気持ち悪い感じがするぞ(そのwc.exeを持ってないので推測だが
-bytestreamやら-rawやら色々オプションあるので、適切なのを探そう
パイプのバッファリングもstdbufに頼るlinuxよりは柔軟なので、もし駄目ならそっち方面調べてみて
2021/04/04(日) 16:07:02.09ID:BHN4NYpU
面倒でもあるけどなー
2021/04/04(日) 16:22:26.07ID:oGhQpAP5
catは猫被ってるからな
(cat .profile)[-1]
2021/04/04(日) 17:39:37.67ID:2IYRpr9r
>>112
ハッシュするって何?
2021/04/04(日) 18:05:16.10ID:S6//fvIQ
>>120
一部のシェルではコマンドとコマンドパスの対応をハッシュテーブルで管理して高速化を図ってるものがある
なのでサーチパスを追加したりコマンドを追加したらrehashコマンドでハッシュテーブルを再構築する必要がある
って話じゃね?
2021/04/04(日) 18:08:31.30ID:Oo+bypI+
ほほぅ。
2021/04/04(日) 19:21:56.56ID:0E2xLu47
うちは6885行のtxtでGet-Contentもcat.exeも体感差はないな。しかしPSのパイプは遅い

PS> foreach ($i in (1..5)) {(Measure-Command { Get-Content hoge.txt | wc -l }).TotalMilliseconds}
2959.9704
3016.5222
3007.6643
3010.2928
3009.264

PS> foreach ($i in (1..5)) {(Measure-Command { cat.exe hoge.txt | wc -l }).TotalMilliseconds}
2908.5588
2900.6436
2905.2317
2962.6119
2895.1269

PS> foreach ($i in (1..5)) {(Measure-Command { wc -l hoge.txt }).TotalMilliseconds}
62.3373
61.1564
78.0376
62.6787
61.2903
2021/04/04(日) 19:22:33.43ID:0E2xLu47
bash> time (cat hoge.txt | wc -l)
6885

real 0m0.047s
user 0m0.060s
sys 0m0.030s

bash> time wc -l hoge.txt
6885 hoge.txt

real 0m0.016s
user 0m0.030s
sys 0m0.031s
2021/04/04(日) 20:38:15.51ID:DK2CM63v
そもそもそのwc.exeってファイル引数とか取ってくれないの?
2021/04/04(日) 20:48:48.02ID:wHZAJdLa
PowerShellでファイルの行数を知りたいなら
Get-Content ファイルパス | Measure-Object -Line

Measure-Object
https://docs.microsoft.com/ja-jp/previous-versions/dd315251(v=technet.10)

-Line
入力オブジェクトの行数をカウントします。
2021/04/04(日) 20:54:21.66ID:7FHk/GbQ
まさか行数を数えたいだけってオチ?
>>126
行数だけなら単に.count属性見ればいいのではないかと
(cat file).count
2021/04/04(日) 20:57:30.83ID:7FHk/GbQ
あと一行毎に読み込んで処理するような作業でなければ、-readcount を大きく取れば比例して速くなるかと
2021/04/04(日) 21:53:57.59ID:BHN4NYpU
完全に同じ物かは分からんが、一般的なwcコマンドはファイル引数取るね
わざわざgcでメモリに読み込んで渡すという奇怪なことはしなくていいと思う
行じゃなくて単語を数えるなら-Delimiterでよしなに分割してCount 属性見るとか

ただ、生gcで全部メモリに載せて属性見るのはスケーラブルでない事に注意
2021/04/04(日) 22:07:08.65ID:BHN4NYpU
-Delimiterに空白扱いしたい文字を渡すだけではちゃんと連続スペースを圧縮してくれるかとか怪しいので、やめといたほうがいいか
せっかくwc.exeがあるんだから任せるのが無難
2021/04/07(水) 05:39:22.19ID:vrmwo0xd
オワコン利用者が宗教がかってくるのはどんな分野でも似た感じだね
2021/04/07(水) 12:11:53.76ID:qt/+ncLt
なんでや、perl関係ないやろ
2021/04/07(水) 21:20:44.96ID:MHznIgE8
HTMLファイルを[xml]に変換して $obj.html.bodyとか参照したいんですが、
↓のサイトで紹介されてる方法
https://win.just4fun.biz/?PowerShell/HTMLのtableタグをスクレイピング
$obj = [xml](Get-Content ファイル名)

この方法ではタグが対応してないとエラーが出てしまいます。素のHTMLなので当然なのですが。
タグが対応してないHTML前提で何か良い方法ありますか。
2021/04/07(水) 23:40:53.08ID:Y4NtoFD8
Powershellで時間だけの計算の方法を教えてください。

$s=((New-TimeSpan -Hours 50 -Minutes 35) + (New-TimeSpan -Hours 1 -Minutes 25)).TotalSeconds
$ts =[timespan]::FromSeconds($s)
("{0:hh\:mm\:ss}" -f $ts)

ググった結果ここまではいきついたのですが、24時間を超えると、桁が日に上がってしまいます。

24時間を超えた場合でも、25:00や、123:35のようにする方法を教えてください。
また、もう少し楽な書き方Excelライクに、10:15 + 20:45 = 31:00、みたいな楽な書き方があったら教えて下さい。
2021/04/08(木) 04:25:58.89ID:kPGnX96o
>>129
7z -e -so 2021-04-01.log.zip | wc -l
みたいな事もやりたいのかも。わざわざパイプにしてるって事は

それにしてもPowerShellは数字で始まるコマンドはそのままじゃダメなのか
&7zだとイケるけど…癖のあるシェルですな
2021/04/11(日) 22:42:10.00ID:2GAqbccY
>>134
MSDNのTimeSpan構造体を調べてみるといいですよ
時単位の出力はTotalHoursプロパティです
137デフォルトの名無しさん
垢版 |
2021/04/11(日) 22:52:32.66ID:2GAqbccY
$ts = [timespan]'10:15' + [timespan]'20:45'
'{0:00}:{1:00}' -f $ts.TotalHours, $ts.Minutes

こんな感じ
2021/04/12(月) 21:18:29.84ID:6c3X7Cef
>>136
>>137
ありがとうございました。

最終的にこんな感じになりました。

$TimeSpan = [timespan]::new(10,15,0) + [timespan]::new(24,45,0)
'{0:00}:{1:00}' -f $TimeSpan.TotalHours, $TimeSpan.Minutes
2021/04/12(月) 22:12:38.04ID:zW+k7vD0
質問したいんだけど、だれか教えて下さい。

外部アプリによるリネームの追跡をしたいんです。
リネームをする外部アプリで、リネームされたファイル名を拾いたいんです。

詳細
https://qiita.com/mtujikawa/questions/a0b4b36bc91585388cf2

だれか教えて下さい。
2021/04/12(月) 23:31:54.87ID:rYIhIPBW
>>139
windows 名前の変更 監査
でぐぐるといくつか出てくるよ
2021/04/13(火) 17:45:40.70ID:fWoCeTea
vbs速いって言うけどUTF8扱うようになる(ADODBでゴニョゴニョ)と
powershellが逆転するね
2021/04/13(火) 17:58:30.89ID:u1AIe1VJ
>>141
そうなんですか
2021/04/13(火) 19:01:37.43ID:HcUSKQeT
$ts = [timespan]'0:15' + [timespan]'0:40' ; '{0:00}:{1:00}' -f $ts.TotalHours, $ts.Minutes
01:55
144デフォルトの名無しさん
垢版 |
2021/04/18(日) 15:36:47.84ID:d2aF4PUW
数値を強制的に2桁にする方法ですが、
3桁以上は上位2桁、1桁の場合は右詰めで0追加
とするためにはどうすればいいでしょうか?
整数以外の入力は考えなくて大丈夫です

(例)
12345 → 12
67 → 67
8 → 80
2021/04/18(日) 16:03:54.38ID:NvNv7S6I
if文で分岐して10をかけたり割ったりするだけじゃだめなんですか?
2021/04/18(日) 16:34:37.11ID:Y0OFPTQB
12345,67,8|%{[math]::floor($_/[math]::pow(10,[math]::floor([math]::log10($_))-1))}
2021/04/18(日) 17:19:19.04ID:yV0lWVbT
すごいのう
2021/04/18(日) 17:26:13.82ID:okYCh92Q
無条件に最後に0を付けて左から2桁取ればいいのでは
2021/04/18(日) 17:57:57.50ID:ZsDsAuud
そんなんで表示されても判らんけどな
2021/04/18(日) 20:02:19.21ID:NvNv7S6I
>>148
これだな
2021/04/18(日) 21:04:21.53ID:Y0OFPTQB
その方が簡単だな。146は数値計算で済ませる思いつき
2021/04/18(日) 21:53:28.24ID:a2J8UULJ
>>149
分かるだろ
2021/04/18(日) 21:59:30.04ID:qI95yZS9
#/bin/sh
result=21
result2=3.1415
echo "$result * 10" | bc | cut -c 1-2 # 実行結果:21
echo "scale=5; $result2 * 10" | bc | cut -c 1-2 # 実行結果:31
2021/04/19(月) 08:23:13.80ID:tyk9bMXM
中古シェルだとたかが数値計算すらbcなんてコマンドをわざわざ使わなきゃいけないのか
しかも結果が文字列ってアホすぎ
2021/04/19(月) 08:49:51.52ID:Igt3l5xr
bashって外部コマンド使わずに純粋にシェルの機能だけだとまともな事出来ないの?
2021/04/19(月) 15:00:37.86ID:5FdprbjY
12345,67,8|% {($_ * 10).ToString().SubString(0,2).ToInt32($null)}
2021/04/19(月) 15:52:01.50ID:HBn8astV
分かりやすい
158デフォルトの名無しさん
垢版 |
2021/04/19(月) 17:18:39.52ID:J8N2amqC
テキストファイルを読み込んで置換したりしているのですが、改行コードがマッチしません

function test($file){
$content = Get-Content -Encoding UTF8 $file
$content = $content -replace "`n", "HOGE"
$content
}

これで改行をHOGEにしようとしてもできません
`n を `r`n や \n や \r\n にしてもだめです(テキストエディタで見るとエンコードはUTF8、改行はCR+LFとなっています)
タブ文字は `t でできています
どのような理由が考えられるでしょうか?
2021/04/19(月) 17:22:33.20ID:UiFLtBUU
改行コードと文字コードは、もう一度地球をやり直すしか
2021/04/19(月) 17:32:10.70ID:J8N2amqC
ちなみに同じテキストファイルは
秀丸エディタだと普通に \n で検索、置換ができています
2021/04/19(月) 18:06:13.50ID:yrdOfXex
>>155
この程度はbashでできるけど外部コマンドの橋渡しが基本。プログラム言語じゃないしな
for i in 12345 67 8; do y=${i}0; y=${y:0:2}; echo $y; done
変数は$(())で数値計算できる
PowerShell
12345,67,8 | %{[int]([string]$_+0).substring(0,2)}
156は古いPowerShellだとエラーになる([System.String]にToInt32がない)
2021/04/19(月) 18:32:19.33ID:nuzEjzy+
>>158
$content = Get-Content $file -Raw -Encoding UTF8
2021/04/19(月) 18:34:53.66ID:nsBabrZy
ワロタ
2021/04/19(月) 18:47:03.91ID:qG+FkDTL
>>158
> どのような理由が考えられるでしょうか?
Get-Contentは改行で区切られた行を配列にして返す
なので返された内容には改行は無いよ
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12183750652
2021/04/19(月) 18:54:06.68ID:PAGvXSVw
>>144は、結果の数値に応じて場合分けするのに
最初の2桁を使いたいからその方法を聞いてるの?
166デフォルトの名無しさん
垢版 |
2021/04/19(月) 19:31:30.77ID:d6EDPzDg
148が言ってるみたいに文字列で処理した方が簡単かなぁ

PS C:\> $x = 1..5 |% { Get-Random -min 1 -max 20 }
PS C:\> $x
4
10
6
17
12
PS C:\> $x |% { -join ('{0}0' -f $_)[0..1] }
40
10
60
17
12
2021/04/19(月) 19:31:51.71ID:J8N2amqC
>>162 でできました!
2021/04/22(木) 12:55:52.92ID:dQFy3Puj
bash/linux使っててpwsh初めましただけど
env:とかalias:とか疑似ファイルシステムみたいに潜れるの楽しい
-からの補完でロングオプション(パラメータ?)出てヘルプすら見ずとも取り敢えず動くのが素敵
もちろんオンラインヘルプもman以上に充実で素晴らしい

困った方も挙げとく
折角両方のコマンド使えるのでcatだけ本物に置き換えてる、pwshのgcとwinのtypeはそのまま

ただcdはbashビルトインで実体が無いので困った
子bashでglobal宣言しても$env:CDPATHに反映されてない?
何かワークアラウンドはないでしょうか?ヘビーユーザなので寂しい
勉強も兼ねてcdをpwshで書くのもいいかもしれないけど
2021/04/22(木) 12:59:06.25ID:dQFy3Puj
行/列(オブジェクト/プロパティ)をピボットテーブルみたいにグリグリ出来るのも楽しいね
そういうインタラクティブデータ分析はpython/pandasでやってたけど、pwshの方が楽かもしれない
2021/04/22(木) 13:13:23.93ID:fmuwQogZ
他の言語で書いたらかなりの分量になるところを、psだと異様に短くなる
というケースが楽しい
2021/04/22(木) 13:22:29.78ID:dQFy3Puj
echoしなくていいとか、?、%、&(call operator)、$_とか使いたくなりますね
perl臭がしてくるけど
2021/04/22(木) 13:30:39.34ID:dQFy3Puj
かっちり書けばほぼC#なのもいいところ
前からネットでサンプルコードちらほら見かけてたけど、そういうのはエイリアス無し&キャメルケースの厳つい見た目なので敬遠してしまってた

小文字でも構わないし、標準エイリアス&短縮規約(Get-Verb)あるんだって入れるまで知らなかった
2021/04/23(金) 09:46:07.10ID:+Mo8SLKI
pwsh慣れた後にbash勉強したら面倒なんだけどみんなどう思ってる?
2021/04/23(金) 10:01:56.87ID:sYoV5rep
>>172
C#だと思って使うとドツボにはまる
パイプラインをちゃんと使ってPowerShellらしく書くか、それが嫌ならインラインでC#書いたほうがマシだ
まあいずれ分かる
2021/04/23(金) 10:48:54.99ID:lAPyDVC2
>>173
bashから入ってPS勉強中の俺には
ログインシェルとしては面倒
スクリプトとしては便利
と思ってる。本気で使おうと思ってないから効率的な使い方知らんだけだと思うが、メンバ確認でgm叩くのが面倒lessがないのも辛い

この時点でかなり億劫
スクリプトはどーせvscode使うからあまり気にならないんだが…
2021/04/23(金) 11:06:13.19ID:sgIhdz3d
何でもpsでやろう、という気にはならないかな
psが向いてる用途にぴったりはまると気持ちいい
2021/04/23(金) 12:01:02.99ID:tWGuVFO6
非表示オプションにしてもコンソールが一瞬表示される問題さえ解決すればそのまま納品物にできるんだがなあ
今はPS2EXEでEXEにして納品してる
2021/04/23(金) 13:14:07.27ID:qwQTUI3N
>>175
lessはbashの一部ではなくてコマンドではあるけど気持ちは分かるかな
自分はlinux環境でもbatやfd-find、ripgrepに切り替えててwindowsでもchocolateyで導入してるんで、同じ環境になってきました
2021/04/23(金) 15:21:26.04ID:cVnO9LUt
Powershell(でなくてもいいがwindowsで)で「tail -f」したい。。
2021/04/23(金) 15:43:23.54ID:qwQTUI3N
>>179
baretail はどう?
https://baremetalsoft.com/baretail/
2021/04/23(金) 15:49:10.77ID:qwQTUI3N
あとはget-contentにwaitオプションつけるとか
baretailは大きなサイズのファイルでもサクサク開けるのでビュワーとしても使える
2021/04/23(金) 16:04:17.49ID:S2TaYi95
Unixツールのtail.exeを入れてるけど
2021/04/23(金) 17:48:18.62ID:V+AIjWKb
ちょっと昔まではバッチとの比較がほとんどだったのに
時代の流れを感じる
2021/04/23(金) 18:49:11.49ID:dmQwGyWy
Git for Windows入れたらtail.exeとかも使えるようになる
2021/04/23(金) 21:13:11.15ID:X1KZalWz
param()と書くだけで
自分で書いたスクリプトもちゃんとパラメータ補完してくれるの偉い
自分の書いたの程覚えられない()
先頭複数行コメントがget-helpできるのも便利そう、思うだけでやってないが

bash/readlineもコマンド補完に力入れてる方だけど、コマンド毎のデータは誰かが手打ちしなきゃならないし、ちょっと仕様が複雑すぎる
まあpwshもpsとcmdlet以外はそうだけど、#!/usr/bin/pwsh、param、startするだけのラッパ書けばよい
ところでwslの人はポータブルにps1書けるの?シバンを認識するかとか、認識にps1拡張子必要かとか
まだ配布できる完成度じゃないけど、折角ならポータブルなスクリプトを書きたい
2021/04/24(土) 00:07:18.71ID:zsZadCrK
>>184
そこまでするならWSL2の方がいいんでは?
git for windows SDKならpacmanでいろいろ入れられるから便利かとは思いますが
2021/04/24(土) 16:21:27.70ID:eHVgMjKX
>>176
向いてる用途ってどういうのですか?
逆に向いてないのは?
2021/04/24(土) 16:42:22.65ID:w/nYR7g5
windowsの内臓に手を突っ込むようなのが向いてる
2021/04/24(土) 17:03:59.31ID:BpMFGApW
windowsにプリインストールされてる対話環境もあるスクリプト言語っていう意味では向いてる、のかな???
2021/04/24(土) 19:56:10.43ID:t2qu3ovB
正直wikdows周りの事には使ってない唐突にcosとか呼べるので(i)pythonから移行した

オブジェクトを置き去りにするとテーブル表示になって、ピボットテーブルみたいにグリグリできるのでデータ分析にもオッケー、パイプで書けるのも素直
csv, json, xmlもそのまま読み書きできる
高度な関数や重い行列計算はさすがにOctaveとかに投げるが
学習コスト下げたい人はR, Python, Octaveで自己完結した方がいいかも
2021/04/24(土) 19:59:04.19ID:t2qu3ovB
Out-GridView(ogv)が個人的にキラーcmdlet

あとシェルとしても使える()
2021/04/24(土) 20:01:35.65ID:t2qu3ovB
偏った見方なのは承知してるけど、インタラクティブにエクセル職人的な事やりたいなら、現状で最適なソフトかなと
2021/04/24(土) 20:12:31.38ID:w/nYR7g5
PC起動したら、起動時刻と前回立ち下げ時刻をサーバのエクセルに追記させる
みたいなことを、他の言語でやろうとしたら大変
2021/04/24(土) 22:11:52.14ID:zsZadCrK
>>191
たしかにogvはお手軽に結果一覧するには超便利ですね
195187
垢版 |
2021/04/24(土) 23:12:45.35ID:eHVgMjKX
皆さんありがとうございます
2021/04/25(日) 05:08:51.91ID:Xjg3V2+s
お知恵をお貸し頂きたく…。

Excnange Online に接続して Get で出力したんですが、
波括弧{}でくくられた情報が wrap しても out-file してもどうしても省略されます。
これを全部表示する方法をどなたかご存じでしょうか…。
197196
垢版 |
2021/04/25(日) 05:11:37.83ID:Xjg3V2+s
言葉足らずでした。
{192.168.0.1,192.168.0.2,192.168.0.3,192.168.0.4,...}
みたいに途中で切れてしまうアレです…。
2021/04/25(日) 05:32:42.88ID:2+KF94a+
Out-GridVewもいいけどfzfをPowerShellで使えるようにしたほうが一貫性があっていいと思うけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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