★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")