2018年12月22日土曜日

Powershellメモ

こちらの説明がとてもわかり易かったです。
http://suyamasoft.blue.coocan.jp/PowerShell/Tutorial/index.html

この解説が初心者に優しいです。
http://www.atmarkit.co.jp/ait/articles/0708/30/news137_4.html



★Powershell上では、大文字小文字は気にしなくて良い
全く気にしなくてよいようです

★コマンドはパイプ | でつなぐ

★コマンドを確認する
Get-Command

★lsはgci get-childitem

★コマンドのエイリアス(短縮形)がたくさんある
get-childitem は gci でもよいし、lsでもよい

エイリアスを上手に混ぜて打つことが大事
-Exclude --> -ex とか。Tabを打つと候補がでるので関係ないかもしれませんが。

■power shell からカレントディレクトリを開く invoke-items --> ii でできます。
ii .

■PowerShellではcondaのvenvが使えない
condaは使えますが、condaからvenvが使えませんでした。バグだそうです
これはけっこう面倒ですが、なんともできませんでした。

★CHT20* を含む(-include)ファイル探す。再帰的に(-recurse)。
get-childitem  -include "CTH20*" -recurse

*はワイルドカードです。-recurseは-recでも可能です。

■ディレクトリにあるサブディレクトリだけを探す。回帰的-recurce、*でワイルドカード
Get-ChildItem -Recurse * | ? { $_.PSIsContainer }

■Powershellの画面で範囲指定を左マウスドラッグでできるが、矩形になってしまうのが困っています。行の最後までドラッグしてほしいのですが。。→PowershellISEを使えば解決しました。

★エラーがあっても無視して続ける
gci -ErrorAction "SilentlyContinue"


■Length(ファイルサイズ)が10kb以下(-le)のものを出力

Get-ChildItem | Where-Object{$_.Length -le 10kB}

Where-Object{} 条件にあったものだけ出力
$_. whereへ渡す値
Length -le 10kB

■結果をソートするにはパイプで、

| Sort-Object Length

とか。 [-Property] Length とかなので、-Propertyは省略可能

■Powershellバージョンを知りたいとき
$PSVersionTable

■ディレクトリだけを再帰的に見つけたい
dir -Recurse | ?{$_.PSIsContainer}

ファイルにピリオドが入っているならば
dir -ex *.*
(dir -Exclude *.* )
でできる。

■ディレクトリを再帰的に探して、フルネームを出す
Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

Select-Object FullName で対象の中でFullNameだけ抽出する

■CSVで保存する

gci . *.* -rec | where { ! $_.PSIsContainer } | where-object {$_.Length -gt 100kb}| Export-Csv -Path "data.csv"

get-child-item -recursive | ファイルだけ(! で否定。ディレクトリでないもの) | ファイルサイズが100kbより大きいものだけ | data.csvというパスでエクスポートする 

エンコーディングを指定するとき
Export-Csv -Encoding utf8 "data.csv"


★オブジェクトを名前でmatchして、CSV出力
gci -rec |? {$_.Name -match "\d\."} | Select-Object -Property Name, Length, Directory | Export-Csv -Encoding utf8 C:\Users\...data4.csv

★名前をワイルドカードで選択。r or v + 数字0文字以上+.
? {$_.Name -match "[rv]\d*\."}


gci . -rec | ? {$_.Name -match "[rv]\d+\."}| Select-Object -Property Name , Length, Directory | Export-Csv -Encoding utf8 C:\....\data5.csv

分割すると

gci . -rec
今のディレクトリ(.)で、再帰的(-rec)に中身を見る(get-childitem )

| ? {$_.Name -match "[rv]\d+\."}

出てきたファイルの名前($_.Name) について、 rまたはv+1文字以上の数字+ピリオドにマッチするか調べる。

| Select-Object -Property Name , Length, Directory
| Export-Csv -Encoding utf8 C:\....\data5.csv

■ディレクトリ中のファイルサイズの合計
(Get-ChildItem -Recurse -Force | Measure-Object -Sum Length).Sum

gci -rec -ErrorAction "SilentlyContinue"| ?{ $_.PSIsContainer } | ? {$_.Name -match ".*old.*"} |Select-Object -Property Name, FullName, LastWriteTime |Export-Csv -Encoding utf8 C:\...\old_name.csv


★検索結果をオブジェクトにして嵌った

$items = ( gci -rec| ?{ $_.PSIsContainer } | ? {$_.Name -match "^(?!.*folder)"}|? {$_.Name -match ".*old.*"}) |Select-Object

とかにするとき、その結果を
foreach ($i in $items)
{
$i.Substring()

とかやろうとすると全然動かなくなった。

[System.IO.DirectoryInfo] に 'substring' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
Fullnameとかも同様

・・・Select-Object をやめて、$i.Fullname とするとOKだった。()なしです。

★文字列に日本語を入れると文字化けしてエラーになる件

test.ps1

$a = 'テストです'

とかにすると、powershell上ではps1 が文字化けして動作しなくなる。
utf8のBOM付きにできていないからのようです。PowerShellIDEを使うと、自動でBOM付きになるらしく?使えた。

★時刻を表示する

Get-Date
(Get-Date).ToString("yyyy/MM/dd HH:mm:ss")


★Powershellのディレクトリの中で、5MB以上のファイルを抽出して、Name, Length, Directory, LastWriteTimeをcsvに出力

'start: ' + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")

gci . -rec -ErrorAction "SilentlyContinue"|`
where-object {$_.Length -gt 5000kb}|`
Select-Object -Property Name , Length, Directory, LastWritetime |`
Export-Csv -Encoding utf8 C:\....\filename.csv

'end: ' + (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") 

0 件のコメント:

コメントを投稿