X



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/03/26(金) 21:22:13.21ID:SIEsHqNB
>>50
ダメだ、イケてない・・・
正しくわたってない、無かったことにしてください。
ごめんなさい。調子ぶっこきました。
2021/03/26(金) 21:27:33.53ID:dswi0/Vv
>>47
扱える
2021/03/26(金) 23:53:54.40ID:4XawFn4z
>>49
Start-Process sox -ArgumentList "--info","-" -RedirectStandardInput .\audio.flac
で実行できた。ただ、これだと別ウィンドウで実行されて(-Waitを付けても)すぐ消える
-NoNewWindow付けるとコンソール出力されて直接実行の目的は果たせた。ありがとう

ただ、別プロセスのせいか$capture = Start-Process .(ryで出力キャプチャできない
-RedirectStandardOutputでファイル出力はできるけど
出力キャプチャは今んとこcmd経由しか思いつかないな・・・

>>51
Get-Contentはファイル読んでPSオブジェクト作るからwavみたいな巨大ファイル喰わせると
消費メモリがとんでもない事になってよろしくないみたい。
command1 | comannd2でパイプで繋ぐのもそうなのかも(?)
PowerShell使い始めたばかりでまだ仕組みわかってないのでアレですが
2021/03/27(土) 09:30:15.39ID:9NUR6gaS
パワーシェルとWindowsバッチってどう違うの?
2021/03/27(土) 09:34:24.56ID:cvT0SSdW
異なるスクリプト言語
2021/03/27(土) 10:40:57.10ID:TlGVFU3L
PowerShellはシェル
バッチはコマンドを連続して実行すること
PowerShell上でバッチを動かすことも可能
2021/03/27(土) 20:22:03.71ID:uSYmOJju
powershellは起動時のロードがクソ遅いからログインスクリプトとかで迂闊に使えない
vbsとバッチは相変わらず超速
58デフォルトの名無しさん
垢版 |
2021/03/27(土) 21:16:23.22ID:17oRwajB
1000台規模のネットブートシステムでスタートアップ・ログオンスクリプト共々PowerShellで組んでるけど遅いときなんて一度も無いな
PowerShellの起動が遅いと感じたのはWindows7の頃が最後だな
2021/03/27(土) 21:51:02.28ID:XCgMDSTR
そりゃそんなんじゃ起動の遅さなんて気にならんだろ。
2021/03/27(土) 21:52:07.31ID:c8B2TB9l
遅い(ストレージがHDD)
2021/03/28(日) 09:17:08.07ID:bwt8R5Sf
>>53
PowerShell Teamのブログに今月こんなのが出た

PowerShell Team 2021 Investments
https://devblogs.microsoft.com/powershell/powershell-team-2021-investments/

この中に

Improve native command experience
One of the goals of PowerShell 7.1 was to improve the shell experience. This includes using native commands within PowerShell more intuitively like other shells.

って節があるのだけど、そこで挙げてる3項目の一つが

PowerShell currently treats all output from native commands as text. This means that binary output from commands is converted to text, resulting in data loss, even if the intent is to redirect that output to a file or another command that accepts the binary output.

バイナリ出力が扱えるようになればバイナリ入力もできるようになるだろう
もしかすると年内に実現するかもしれない

やっと他のシェルを経由しなくてもすむようになる
それにしても今頃こんなところに手を入れるなんて遅すぎるとしか言いようがない
2021/03/28(日) 11:25:17.75ID:6r1EOw6A
カレントディレクトリにあるスクリプトファイルを
フルパスでなくファイル名だけ指定しても実行できないのはどうしてでしょうか?
2021/03/28(日) 11:35:58.09ID:WPyWLlG4
セキュリティ上の配慮だと初期バージョンの頃から明言されていた
2021/03/28(日) 11:58:30.02ID:G6KSiarP
linuxやって検索パスにカレントディレクトリ"."を入れてないと実行出来へんので違和感無し。

検索パスにカレントディレクトリを含めるのはセキュリティ上非推奨やしな。
2021/03/28(日) 12:14:42.01ID:6r1EOw6A
ありがとう

なんとかマイクロソフトのページ検索できた
確かにセキュリティの機能としてそうなってるって書いてた
2021/03/28(日) 12:24:21.92ID:qLGWMSxC
まぁフルパスやなくて相対パスでええしな。
2021/03/28(日) 12:29:47.73ID:wpKLokvI
>>58
> 1000台規模のネットブートシステム

これってWindowsをディスクレスでネットワークブートできるってこと?
2021/03/28(日) 14:06:49.10ID:NjmNZXxg
#!/usr/bin/env ruby

puts RUBY_VERSION #=> 2.6.6

Linux でも、こういう内容の、a.rb ファイルを作って、
a.rb と実行してもエラー。
そもそも、bash で入力補完もできないし

./a.rb なら実行できるし、
./a と打っても、入力補完も働く

シバンに、/usr/bin/ruby ではなく、env を使っているのは、
anyenv/rbenv で、複数のバージョンを切り替えているため、
/usr/bin/ruby は存在しない
2021/03/28(日) 15:12:05.97ID:xIH5FjVn
PowerShellだろうがbashだろうがzshだろうがtcshだろうが
コマンドの検索パスに . が入っているかどうかだけの問題
入っていればカレントディレクトリの実行ファイルがパスなしで動く
PowerShellの場合でも$env:PATHに入れてやれば動く
入ってなくても動くcmd.exeとかcommand.comが特殊なだけ
2021/03/29(月) 00:14:19.86ID:AC49a7XE
$ping_result=(Test-Connection -count 2 8.8.8.8)
$ping_result #@

Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
DESKTOP-E1... 8.8.8.8 8.8.4.4 32 3
DESKTOP-E1... 8.8.8.8 8.8.4.4 32 3

$proc_result=(Get-Process)
$proc_result #A

Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
547 32 19840 10308 2.72 11144 1 ApplicationFrameHost
123 8 1564 1552 3404 0 armsvc

@とAの後ろに、| select-objectを付けると

 @は、TAB補完で IPV4Address、 IPV6Address だけが出てきます。
 Aは、Handles〜ProcessNameまで全部出てきます。

Get-memberしても、列タイトルと名前が一致しません。
例えば、$ping_resultのTime(ms) はReplyTimesという名前で値が入ってます

ほかのコマンドでもちらちらこういう、「コマンドレット実行したときに表示されるタイトルと、実際に.プロパティ名で取る際の名前が違う」
というのがあります。こういう違いって何か明確な区分けがあるんでしょうか?よろしくお願いいたします。
2021/03/29(月) 14:41:37.92ID:+vuzzbeH
出力の仕様は書式設定ファイルで定義されている
ファイルの中では表示したいプロパティの名前を指定してもいいし、結果を計算するスクリプトブロックを指定してもいい

about_Format.ps1xml
https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847831(v=wps.640)
2021/03/30(火) 23:15:43.59ID:AnfR1yyf
無限ループにして走らせておきたいスクリプトがあって
コマンドプロンプトの画面で実行させてるけど邪魔
見えないようにして、かつ終了もさせられるようにするにはどうしたらいい?
2021/03/31(水) 00:36:37.55ID:bnFDknJn
よからぬ事に使う目的にしか見えない
2021/03/31(水) 09:05:46.55ID:Y3PcTBvP
>>72
タスクで別ユーザで実行させとけばいいんじゃね
2021/03/31(水) 09:38:27.22ID:YEibHbKm
ウィンドウの位置とサイズを固定させる用途だから、ユーザが自分でないと
2021/03/31(水) 10:00:59.54ID:gA7tKZjY
仮想デスクトップ分ければ?
2021/03/31(水) 10:10:11.65ID:YEibHbKm
仮想デスクトップでばっちり
2021/03/31(水) 15:09:07.56ID:GYCr8oLd
タスクトレイに常駐させるのがスマートだけど
それのイベント拾う非表示のウィンドウが必要なんだよな
作り方は他の言語と同じだから全省略するね
2021/03/31(水) 15:21:44.88ID:AtIsL56M
pwsh --helpで出てくる公知なことを隠す必要なんてないと思うが…

スクリプトの実行ポリシーはガッチガチだし、ドキュメントどころか--helpすら読まない奴はスクリプトキディにもなれんだろうから安心
2021/03/31(水) 23:05:55.25ID:M9w8Znx+
[System.DateTime]::Now.kind

@これを読むとすると
system.date.timeクラスの、nowメソッドのkindプロパティでいいでしょうか。
違ってたら読み方?教えてください

Aこういうのってどっかに一覧があるんでしょうか

Bこういうのを使うとPowershellらしい、新しい書き方になると思ってるんですが
実際の所はどうなんでしょうか?使う人のほうが少ないんしょうか。
例えば、[System.DateTime]::Nowであれば、Get-Date と同じものなので、
わざわざこういう書き方をしないで、コマンドレットの読みやすい表記を使う人のほうが多いんでしょうか
2021/03/31(水) 23:43:46.86ID:mCZD0Ait
>>80
System名前空間のDateTime構造体の静的Nowプロパティが返す(System.DateTime型の)オブジェクトのKindプロパティかな

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime
2021/03/31(水) 23:59:39.51ID:XczoOgFc
構造体ってなんぞ?
2021/04/01(木) 00:23:39.07ID:PSFjtGJo
>>82
プロパティのみのクラスオブジェクトなんじゃね
2021/04/01(木) 00:38:41.91ID:u/4v0CTW
なるほどなるほど
2021/04/01(木) 04:57:15.84ID:xXKhkzDq
>>82-84
構造体にもメソッドあるぞ
クラスは参照型、構造体は値型
詳しくはWebで ⇒ https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/
86デフォルトの名無しさん
垢版 |
2021/04/01(木) 07:41:37.81ID:klwu+MWY
powershellのタブ補完はディレクトリ末尾にバックスラッシュを付与するので、多くのWin32アプリが引数をうまく受け取れないってのは既知?
2021/04/01(木) 19:32:54.94ID:T6HNdWih
スラッシュならともかくバックスラッシュなら処理できるんじゃね
2021/04/01(木) 20:43:50.58ID:M+/UvE/I
ディレクトリの場合は末尾にバックスラッシュ補完してくれるほうがありがたいが、
アプリは引数のディレクトリ末尾にバックスラッシュあるとうまく受け取れないん?
2021/04/01(木) 20:45:21.44ID:SMpNE7HF
あってもなくても正しく動くように全員が実装している必要がある
2021/04/03(土) 02:27:37.45ID:KxHmdFnt
職場でPowerShell書いたらバッチでいいと言われたよ
2021/04/03(土) 05:39:47.61ID:1anAZoL9
設定しないと動かないからな
92デフォルトの名無しさん
垢版 |
2021/04/03(土) 08:07:25.49ID:EzmFJzRe
新しく作るスクリプトに関してはもうバッチ使わないで欲しいよな
2021/04/03(土) 08:10:54.91ID:GvC+rDGr
標準ではps1の実行権限ついてないから配布する場合はちょっと面倒なんだよね
2021/04/03(土) 09:26:04.03ID:inQlliUt
他人に使ってもらう必要がある奴はバッチにPowerShellを埋め込んで配布してる
https://www.pg-fl.jp/program/tips/ps1bat2.htm
2021/04/03(土) 10:15:30.26ID:1anAZoL9
ウィルスのような手口
2021/04/03(土) 10:55:18.98ID:sC0R2LUF
バッチだと悪さができないとでも?w
2021/04/03(土) 11:16:34.59ID:zA7glofo
1行batとの2ファイル構成が楽でいい
先人はよくもbatなんかを使い続けてきたものよな
2021/04/03(土) 12:16:39.84ID:GvC+rDGr
>>94
その方法管理者権限必要だろ
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
これだな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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