Powershell 便利技#
頻出コマンドとエイリアス#
コマンド | エイリアス | 説明 |
---|---|---|
Get-Help | man / help | コマンドの説明を取得する |
Get-Content | cat | ファイルの内容をコンソール出力 |
Get-Alias | gal | エイリアス一覧を取得する |
Invoke-Item | ii | ファイルやフォルダを開く |
Copy-Item | cp | コピーする |
Rename-Item | rni | 名前を変更する |
Remove-Item | rd | 削除する |
Move-Item | mi | 移動する |
Get-ChildItem | ls / dir | アイテムを取得する |
Out-String | oss | console 出力 |
Select-String | sls | 文字列を検索する |
Info
再帰的に実行する場合は -Recurse
オプションを付けます。
検索 - Select-String#
- エイリアス:
sls
- 構文:
Select-String [ファイルパス] -Pattern [検索したいテキスト] [option]
- 指定したテキストを含まないファイルを検索する:
-NotMatch
- 大文字と小文字を区別して検索する:
-CaseSensitive
表示結果を絞る#
- テキスト内の文字は selsect-string にて 絞り込めるが、ls (Get-ChildItem)の結果は配列のため、使用できない。
- 代わりに where (Where-Object)を使用。
- 例:
ls | where Name -match test
find 的な#
dir -r -Filter "*.md" -Name
-r
: 再帰的-Filter
:名前でフィルタ-File
:ファイルのみ-Directory
: ディレクトリのみ-
-Name
: 結果をパスだけで返す。(ほぼ必須)
使用例#
- パイプで渡す例1:
Get-Command | Select-String get
- パイプで渡す例2:
cat .\config.txt | Select-String snmp
- パイプで渡す例3:
cat .\config.txt | sls snmp >> result.txt
Info
コマンドの結果内から文字列を検索する場合は以下のように記述
* Get-ChildItem | Out-String -Stream | Select-String 2021* エイリアスで記述する場合は以下の通り
ls | oss | sls 2021`
ファイル出力 - Out-File#
ハッシュ値確認 - Get-Filehash#
- 参照:Get-Filehash
- 構文:
Get-FileHash [-Path] <String[]> [[-Algorithm] <String>] [<CommonParameters>]
- Parameters
- SHA1
- SHA256
- SHA384
- SHA512
- MD5
- ファイルのmd5値を調べる例:
Get-FileHash -Algorithm md5 .\IOSv_startup_config.img
Tip
default Algorithm : SHA256
ディレクトリ表示 - tree#
パス、またはドライブ内のディスクのディレクトリ構造をグラフィカルに表示します。 このコマンドによって表示される構造は、 コマンド プロンプトで指定するパラメーターによって異なります。 ドライブまたはパスを指定しない場合、このコマンドは、 現在のドライブの現在のディレクトリから始まるツリー構造を表示します。
Microsoft Docs - tree
- ディレクトリとファイル名をツリー構造で表示:
tree /f
ディレクトリの作成#
New-Item ./abc -Type Directory
Info
- 中間ディレクトリが存在しない場合は作成される
- 既に存在する場合はエラーになる。
New-Item ./abc -Type Directory -Force
のように強制上書きで回避可能- ちなみに New-Item は ni で省略可能
Script & CommandLine#
日付を取得する(フォーマット済み)#
ファイルのサイズを取得する#
Get-FoldersWithSize.ps1param ($Path = ".") $PrettySizeColumn = @{name="Size";expression={ $size = $_.Size if ( $size -lt 1KB ) { $sizeOutput = "$("{0:N2}" -f $size) B" } ElseIf ( $size -lt 1MB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1KB)) KB" } ElseIf ( $size -lt 1GB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1MB)) MB" } ElseIf ( $size -lt 1TB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1GB)) GB" } ElseIf ( $size -lt 1PB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1TB)) TB" } ElseIf ( $size -ge 1PB ) { $sizeOutput = "$("{0:N2}" -f ($size / 1PB)) PB" } $sizeOutput }} Get-ChildItem -Path $Path | Where-Object {$_.PSIsContainer} | ForEach-Object { $size = ( Get-ChildItem -Path $_.FullName -Recurse -Force | where {!$_.PSIsContainer} | Measure-Object -Sum Length).Sum $obj = new-object -TypeName psobject -Property @{ Path = $_.Name Time = $_.LastWriteTime Size = $size } $obj } | Sort-Object -Property Size -Descending | Select-Object Path, Time, $PrettySizeColumn
ファイルパスの取得#
-
フルパスで取得(Get-ChildItem)
dir -r | ForEach-Object {$_.FullName}
- または:
dir -r | select fullname
- 相対パスで取得
dir -r | Resolve-Path -Relative
Info
- ファイルへ出力はパイプでOut-File へ渡す
| Out-File .\index.txt
- 特定の文字列のみ含むようにするには select-string
| sls .md
拡張子を一括変換#
-
構文:
-
現在のディレクトリからファイル一覧を取得し、
.svg
を.j2
を変換する例:
ファイル名を一括変換#
ファイル内の特定の文字列を抽出#
$target = @(
"error",
"warning",
"info"
)
$date = get-date -UFormat %m%d-%H%M
$logfile = "*.log"
foreach ($dat in $target) {
sls $dat $logfile -Encoding default >> log_$date.txt
}
文字コード一括変換#
chrConvert.ps1
# param は使用に応じて編集
param(
[String]$in = "C:\tmp\before", # 変換前のファイルを格納したディレクトリ
[String]$out = "C:\tmp\after", # 変換後のファイルを格納したディレクトリ
[String]$from = "UTF-8", # 変換前の文字コード
[String]$to = "Shift-JIS" # 変換後の文字コード
)
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
Get-ChildItem $in -recurse |
ForEach-Object {
if($_.GetType().Name -eq "FileInfo"){
$reader = New-Object IO.StreamReader($_.FullName, $enc_f)
$path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
$folder = Split-Path $path -parent
if(!(Test-Path $folder)){
[Void][IO.Directory]::CreateDirectory($folder)
}
$writer = New-Object IO.StreamWriter($path, $false, $enc_t)
while(!$reader.EndOfStream){$writer.WriteLine($reader.ReadLine())}
$reader.Close()
$writer.Close()
}
}
Info
Powershell でファイルの文字コード取得はこちらを参照