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/11/21(日) 14:12:17.11ID:03fh42bF
>>780
それはエラーで正しい
2021/11/21(日) 15:37:22.85ID:rt6j8p0A
どうでもいいけど -notmatch 'foo|bar' でよくね
783デフォルトの名無しさん
垢版 |
2021/11/21(日) 23:12:49.29ID:ny8+2EkL
先日の質問者です。
下記コードで、想定通りの動作を確認しました。

事前に展開するディレクトリを作成する必要はありますが、
正規表現で抽出して、「Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)」で
展開先ディレクトリに取得した要素を展開する感じです。

色々とアドバイス頂きありがとうございました。

---------------------------------------------------------------------------------
#出力先ディレクトリ
$SrcPath = 任意のディレクトリ

#出力先ディレクトリ(スクリプトの置き場 + 展開するディレクトリ)
$DstPath = Join-Path (Split-Path $MyInvocation.MyCommand.path) ("\test")

#抽出&コピー
Get-ChildItem -Recurse $SrcPath | ?{ $_.FullName -match "^(?!.*file)"} | `
Copy-Item -Destination {Join-Path $DstPath $_.FullName.Substring($SrcPath.Length)}
784デフォルトの名無しさん
垢版 |
2021/11/21(日) 23:14:57.70ID:ny8+2EkL
誤字が酷い・・・
以下の通り訂正します。

#コピー元ディレクトリ
$SrcPath = 任意のディレクトリ
2021/11/22(月) 01:24:51.37ID:DJE+GLbt
除外するのがファイルなら、全部コピーしてから消す方が、考える時間ノータイムでできるから、自分ならそうしちゃうな
ディレクトリ除外するなら素直にrobocopy使っちゃう
2021/11/22(月) 02:13:30.35ID:l3U7Q7kM
除外する理由も不明で全部コピーとか機械オンチかな
ストレージは有限リソースだぞ
2021/11/22(月) 02:45:11.19ID:49bPrPzL
Join-Pathのところ
$_.Fullname.replace($SrcPath,$DstPath)
でもよさそう
2021/11/22(月) 04:31:54.22ID:y2hovgGl
除外したいファイルが巨大ファイルかもしれないのに一旦コピーしてから削除とかアホやろ
2021/11/22(月) 10:05:58.61ID:xI4p9npJ
巨大ファイルかもしれないし小さいファイルかもしれない
質問者がまだ開示してない範囲なのでアイデアは言うだけタダだし叩くいわれもないだろう
2021/11/22(月) 10:12:16.38ID:xI4p9npJ
せっかく何でも呼べるシェルなのにrobocopyを呼ばない理由があるのかは知らん
純PSを使いたいという拘りは遊びや向学の範囲ならありだと思うけど
2021/11/22(月) 10:58:52.55ID:ssU9K32s
流石にコピーしてから削除は素人くさくて人には見せられないコードだな
792デフォルトの名無しさん
垢版 |
2021/11/22(月) 11:21:13.08ID:JeDQJ1PF
対象のファイル存在判定判定を行いたいんだけど
get-childitemで「〜が存在しない為検出できません」と表示されてFalseが返ってくる時と、対象ファイルはないけど何も表示されずにTrueが返ってくる時の違いって何でしょうか?

正規表現で複数のファイルを探してる時と限定して一つを探してる時の差って認識で合ってますでしょうか

認識が合ってるのであれば、Falseが返ってくる際のファイル存在判定ってどうやって行ったらいいですかね
2021/11/22(月) 11:32:08.25ID:y2hovgGl
>>792
Test-Path
2021/11/22(月) 11:57:50.46ID:vpaN3qMO
robocopyという既存で使えるコマンドがあることはわかりました。

しかし、それを承知の上で、純PowerShellのコマンドで実現できる方法を探していました。

ストレージにも容量があるため、抽出とコピーを同時に済ませたかった次第です。
2021/11/22(月) 12:33:14.41ID:DJE+GLbt
あ、やっぱスクリプト書くのが目的なんですね
それならそれでよいと思います
ぱぱっと仕事を済ませるために使えるものを使うのであれば
そういう考え方もあるってことで
もちろん、コピー不要なファイルのサイズが大きすぎたりしたときは使えませんが

ただ、エラー時のリトライとかマルチスレッドをpowershellで実装するのは面倒なのでrobocopyかrsync使うことをお勧めします
自分しかアクセスしない領域を扱うなら、ここに書かれていた例でも十分かと思います
796デフォルトの名無しさん
垢版 |
2021/11/22(月) 12:46:04.31ID:JeDQJ1PF
>>793
test-pathって複数ファイル判定できるのか?
797デフォルトの名無しさん
垢版 |
2021/11/22(月) 13:07:04.73ID:DJE+GLbt
test-pathはstring[]を引数に取れて、それぞれの判定結果を返しますね
2021/11/22(月) 13:52:50.70ID:jUHFyU9k
>>791
SSDを殺すツールでも作るのかね?
2021/11/22(月) 20:21:46.68ID:nGTeQ/fQ
仕事で使うならrobocopyだな
2021/11/22(月) 22:15:42.91ID:EOO8UMxm
今回の目的だとRobocopyで良いんだが
Powershellなら複数の条件のandでフィルターしたり正規表現でのフィルターやらリネームしながらのコピーとか活用シーンはあるわ
2021/11/23(火) 00:34:07.96ID:co/a4Nbp
>>787
大文字小文字の差異が発生したときにちゃんと動かないと思う
2021/11/23(火) 17:04:45.84ID:d0x80b5K
じゃあ -reprace 演算子で
2021/11/23(火) 20:11:06.49ID:LL+Lkvmb
せめて-creplaceと書いとけ
2021/11/23(火) 21:13:38.28ID:td4eh3RA
Copy-Itemって時刻や属性とかACLやらもコピーされるんかな
同じにしといてや
2021/11/23(火) 21:15:13.83ID:d0x80b5K
>>803
大文字と小文字の差を無視したいんじゃないの?
806デフォルトの名無しさん
垢版 |
2021/11/25(木) 06:55:00.80ID:wkKQrHcX
質問です / たとえば…
膨大にファイルがあるディレクトリ以下から 古いファイルを探そうと思って
ls -r |? lastwritetime -lt "2015/10/10"
などとしたら…思いがけなく 沢山のファイルが該当したとき、
「この結果…変数に入れとけばよかったなぁ…そうすれば後で絞り込んだりできるし」
と思うことが あるのですが

でも、あらかじめ
$list = ls -r |? lastwritetime -lt "2015/10/10"
などとすると、検索中は 表示が見えない.

…というわけで、変数に入れつつ 表示させる手段を 今、探していますが なんだか分からず.
今のところは、「ファイルにリダイレクトしながら tee」ってのが、近いけど
使うかどうかわからない結果について、いちいちファイル作りたく無い気持ち(笑)はあったり
807デフォルトの名無しさん
垢版 |
2021/11/25(木) 07:19:34.90ID:wkKQrHcX
(これも 検索でも分からなかったのですが)
昔unixを使ってた慣れから pushd と popd を使うことがあるのですが
スタックの中身って見れないのでしょうか (dirsみたいな)
2021/11/25(木) 07:47:43.37ID:tyDWZMxk
>>806
Where-Object -OutVariableとかでできなかったっけ
809デフォルトの名無しさん
垢版 |
2021/11/25(木) 09:20:52.19ID:e/X72gP4
>>808 ありがとうございました
ls -r |? lastwritetime -lt "2015/10/10" -OutVariable list
知らなかった…調べてみると すべてのコマンドレットに備わってるんですね
810デフォルトの名無しさん
垢版 |
2021/11/25(木) 09:38:35.33ID:e/X72gP4
>>809
-OutVariableは -ov が省略形.
あと tee -Va list でもできちゃう.
2021/11/26(金) 10:20:48.79ID:ncT7Zn6W
>>807
gl -stack
2021/11/26(金) 11:04:55.34ID:ncT7Zn6W
遅レスだけど>>583にも関連ありそうなのでアンカー付けとく、slじゃなくてpush/pop-locationだけど

CDPATH的なモノはsl -で参照できることから存在してるとおもうけど、もっと柔軟に数の引数取りたい、とかなら簡単なシェル関数書けば良いかと
function cd($bwd=1){iex "cd -;" * $bwd}
さらに
{iex "sl ..;" * $up},
{iex "sl +;" * $fwd}…等
(cdのremove-alias、引数を読んでディスパッチ等はよしなに)

まあ気が散るからlocationスタックに慣れた方がいいとは思う
2021/11/29(月) 19:58:38.42ID:FW3KUWhD
$hoge = Invoke-Command -ComputerName 192.168.0.1 -Credential $cred -ScriptBlock {C:\script\cpu.bat}

こんな感じでリモートPCのCPUの情報を取得したんだけど、
リモート側では返り値の型が Hashtable で連想配列なんだけど、実行する側のPCだと Object[] になって配列になるんだけど
これって仕様なの?
連想配列のまま$hogeで受け取る方法とかない?
2021/11/29(月) 20:04:41.43ID:xU0y2yzX
無い
2021/11/29(月) 20:07:54.41ID:FW3KUWhD
無いのかw
PowerShell初めて触ってるんだけど、こいつ癖が強いなぁw
2021/12/04(土) 15:49:34.45ID:3yJp3Bv8
パイプのあくの強さに辟易してからが本番
2021/12/04(土) 15:57:56.73ID:lpLqhZbS
パイプの魅力に取り憑かれたらもう後には戻れない
2021/12/04(土) 20:29:02.53ID:dom41WHA
>>816
パイプってそんなにアク強かったっけ?
むしろ配列の方がトラップ満載な気がするが
2021/12/04(土) 20:33:23.88ID:12OWCJtV
パイプラインが気に入らなかったら使わなきゃ良いんだけど
配列は気に入らなくても使わざるを得ないんだよな
2021/12/04(土) 20:59:45.48ID:NLsksufL
初代プレステみたいな拡張子以外ないの?
もうちょっとかっちょいい拡張子使いたい
821デフォルトの名無しさん
垢版 |
2021/12/04(土) 21:10:22.01ID:jlXR6Mjx
pwshも起動遅いよな
NGenも上手く行かんし。起動の遅さには目をつぶって使ってる感じ?
2021/12/04(土) 22:01:12.10ID:3yJp3Bv8
毎回pwsh起動時に最新バージョンのpwshかWebサイトに確認しにいってる予感
2021/12/05(日) 16:39:28.02ID:iTfrMGLj
24時間ごとに最初のセッションでバージョンチェックが走るので、テレメトリーを無効にすればちょっとだけ起動が速くなるかも

https://github.com/PowerShell/PowerShell/issues/16234

POWERSHELL_UPDATECHECKは通知の制御だけで、バージョンチェック(を含む通信)はテレメトリー自体を止めないとダメみたい
2021/12/05(日) 21:30:10.95ID:4E92Wydv
PowerShellを使っている人はWindows Terminalも使っていること多いでしょ
どっちも素のコマンドプロンプトに比べて起動に時間がかかる
2021/12/05(日) 22:44:22.34ID:MGzOS3+Z
WSL2 で、Linux も使っている人は、Windows Terminal が便利。
ctrl + c でコピーできる

Linux の端末では、右クリックメニューからコピーしないといけない
2021/12/05(日) 23:06:07.82ID:2W/PRbgG
無変換キーで@が入力されるの治ってほしい…
2021/12/05(日) 23:08:46.06ID:EbpaPfY1
>>826
なにそれ
2021/12/05(日) 23:17:25.58ID:2W/PRbgG
Windows Terminal上でPowershellを使ってるとき、IME OFFに割り当てた無変換キーを空打ちすると@が入力されちゃう
2021/12/05(日) 23:46:17.42ID:EbpaPfY1
>>828
再現せんなあ
2021/12/06(月) 00:19:03.74ID:l+QuXC+3
これか
https://twitter.com/nejigami/status/1381587748260249601
https://twitter.com/5chan_nel (5ch newer account)
2021/12/06(月) 16:19:41.17ID:eOuwgSss
psreadlineでバインドし直せばいいんでないの?
2021/12/06(月) 16:45:47.86ID:RFIhcWIP
>>828
Ahkで無変換をime off機能に割り当てて対策してる。
2021/12/06(月) 16:54:29.37ID:eOuwgSss
psreadlineに渡る前にwtに吸われてるのなら無力だったな
めんご
2021/12/08(水) 18:02:05.74ID:fwBoA4il
>>832
AutoHotkeyで解決した、ありがとう
2021/12/11(土) 17:33:02.92ID:lpfa5wkz
今回リモートPCの使用状況をlog化して通知するシステムに利用したんだけど、
みんなは何にPowerShell使ってんの?やっぱり反復処理とか?イマイチ使いみちが思いつかないw
2021/12/11(土) 18:31:42.90ID:l4zQKEWJ
分かってる人には当たり前のことなのかもしれないけど、 Set-PSReadLineOption -EditMode Emacs で
Emacs風味キーバインドにしたらCtrl+DでPowerShellが終了するね
2021/12/11(土) 19:33:39.75ID:Jze+N/0t
Ctrl+Dでの終了はzshでも有効にしてるので、違和感なく使ってました
2021/12/11(土) 19:42:02.74ID:Jze+N/0t
日常的に使ってるのは、VPN接続とリモート接続のログイン自動化スクリプトですね
2021/12/11(土) 21:55:48.50ID:vdCi5/VF
>>834
そんな大層なことしなくても
gci -pa HKLM:/system -rec -inc keyboard* -ea ignore
とかでキーマップが引っかかったと思うから、$profileにブチこんどけばいいんじゃないの、シェル閉じた時のリストア処理も書けるし
2021/12/11(土) 21:58:38.54ID:vdCi5/VF
ターミナル(wt.exe)の問題なら.jsonにキーマップ書けたはずで、それが一番礼儀正しいが
2021/12/11(土) 22:11:14.55ID:T5tvegM+
レジストリはすぐどこ触ったか分からんくなるから$profileか、pwshの外ならuser\**\startupにコマンド書いて設定した方がいい
少なくとも何を触ったかは記録に残る
できれば初期値についてのコメントも

シェル/環境変数みたいにシャドウイングできるといいんだけど
2021/12/12(日) 00:04:01.85ID:kmuza9nw
wsl --help の出力結果をパイプやファイルにリダイレクトすると、PowerShellとWSLが不?戴天の仇らしいことがよくわかる
2021/12/12(日) 21:13:44.01ID:tlt3McAx
Windows PowerShell Inventor Jeffrey Snover Interview
https://evrone.com/jeffrey-snover-interview
2021/12/13(月) 13:52:11.42ID:MDj1w4qb
>>842
とりあえず|out-file -enc 色々噛ませてみては
2021/12/14(火) 06:17:10.79ID:5jyEPH53
なんで不?戴天になってしまったのかと思ったら環境依存文字使ってたからか

不倶戴天 (環境依存文字なし)
不俱戴天 (環境依存文字あり)
846デフォルトの名無しさん
垢版 |
2021/12/14(火) 15:19:22.77ID:6iAGSMwm
お前らlinuxマシンにpwsh入れてる?
2021/12/14(火) 15:49:09.33ID:mpAOsF0a
入れるわけないだろ
こんなもんWindows以外では絶対使わん
2021/12/14(火) 15:54:44.60ID:vLIDlmgW
たぶん、PowerShell が、UTF-8 だからじゃないの?

コマンドプロンプトで、
wsl --help > a.txt
とすると、UTF-16LE になり、VSCode・サクラエディタでも見れる

でも、Windows Terminal(WT)では、PowerShell・コマンドプロンプト・WSL のLinux の3つが使えるけど、
そのコマンドプロンプトでやったら、文字化けして見れない

WT は、UTF-8 だから文字化けするのかも

だから、アプリによる
849デフォルトの名無しさん
垢版 |
2021/12/14(火) 16:00:11.41ID:5jyEPH53
>>848
違うぞ
PowerShellの惨めな現実を受け入れろ
2021/12/14(火) 19:12:38.50ID:HCC7MYbd
パワーー
2021/12/14(火) 20:06:47.20ID:lHfIhTrg
はい
2021/12/15(水) 12:02:30.22ID:PaPmsmcA
まあでもWindows上で使ってるぶんには安定してるな。
当たり前だけどw
2021/12/15(水) 20:55:34.12ID:zohMO0ui
v7.2.1
https://github.com/PowerShell/PowerShell/releases/tag/v7.2.1
854デフォルトの名無しさん
垢版 |
2021/12/16(木) 03:32:22.22ID:V72yjyE9
PowerShell上で非ANSIコードページ文字列をパイプやリダイレクトするには以下のようにcmd /C を使うしかない
cmd /C 'wsl --help > aaa.txt'
「ねぇどんな気持ち?」のクマAAをPowerShell愛好家に贈りたい
855848
垢版 |
2021/12/16(木) 12:30:02.79ID:pA5H+adw
コマンドプロンプトを使わずに、PowerShell で、
wsl --help を文字化けせずに、ファイルへ保存する方法はないのか?

>>848
修正

>でも、Windows Terminal(WT)では、PowerShell・コマンドプロンプト・WSL のLinux の3つが使えるけど、
>そのコマンドプロンプトでやったら、文字化けして見れない。
>WT は、UTF-8 だから文字化けするのかも

Windows Terminal(WT)のコマンドプロンプトで、
もう一度やってみたら、正常に表示された!

ちなみにコマンドプロンプトも、WTのコマンドプロンプトも、両方とも、CP932 でした

chcp
#=> 932
2021/12/16(木) 14:46:23.47ID:fd1vO2kC
Correct output in CMD, but incorrect output to a file in PowerShell #16012
https://github.com/PowerShell/PowerShell/issues/16012
857デフォルトの名無しさん
垢版 |
2021/12/16(木) 15:06:10.72ID:V72yjyE9
PowerShellの定番質問に知ったかぶりしてOutputEncodingを変えろと回答する人って自分で試さないんだろうか?
それとも質問を理解できるだけの国語力がないのか?
2021/12/16(木) 15:11:12.80ID:ywwvfrpp
負けた気がするけどロケールはもう諦めてen_us、圧力掛けるのはおまいらに任せた

あえて真っ白linuxでは使わんけどwslは快適になるな
$profile |add-member -noteprop
で属性付けて
. $profile.common; .$profile.platform
とそーすしてる
2021/12/16(木) 15:23:47.31ID:9aNyIMSV
そんなことより
左辺コレクションの-eqのフィルタの罠に見事に引っ掛かったわ
2021/12/16(木) 15:41:05.53ID:ywwvfrpp
-eq(ual elements are...)と読み慣わしてる
861848
垢版 |
2021/12/16(木) 16:19:44.83ID:pA5H+adw
OutputEncoding を変えるぐらいでは、出来ないだろ。
PowerShell(PS)は、迷走しまくっている

UTF-16LE とか、あるのか?

PS 6 では、BOM 無しUTF-8 も出来るらしいけど
862848
垢版 |
2021/12/16(木) 16:24:12.96ID:pA5H+adw
Windows は、CP932, BOM 有りUTF-8/BOM 無しUTF-8, UTF-16LE が入り乱れて、
外部と日本語でやり取りできないw

一方、Linux は、UTF-8 で統一されているから、全く問題ない。
Ubuntu は、UTF-32 らしいけど、外部には関係ない
863デフォルトの名無しさん
垢版 |
2021/12/16(木) 16:37:31.00ID:V72yjyE9
>>861
Input Encodingがシステムコードページ一択(日本語版Windowsだと932)になってることが原因だよ
UTF16-LEの文字列をSJISとみなしてOutputEncodingに変換するから文字化けしているのが真相

このPowerShellのおバカ仕様のせいでMINGWのUTF-8対応済みアプリの恩恵をまったく活かせない
864848
垢版 |
2021/12/16(木) 18:10:47.68ID:pA5H+adw
>UTF16-LEの文字列を、SJISとみなして

すごい。文字化けの謎を解明してくれたのか!
865848
垢版 |
2021/12/16(木) 18:13:34.65ID:pA5H+adw
と言うことは、逆変換すればどうかな?

SJIS → UTF16-LE
866848
垢版 |
2021/12/16(木) 18:19:40.99ID:pA5H+adw
それか、あらかじめデータを、SJIS へ変換しておいてから渡すとか

Ruby では、色々な携帯の機種依存の日本語を変換するのに、
最長6パスとか掛かるものもあるらしい
2021/12/16(木) 18:50:41.75ID:qMSlwGZE
[console]::OutputEncoding = [System.Text.Encoding]::Unicode

v5環境だけどこれでファイル出力の文字化けは解消できた
ただ改行コード\nが全部\r\nになる
2021/12/16(木) 18:55:45.31ID:bRV7vQKn
v7だと多分問題はない、よろしくやってくれてるんだと思う
mingwは使ってないから知らんが少なくとも標準パッケマネのwingetで入るやつ(gnuwinポート)でエンコで困った事はない
869デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:06:43.69ID:V72yjyE9
>>867-868
デタラメを書くな
君らは問題を理解できてない
2021/12/16(木) 19:15:07.46ID:bRV7vQKn
とりあえず環境を(ターミナルも)書いてくれないとアドバイスのしようがない
>>856の対処は試した?
871デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:24:43.19ID:V72yjyE9
>>870
以下コマンドをそれぞれコマンドプロンプトとPowerShellで実行して、aaa.txtに何が書き込まれているか確認してくれ
wsl --help > aaa.txt

あと「>>856の対処」とは何を指すのか具体的に示して
872デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:27:32.35ID:V72yjyE9
マイクロソフトが関与するオープンソース・コミュニティーは問題が解決してないのに解決したことにしてしまうずさんな所が多い
バグ票を閉じることを優先する隠蔽体質あると思う
873デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:34:07.64ID:V72yjyE9
共産圏の人間が仕切ってるのかと思うような閉じられ方する、まさにノルマ
2021/12/16(木) 20:11:17.38ID:q0ua6jst
そうだね
875デフォルトの名無しさん
垢版 |
2021/12/16(木) 20:20:13.49ID:Y2CVy/MB
マイクロソフト文化圏。
2021/12/16(木) 21:09:01.98ID:VSm+B60n
>>871
> is not a raw-bytes conduit to a file in PowerShell, unlike in cmd.exe.

Instead, PowerShell always decodes output from external programs (into .NET strings) before further processing (but not when printing directly to the display), based on the character encoding stored in [Console]::OutputEncoding.

Therefore, before your external-program call, you must (at least temporarily) set [Console]::OutputEncoding to match the actual character encoding used in your external program's output; e.g., [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
877デフォルトの名無しさん
垢版 |
2021/12/16(木) 21:15:42.41ID:V72yjyE9
従来型のパイプラインを選べない時点で設計思想がおかしいんですよ
$(xxx) みたいな特殊表現によるパイプが提供されてしかるべき
というかPowerShellのパイプラインを特殊表現に閉じ込めるべき
878デフォルトの名無しさん
垢版 |
2021/12/16(木) 21:56:24.21ID:V72yjyE9
OutputEncodingとコードページがごっちゃになってるのもよくない
OutputEncodingをUTF8に指定したら、cmd /? で英語ヘルプが返されるようになってしまう
この挙動は、コマンドプロンプト上のchcp コマンドでコードページを変えたときのcmd /?の挙動と同じ
2021/12/16(木) 22:23:10.88ID:ywwvfrpp
>>877
そもそも従来型のパイプラインは生バイト晒してたように聞こえるんだが、テキストモード(ascii)IOを忘れてないか

fopen等システムコールに行儀良く"b"フラグ渡してれば問題はないが、そうでない時にcmdはtypeや |を処理する際にコンソールのファント設定見に行く等奇怪な挙動をしてた
でもたまに制御文字をtypeして死んだり…

テキストモードを排除できれば可能かも
2021/12/16(木) 22:31:55.77ID:ywwvfrpp
gnuとかのプログラムは今でもioモード切り替えフラグ付いてたりするね

生バイトが欲しければProcessInfoとかからstdin/stdout引っこ抜いてIO.BinaryWriterに渡すとか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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