X



PowerShell -Part 5
■ このスレッドは過去ログ倉庫に格納されています
0153デフォルトの名無しさん
垢版 |
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
0154デフォルトの名無しさん
垢版 |
2021/04/19(月) 08:23:13.80ID:tyk9bMXM
中古シェルだとたかが数値計算すらbcなんてコマンドをわざわざ使わなきゃいけないのか
しかも結果が文字列ってアホすぎ
0155デフォルトの名無しさん
垢版 |
2021/04/19(月) 08:49:51.52ID:Igt3l5xr
bashって外部コマンド使わずに純粋にシェルの機能だけだとまともな事出来ないの?
0158デフォルトの名無しさん
垢版 |
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 でできています
どのような理由が考えられるでしょうか?
0160デフォルトの名無しさん
垢版 |
2021/04/19(月) 17:32:10.70ID:J8N2amqC
ちなみに同じテキストファイルは
秀丸エディタだと普通に \n で検索、置換ができています
0161デフォルトの名無しさん
垢版 |
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がない)
0165デフォルトの名無しさん
垢版 |
2021/04/19(月) 18:54:06.68ID:PAGvXSVw
>>144は、結果の数値に応じて場合分けするのに
最初の2桁を使いたいからその方法を聞いてるの?
0166デフォルトの名無しさん
垢版 |
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
0168デフォルトの名無しさん
垢版 |
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で書くのもいいかもしれないけど
0169デフォルトの名無しさん
垢版 |
2021/04/22(木) 12:59:06.25ID:dQFy3Puj
行/列(オブジェクト/プロパティ)をピボットテーブルみたいにグリグリ出来るのも楽しいね
そういうインタラクティブデータ分析はpython/pandasでやってたけど、pwshの方が楽かもしれない
0170デフォルトの名無しさん
垢版 |
2021/04/22(木) 13:13:23.93ID:fmuwQogZ
他の言語で書いたらかなりの分量になるところを、psだと異様に短くなる
というケースが楽しい
0171デフォルトの名無しさん
垢版 |
2021/04/22(木) 13:22:29.78ID:dQFy3Puj
echoしなくていいとか、?、%、&(call operator)、$_とか使いたくなりますね
perl臭がしてくるけど
0172デフォルトの名無しさん
垢版 |
2021/04/22(木) 13:30:39.34ID:dQFy3Puj
かっちり書けばほぼC#なのもいいところ
前からネットでサンプルコードちらほら見かけてたけど、そういうのはエイリアス無し&キャメルケースの厳つい見た目なので敬遠してしまってた

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

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

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

オブジェクトを置き去りにするとテーブル表示になって、ピボットテーブルみたいにグリグリできるのでデータ分析にもオッケー、パイプで書けるのも素直
csv, json, xmlもそのまま読み書きできる
高度な関数や重い行列計算はさすがにOctaveとかに投げるが
学習コスト下げたい人はR, Python, Octaveで自己完結した方がいいかも
0192デフォルトの名無しさん
垢版 |
2021/04/24(土) 20:01:35.65ID:t2qu3ovB
偏った見方なのは承知してるけど、インタラクティブにエクセル職人的な事やりたいなら、現状で最適なソフトかなと
0193デフォルトの名無しさん
垢版 |
2021/04/24(土) 20:12:31.38ID:w/nYR7g5
PC起動したら、起動時刻と前回立ち下げ時刻をサーバのエクセルに追記させる
みたいなことを、他の言語でやろうとしたら大変
0195187
垢版 |
2021/04/24(土) 23:12:45.35ID:eHVgMjKX
皆さんありがとうございます
0196デフォルトの名無しさん
垢版 |
2021/04/25(日) 05:08:51.91ID:Xjg3V2+s
お知恵をお貸し頂きたく…。

Excnange Online に接続して Get で出力したんですが、
波括弧{}でくくられた情報が wrap しても out-file してもどうしても省略されます。
これを全部表示する方法をどなたかご存じでしょうか…。
0197196
垢版 |
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,...}
みたいに途中で切れてしまうアレです…。
0198デフォルトの名無しさん
垢版 |
2021/04/25(日) 05:32:42.88ID:2+KF94a+
Out-GridVewもいいけどfzfをPowerShellで使えるようにしたほうが一貫性があっていいと思うけど
0200デフォルトの名無しさん
垢版 |
2021/04/25(日) 18:02:45.39ID:Vn29MKgq
>>197
exchange onlineを触ったことが無いのでお困りの内容が正確にはわかってないのですが、対象のコレクションに対してforeach-objectするのはうまくいかないんでしょうか?
cmdletを記載してくれればもう少し分かるかも
0201デフォルトの名無しさん
垢版 |
2021/04/25(日) 18:53:01.63ID:s++hWM3P
テキストファイルの空白行を連番で
[1]
[2]
のように置換するにはどうするといいでしょうか???
0202デフォルトの名無しさん
垢版 |
2021/04/25(日) 19:15:47.03ID:byqvN0Ft
>>201
$i=1
foreach ($l in Get-Content test.txt) {
if ($l.Length -eq 0){
Write-Output ("[" + $i.ToString() + "]")
$i=$i+1
}else{
$l
}

}

こういう感じでいかがでしょうか。
あんまりうまくないと思いますが・・・。
0203デフォルトの名無しさん
垢版 |
2021/04/25(日) 19:22:08.51ID:/7sF+uPH
>>201
下手だけどワンライナーだとこんな感じ
$i=0;Get-Content test.txt|ForEach-Object {if($_ -eq ""){$i++;"[$i]"}else{$_}}
0205デフォルトの名無しさん
垢版 |
2021/04/26(月) 01:03:37.54ID:BYmi+i0r
>>196
Exchenge Online使ってないから入力や出力したい形式が分からないけど
$var | Out-File var.txt
だと表形式で長い値は省略されて
$var | Format-Table -Wrap | Out-File var.txt
だと省略されずに保存される
0210デフォルトの名無しさん
垢版 |
2021/04/27(火) 00:21:38.16ID:UNWScvKY
catみたいに標準入力の結果を吐いてほしいんじゃないの
PowerShellはシェルとしての使いやすさよりも直行性を重視してるところがあるので、単に設計思想の違いだろう
0211デフォルトの名無しさん
垢版 |
2021/04/27(火) 03:10:21.87ID:SJKbfdaZ
標準入力を受け取らない理由なんてないし、実際受け取るんだけども…
get-contentという名前から、何を入力として期待しているのか考えてみなよ
0213デフォルトの名無しさん
垢版 |
2021/04/27(火) 08:35:24.00ID:5DBHgWrV
>>211
「内容を取得せよ」という名前なんだからcatみたいに標準入力があれば標準入力の内容も出力してくれても別におかしくはないでしょ
PowerShellのget-contentに同様の機能があれば君も普通に使ってると思うぞ
とはいえ、あれば便利だからといって何でも入れたら神コマンド化するから、そこは直行性とのバランスで取捨選択した結果なんだろう
0214デフォルトの名無しさん
垢版 |
2021/04/27(火) 09:10:46.77ID:x4iH29Y2
その反応はアドバイスに対して論理が微妙じゃね
「『内容を取得せよ』という名前なんだから標準入力から受け取ったファイル名を元に内容を取り出す仕様でも別におかしくはないでしょ」っていうのもまんま成り立つよな
二通りの仕様が考えられるときにcatと同じじゃないのはおかしいというのは先入観に引きずられすぎ
ゼロベースで考えたらGet-Contentの今の仕様は妥当だと思う

Poweshellで標準入力を標準出力にパイプしたいときにcatじゃなきゃいけない理由ってあるの?
0215デフォルトの名無しさん
垢版 |
2021/04/27(火) 10:03:00.94ID:5DBHgWrV
catは echo abc | cat x.txt - y.txt で x.txt と文字列 "abc" と y.txt を順に結合できる
同じことをpwshでやろうとすると少し頭使うだろう
pwshにはエイリアスにlsとかあったりするのに、MSがget-contentを設計する際にcatを全く意識せずゼロベースで考えたというのはさすがに普通に考えてありえない
意思を持ってcatと同じにしなかったのだろうし、別にそれが間違っているとは思わない
0216デフォルトの名無しさん
垢版 |
2021/04/27(火) 11:22:55.90ID:VpxSAxjv
あー、concatinateとして使いたいってことか
普通のcatもその使い方しないから全然気づけなかった
0217デフォルトの名無しさん
垢版 |
2021/04/27(火) 12:44:35.43ID:a/NQjOQm
なるほどね、208の質問にそう答えてくれてればスムーズに話が進んでたと思うよ
直行性という意味ではjoinなどの結合操作だね
書き方に悩むのはどっちに慣れてるかってことでしかないと思う
歴史的経緯でこんがらがった過去のシェル環境達を負の遺産ごと継承するよりも改めて再整理したいって話と、わかりやすいエイリアスを付けてあげたいってのもまた別の話
0220デフォルトの名無しさん
垢版 |
2021/04/27(火) 14:42:03.79ID:y9F4OEgN
get-contentで検索文字列をテキストから取得し変数に入れているのですが、
*検索文字1*,*検索文字2*
と変数に入れると何も返ってこなくなります。検索文字列が一つだけなら問題なにのですが…
変数 = テキストファイル
get-content パス $変数
です。カンマをエスケープさせるのかアスタリスクをエスケープさせるのかこんがらがってきました…
知見を下さい…
0222デフォルトの名無しさん
垢版 |
2021/04/27(火) 15:14:13.72ID:y9F4OEgN
>>220
分かりにくいですね…
要はget-childitemで複数のファイルを検索するためにテキストファイルを使いたいって事です。
0223デフォルトの名無しさん
垢版 |
2021/04/27(火) 20:30:55.10ID:8D7txu9u
テキストの中身をカンマじゃなくて改行で区切ればそんな苦労しなくて済むぞ
あと余計なお世話だけどGet-ChildItemが手打ちで動くことは確認した?
パラメーターがちょい怪しい気がするんだが…
0224デフォルトの名無しさん
垢版 |
2021/04/27(火) 20:51:05.42ID:P9G7ihch
>>220
リテラルではカンマで渡してるから配列にしないとダメみたいね

test.txtの内容:
*.jpg,*.png

$r = gc test.txt
gci パス\* -Include ($r -split ",")

パスがカレントフォルダなら
gci ($r -split ",")
または
gci .\* -Include ($r -split ",")
または
gci * -Include ($r -split ",")
0225デフォルトの名無しさん
垢版 |
2021/04/28(水) 09:11:25.07ID:BmPpt58I
なんかテキストベースの志向してる人多くない?
テキストベースのデータは最低限配列化して扱うもんじゃないの?
0226デフォルトの名無しさん
垢版 |
2021/04/28(水) 10:37:10.61ID:mkVGlKi3
PowerShellで配列を明示的に使うのはダサいしハマりやすいよ
パイプに任せた方がいい
0227デフォルトの名無しさん
垢版 |
2021/04/28(水) 11:05:06.60ID:DwQIIr/C
他のシェルではテキストベースが普通というかむしろpwshが異端だしなぁ
手段を選ばなけりゃpwshでもInvoke-Expression使えるし
0228デフォルトの名無しさん
垢版 |
2021/04/28(水) 15:44:13.18ID:6n3amPUA
>>224
現在、環境がないので後日試してみます!ありがとうございます。
>>223
ファイルを使わずコマンド単体なら複数検索でも動くのですが…改行で動くのですか?カンマに捕らわれすぎてたかもしれません。試してみます!
0229デフォルトの名無しさん
垢版 |
2021/04/29(木) 12:08:07.23ID:1cDcYESD
略称としてはpwshが今公式に推されている?
しかしposh呼びしているMSドキュメントも多い
拡張子的にはps

pshとか収まり良いけど既にあったりして紛らわしい系?
0230デフォルトの名無しさん
垢版 |
2021/04/29(木) 12:47:36.17ID:Gvkp+FCp
推すとかじゃなくPowerShell6から実行ファイル名がpwshになった
コマンドとしてpwshが正式名称
0231デフォルトの名無しさん
垢版 |
2021/04/29(木) 12:58:06.09ID:h5Kbt4/j
pwshへのリネームはとんでもない破壊的変更なわけだけど、今後どうするんだろうね
powershellをpwshのエイリアスにしたらそれこそ阿鼻叫喚だろうからそれもなさそう
5は凍結して、そのうちWindowsにデフォルトでは入らなくてオプションで入れるようになるんだろうか
0232デフォルトの名無しさん
垢版 |
2021/04/29(木) 13:49:20.18ID:zjFXGfaT
実行ファイルの名前以前にwindows由来のモジュールが分離されてインポート必須になってるから、移行するんであればスクリプトの修正は必須ですね
0233デフォルトの名無しさん
垢版 |
2021/04/29(木) 16:15:10.36ID:BF1GEXOZ
複数バージョンの同居認めてるからその辺は問題にならないと思う
つーかログオンスクリプトで既にガンガン使ってるから5が標準で消えたら死ぬ
0234デフォルトの名無しさん
垢版 |
2021/04/29(木) 16:25:44.14ID:1cDcYESD
6はapt経由で7-preview入れたら塗りつぶされたけど、大体互換だからかな?
とりあえず俺は問題起きてないしよしとしよう
0237デフォルトの名無しさん
垢版 |
2021/04/29(木) 21:34:01.87ID:tWFzcYm5
自分のスクリプト用はPowershell7
社内スクリプトやらはWindows Powershell(5系)
MSは互換性維持の為に古いものを限界まで残す所だから当面問題は無いと思う
ただPowershell7系はそろそろ安定して快適だしWindows標準で入れてくれて良いと思う
0239デフォルトの名無しさん
垢版 |
2021/04/30(金) 02:48:31.39ID:YlfW6qtC
6→7では||とか&&とか?:とか演算子かなり増えたと思ったけど
6で実行すると将来の拡張に予約的なメッセージが出たはず
後方互換性はちゃっかり確保してるのね
0240デフォルトの名無しさん
垢版 |
2021/04/30(金) 03:23:30.90ID:YlfW6qtC
>>238
バックエンドの.NETが提供される限り、言語の部分に関してプラットフォームは関係ないからね
(俺は7持ってないから確認は出来ないが)

シス管機能に関わるプロバイダの部分は、VistaくらいからCim規格準拠(WMIとして)に力入れてるので、それも寄与してるかと

まだ公式リリースされてないが、 linuxでは特にUbuntuもCim準拠に力入れてる
近いうちにpwshのプラットフォーム間相互運用性の確保(pwshコードベースのメンテコスト)はかなり楽になるだろう

今はまだ統一的に見えるユーザーエクスペリエンスは、対応するAPIを繋ぎ合わせたアドホック実装されてる

アドホック実装が減ればコードベースが削減されるわけで、伝統シェルに劣るとされるファイルサイズデカい問題も解消されると期待している
0242デフォルトの名無しさん
垢版 |
2021/04/30(金) 04:37:38.21ID:wKh1zPtl
マルチプラットフォーム化の為に作り替えて、
違う系統であることが明確になるよう、名前も変えてたね
(.NETと同じく過渡的な措置だったのだろうけど)

Windows PowerShell(5系以前) → PowerShell Core(6系) → PowerShell(7系以降)
0243デフォルトの名無しさん
垢版 |
2021/04/30(金) 09:49:22.19ID:jI6ILm2+
PowerShell core(6系)の時はWindowsの内部操作系(IP確認やら)はホントまともに動かなかった
それがPowerShell7になったら殆ど動く様になった時は感動したわ、Out-GridViewも復活したし
0244デフォルトの名無しさん
垢版 |
2021/04/30(金) 11:12:11.62ID:vAph35tm
略称を作る時に母音を飛ばすのは普通なので、poshよりはpwshの方がまとも
posh1が上品とかの意味を持つ既存の英単語だから、わざとそう呼んだ
posh2として軽蔑する時に発する音、という意味もあるのでなおさら
■ このスレッドは過去ログ倉庫に格納されています

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