Windows PowerShell Part5 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
今のwin10はcsc.exeが入ってるのでc#のラッパーでもいいと思う
いまどきnetでもたつかないし 多分C♯より前からあるcsc.exe(chicken scheme compiler)が潰されて困る Windows10環境で使用しています。
膨大なログファイルから「error」を含む一文と、
| ではじまる一文を抜粋したいので、Select-String を使えばよいということまでわかりました。
Get-Content *.log | Select-String " Error "
でなんとか「error」を含む一文を拾うところまではできました。
その先の2点で詰まってます。
[質問1]
| ではじまる一文をor検索する為、
sls " Error ","エラー","^| " (dir -recurse *.log)
とすると、意図していない大量の文章が抽出されてしまいます。
おそらく "^| " 部分が正しくないと思われますが、
「〜という文字で始まる」という指示がどうすればよいのでしょうか。
[質問2]
・そのままSelect-String をすると、「ファイル名:行番号:検索結果」という表示になってしまいます。
・Get-Content *.log だと検索結果だけが表示されます。
以下のようなイメージで、ファイル名とその検索結果一覧をまとめて表示させたいのすが、可能でしょうか。
(そもそも Select-String では難しいのでしょうか)
---------------------------
File001.log
2021/02/01 なんとかかんとかErrorなんとかかんとか
| なんとかかんとか
| なんとかかんとか
---------------------------
File002.log
2021/02/01 なんとかかんとかErrorなんとかかんとか
| なんとかかんとか
--------------------------- 正規表現のエスケープは\
正規表現使わないなら -SimpleMatch 正規表現はこんな感じになるかな
sls "¥berror¥b|エラー|^¥| "
結果の書式についてはファイル名や検索結果を変数に入れてifやforで古典的な処理を書けばどうとでもなる >833さん、834さん
ご返信いただきありがとうございます。
試行錯誤した結果、以下が希望に近くなりそうです。
sls "error|エラー|^\|" (dir -recurse *.log)
書式については、上記の結果に合致するファイル名を変数に入れて・・・
とfor分をまわす感じで、ちと考えてみます。 バッチにすりゃ済む事なのに手を抜いて一行で済まそうとするから嵌まるのではないのかよ? 便乗して Select-String について質問よろしいでしょうか
「特定の文言が記録されているtxtファイル」のフルパス一覧を取得したいンですが
sls "error" (dir -recurse *.log)
とすると「パス、行番号、該当の行」が出力されますよね
ここでパスだけの一覧を出力することは可能でしょうか
もちろんバッチでもOKでございます powershellは、iniファイルの中のデータを変数に入れたりとかはできますか? >>838
powershell iniファイル読み込み
あたりでググれば色々出てくるよ
ちょっと制限あるけど XML に変換しちゃうとかなかなか面白い
http://nmksb.seesaa.net/article/473354419.html >834 さんのアドバイスに従って、自分なりにいろいろ試行錯誤してみました。
おそらくあと一歩で理想形になるのですが、躓いてしまっております。
以下の内容で「PS1」ファイルを作成します。
---------------------------
#検索して"error"に合致するファイル一覧を取得し、合致したファイル名を[$fileList]へ入れる
$fileList = Get-ChildItem -recurse | sls -pattern "error" | group path | select name
#ファイル毎にループ
foreach($fileTmp in $fileList)
{
#ファイル名と"error"を含む検索結果を表示する
write-host $fileTmp.Name,(Get-Content *.* -Encoding UTF8 | sls "Error" $fileTmp)
}
---------------------------
[出力結果]
sls : 入力オブジェクトをコマンドのパラメーターにバインドできません。コマンドがパイプライン入力を受け入れないか、または
入力とそのプロパティが、パイプライン入力を受け入れるいずれのパラメーターにも一致しません。
---------------------------
おそらく
(Get-Content *.* -Encoding UTF8 | sls "Error" $fileTmp)
このあたりの処理に問題があると思われるのですが、どのように記載すればパイプライン入力が受け入れられるのでしょうか。 843さん、844さん、845さんありがとうございました。
パイプで渡すのをやめたら、それなりにいい感じになりました。
ここでアドバイスいただいたことはとてもいい勉強になりました。
精進します。 エスケープシーケンスで困ってます
Select-String hoge.txt -Pattern "$hoge2"
などで$hoge2にエスケープシーケンスがあると当然上手く行きません
毎回、関数を作ってエスケープシーケンスを処理してるのですが
上手くくくるなどもっとスマートな方法は無いでしょうか? >>848
-SimpleMatchオプション付けて文字列にすれば? >>848
ごめん変数なんだね
自分で関数作らなくても
$hoge2 = ([regex]::Escape($hoge2))
で正規表現クラスにエスケープさせちゃえばどうかな? うわお!
こんなのが欲しかったんです
やっぱりこういうスマートなのありますよね
ありがとうです 行を反転させる方法はないですか?
例えば1行目を最後の行に、最後の行を1列目にしたいです
[最大行数..1]
でも出来るのですがもっと綺麗に書けそうなので
よろしくお願いします Powershell ver 5.1で動かすスクリプト内の特定のコマンドレットのみPowershell ver 2.0で動かす事は可能でしょうか?
5.1で動かす部分と2.0で動かす部分で変数の受け渡しも必要です。 新しい側でGet-CommandしてDLL属性見てみれば本体のパスは取れる
互換性あるか不明だけどやってみたら PowerShellから可能なWindows設定の一覧とかどこかにないですかね?
WIndowsのインストール後に行う各種設定を自動化したいです windowsの設定を直接powershellでイジることは不可能だけどレジストリとかをイジることは可能
というかwindows10の設定同期はマイクロソフトアカウントが1番楽で安心だと思う 全部の設定が可能だろ
でないとguiなしのwindowsは設定が出来ない 具体的に何の設定を移行したいのか「全部」書いてほしいけど
物によってはpowershellでいちいちオブジェクト考慮してやるよりレジストリいじる方向のほうが楽だったりするだろうし、適材適所で 唐突にchdir HKML:してファイルシステムみたいにレジストリ探索できるの楽しい
regeditはインポートエクスポートでカルマが溜まるし、専用cmdletもドライランしなきゃ怖いし
普通のファイルみたいにダンプや検索もできるから、インタラクティブに探索するのが良いと思うよ linuxから移行した人としては、winは何でも仮想デバイスなのが進んでるなと思いました
unix系では/devが相当するけど、直下にファイルとしてズラリで階層化されてなくて、仮想ファイルでしかない
階層化しないなら、ファイルである意味ってぶっちゃけ無いよね C:\
20210413
D.mp3
E.mp3
F.mp3
20210227
A.mp3
D.mp3
E.mp3
20210118
A.mp3
B.mp3
C.mp3
20201125
A.mp3
B.mp3
↑こんなフォルダ構成があって、↓こんな風に全ファイルをALLフォルダにコピーしたいのですが
C:\
ALL
A.mp3
B.mp3
C.mp3
D.mp3
E.mp3
F.mp3
どういうコマンドを書けば良いか見当もつきません。アドバイス頂けないでしょうか? ↑すみません、最初の1行は「C:\」じゃなくて「C:\音楽\」でした。 * で検索して全部ALLフォルダにコピーすればいいんじゃないの
エクスプローラで コピーではなくプレイリストの使い方を覚えたほうがいいような気もする Get-ChildItem C:\ -Filter *.mp3 -Recurse | Move-Item -Destination C:\ALL -Confirm 返信遅れてすみません。
>>869さんのコマンドでいけました。(移動でも問題ありません)
みなさんどうもありがとうございました。 import-excelでExcelファイルを読み込んで
配列内の文字列を検索して、見つかったインデックスを取りたいのですが、
うまく検索できません。なぜでしょうか。
ソース
$excel = Import-Excel .\hostname.xlsx
$excel
[Array]::IndexOf($excel,'server3')
結果
host
----
server1
server2
server3
server4
server5
server6
-1
↑2が返ってきてほしいのになぜか-1になるのです。 >>872
[Array]::IndexOf($excel.host,’server3')
または
$excel.host.IndexOf('server3') >>873
ありがとうございます
上手くできました! 今までコマンドプロンプトを使っていましたが、windows power shellに乗り換えました。
コマンドプロンプトでは、エクスプローラーからドラッグ&ドロップでファイルパスが入力できましたが、
windows power shellではできませんでした。
ファイルパスを楽に入力する方法はないんでしょうか? 7.2.2のpwshだけどできたよ
でもCUIでドラッグ&ドロップしようという発想はなかった
ファイラからパスコピーするかファイラからpwsh呼び出してるわ ドラッグアンドドロップはできる
別スレでも同じ質問あったけど管理者として実行しているとダメ
コマンドプロンプトも同じ del /f %appdata%\microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt 可能な限りログというログを消すバッチ
コマンドプロンプト管理者モード実行用だけど
https://pastebin.com/raw/7PYwDkDr Windows Management Framework 4.0が落とせなくなってる powershellって.netオブジェクトを扱うために作られたシェルと知って愕然とした
bashやzshのように(慣れは必要なものの)ほぼCUI操作で完結できるようになるかと思いきや、そういう方向じゃないんだな
Windowsユーザでもマウス使いたく人だっているのにな .netオブジェクトを扱うためってのは誰のどういう立場での発言?
どこぞのYouTuber?
仮に公式見解だとして、CUI操作で完結できるようにというゴールと排他だとする理由は? Exposing the Power of .NET in a Admin-friendly way
https://learn.microsoft.com/en-us/archive/blogs/monad/exposing-the-power-of-net-in-a-admin-friendly-way
> One of our primary goals for Monad was to: "Expose the power of .NET in an Admin-friendly way" 新しいバージョン 7.3.3 をここから
ttps://github.com/PowerShell/PowerShell/releases/tag/v7.3.3
これを
PowerShell-7.3.3-win-x64.msi
インストールしたのですが、
Win+x メニューから管理者として起動しても、古いものが立ち上がるんです
新しいものが起動するようにするにはどうしたらいいのでしょうか >>888
よくわからんけど、Win+Xのアレは「Windows PowerShell(5.1系)」でFixされていて、「PowerShell Core(6.x以降)」への変更は無理なのでは? >>889
どうもありがとうございます
一般メニューのほうから起動することにしました 手っ取り早いのはwinキー, p, w, s, Enter
必要に応じて矢印キーでrun as administratorを選ぶ
Windows11なら「設定」で標準のコンソールを変えることができる
Windows10なら %LOCALAPPDATA%\Microsoft\Windows\WinX の中身を手で書き換える
desktop.ini も隠れてるので書き換え忘れずに
ミスってメニュー壊しても知らんので自己責任で わざわざWin+Xを書き換えなくてもwinキー, p, w, s, Enterが早いしどんなコマンドにも応用が効くのでおすすめ 応用が効くと書いたので蛇足しとく
Win+R でコマンドをフルに打たなくても最近はスタートメニューにフォーカスがあるときコマンドのインクリメンタルサーチができる
古いほうは powershell.exe、新しいほうは pwsh.exe という実行ファイル名なので pws まで打ち込むと候補が絞れる 15年前以上前からできるのに「最近」とは一体... PowerShell でxmlファイルをtxtファイルに
返還することはできますか?
自動化したいんです。 >>898
手動化できているのなら、変換元と変換結果をどこかにあげて例示しよう では読み込んで、クリップボードにコピー
する事はできますか? はい、できます。$cp::SetText(変数)
最初にSystem.Windows.Formsを読み込んでね scoop入れてみたけどすごくいいな。使ってる人いない?
てかロクにpowershellのコマンドを知らないものだから irm get.scoop.sh | iex でなんでインストールできるのが不思議だった
賢いなこれw Get-Contentみたいにテキストファイルを一行毎に配列にしてくれるのを
ファイルじゃなくて標準入力からテキストデータを受け取って配列にする方法はありますか? セットしたい配列変数が $ary の場合
ヒア文字列で
@"
aaa
bbb
ccc
"@ -split "`n" | tee -Variable ary
とすれば $ary に配列がセットされるけど
画面表示がいらないなら | 以降を
| % {$ary=@()}{$ary+=$_}
としてください
ヒア文字列ではなくてクリップボードの内容を受け取りたい場合は
(Get-Clipboard) | % {$ary=@()}{$ary+=$_.ToString().Trim()}
の様にすれば行毎の文字列の先頭・末尾の空白を消して配列に取り込むことが出来るでしょう >>898
txtファイルに変換の意味が改行マークの挿入+字下げで良いのなら
xmlファイルの文字コードがUTF8であれば
$f = "$Env:LOCALAPPDATA\Programs\app_foo\config.xml"
$x = New-Object xml; $x.Load($f); $x.Save($f); Remove-Variable x,f
$f のところは xml ファイルのフルパスを入れて下さい
運用する場合
アプリのフルパスが "$Env:LOCALAPPDATA\Programs\app_foo\bar.exe"
テキストエディタが "C:\Program Files\Notepad++\notepad++.exe" であるなら
C:\tools\edit_xml.ps1 の内容
Set-Alias bar "$Env:LOCALAPPDATA\Programs\app_foo\bar.exe"
Set-Alias editor "C:\Program Files\Notepad++\notepad++.exe"
$f = "$Env:LOCALAPPDATA\Programs\app_foo\config.xml"
ps bar -ea SilentlyContinue | % {$_.CloseMainWindow();$_.WaitForExit()}
$x = New-Object xml; $x.Load($f); $x.Save($f); Remove-Variable x
write "編集が終わったらリターンを押してください"
editor $f
pause
Remove-Variable f
start bar
実行する際は & C:\tools\edit_xml.ps1 で
[x] 押したらトレイに遷移するアプリは手動で終了させる or kill に書き換える必要があるでしょう >>905
ありがとうございます。
あんたは神ですか?! n番目の履歴の実行をInvoke-Historyではなくbashみたいに「!n」ってやる方法ありませんか? なお、腐れChatGPTの回答はなしでお願いします
聞いたら↓でできるとかデタラメ回答よこしてきたし
function global:history-command { Invoke-History $args[0] }; Set-Alias -Name ! -Value history-command -Option AllScope PowerShellでは!ではなくrを使う
あとrと番号の間に空白文字をれる
r 3
みたいな感じ
>>910の場合は!の前に&を付ける必要がある
PowerShellの!は論理否定演算子だからな
&! 3 文句ばっかし言っていないで、さっさと変数の中身くらいはデバッグで間違いに気付くようになれ >>911
ありがとうございます
遅レスですいません カレントフォルダにあるファイルをタブ補完したら頭に.\がつくのがうざい
つかないようにできん? ここのコード試したらできたわ
ttps://superuser.com/questions/1741125/prevent-powershell-autocomplete-from-adding-dot-prefix
中身はさっぱりわからんけどw powershellではカレントディレクトリにある.exeや.ps1を実行するときには先頭に .¥ を付ける必要がある
だから補完時に .¥ を付けることだけを抑制するのはちぐはぐな対応で普通はデメリットが大きい
.¥ が必要になったのはセキュリティを考慮した仕様で、ネット等から入手したzip等の中にnotepad.exe等の既知のアプリと同名のマルウェアを仕込んで騙して実行させるようなトラップの類のリスクを低減するもの >>917
.\notepad.exeを起動させるんですね
それって安全なの? notepad.exeでカレントディレクトにあるやつが実行されるよりは
ファイル名だけで.¥まで補完すなってのはある
bashなんかは./からタイプしないと補完しないよな >>920
自ら補完して気づかず起動したらそれまで
この仕様変更によって守られるケースもあるし守れないケースもある
何事にも完璧はないし100じゃないから0じゃないか意味ないと腐すのは愚か者の考え方
セキュリティと利便性はいつだってトレードオフ >>922
>セキュリティと利便性はいつだってトレードオフ
馬鹿言ってんじゃない。cmdとの互換性なんて要らないのにいまだにカレントディレクトリが探索パスの先頭にあるのが頭おかしいだけ ん、ちょっと変な書き方になった
要はコマンドライン先頭のコマンド名の箇所の補完でカレントディレクトリのファイルが一番最初にしかも丁寧に.\付きで出てくる仕様自体が
.\を付けないと実行できないようにされてる意味すら無くしてるわけで、毎回ユーザーに目視確認させるんじゃないよって話だ oh my poshって今知ったけどかなりイケてるなこれ
powershell専用と思いきや色んなOS、シェルに対応してる
Windows Terminalでpowershell7とwsl2を両方使う人はこれ使うとプロンプトラインに統一感出ていい感じよ
逆に統一感ありすぎてどっちがどっちか区別つかないかもしれんけど function hoge { echo "fuga" }
Set-PSReadLineKeyHandler -Chord Ctrl+u -Function hoge
としたらエラーになった
キーバインドでユーザ定義関数は指定できないの? 何年目かでいうなら今年3年
アイスタイルふざけんなよ上げろや死ね レス数が900を超えています。1000を超えると表示できなくなるよ。