Skip to content

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: 結果をパスだけで返す。(ほぼ必須)

  • Get-ChildItem

使用例#

  • パイプで渡す例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#

日付を取得する(フォーマット済み)#

$Date = Get-Date -UFormat "%Y%m%d-%H%M%S"

ファイルのサイズを取得する#

Get-FoldersWithSize.ps1
param ($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-Help Get-ChildItem -Online

  • フルパスで取得(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

拡張子を一括変換#

  • 構文:

    Get-ChildItem -Name | Rename-Item -NewName { $_ -replace "\.現在の拡張子$", ".新拡張子" }
    

  • 現在のディレクトリからファイル一覧を取得し、.svg.j2 を変換する例:

    ls *.svg -recurse | rename-item -newname {$_.name -replace '\.svg$','.j2'}
    

ファイル名を一括変換#

ls | Rename-Item -NewName { $_.Name -replace "置換対象文字列","置換後文"}

ファイル内の特定の文字列を抽出#

$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 でファイルの文字コード取得はこちらを参照

Start-Process#