PowerShell_ファイル入出力

ファイル(ディレクトリ)パス確認

ファイル(ディレクトリ)の存在確認

  • ファイルが存在するかどうか確認する
    PS> Test-Path -Path C:\test.txt -PathType Leaf
    True
  • ディレクトリが存在するかどうか確認する
    PS> Test-Path -Path C:\test.txt -PathType Container
    True

ファイル(ディレクトリ)パスが絶対(相対)パスかどうか確認

PS> Split-Path -Path C:\test.txt -IsAbsolute
True    <- True:絶対パス、False:相対パス

ファイル(ディレクトリ)パスの最下層を取り出す

PS> Split-Path -Path C:\test1\test2\test.txt -Leaf
test.txt

PS> Split-Path -Path C:\test1\test2 -Leaf
test2

ファイル(ディレクトリ)パスの親階層を取り出す

PS> Split-Path -Path C:\test1\test2\test.txt -Parent
C:\test1\test2

PS> Split-Path -Path C:\test1\test2 -Parent
C:\test1

ファイル(ディレクトリ)パスの親階層を相対パスから絶対パスに変換する

PS> Split-Path -Path .\test1\test2\test.txt -Parent
.\test1\test2     <- -Parentの場合は相対パスのまま

PS> Split-Path -Path .\test1\test2\test.txt -Resolve
C:\test1\test2    <- -Resolveの場合は絶対パスに変換する

ワイルドカードで指定されたパスを解釈する

PS> Split-Path -Path C:\test1\*.txt -Leaf
*.txt

PS> Split-Path -Path C:\test1\*.txt -Leaf -Resolve
test.txt
test2.txt

ファイル(ディレクトリ)一覧取得

隠しファイルも表示(ls -la)

PS> Get-ChildItem -Force

ファイル(ディレクトリ)のみ表示

PS> Get-ChildItem | Where-Object {$_.PSIsContainer}                    <- ディレクトリのみ
PS> Get-ChildItem | Where-Object {$_.Mode -match "d"}                  <- ディレクトリのみ
PS> Get-ChildItem | Where-Object {$_ -is [System.IO.DirectoryInfo]}    <- ディレクトリのみ
PS> Get-ChildItem | Where-Object {-not $_.PSIsContainer}               <- ファイルのみ
PS> Get-ChildItem | Where-Object {$_.Mode -notmatch "d"}               <- ファイルのみ
PS> Get-ChildItem | Where-Object {$_ -is [System.IO.FileInfo]}         <- ファイルのみ

最終更新時刻(降順)に表示(ls -lt)

PS> Get-ChildItem | Sort-Object -Property LastWriteTime -Descending

ファイルサイズ(降順)に表示(ls -lSr)

PS> Get-ChildItem | Sort-Object -Property Length -Descending

最終更新日が1年以上前のものを表示

PS> Get-ChildItem | Where-Object {$_.LastWriteTime -lt (Get-Date).AddYear(-1)}

拡張子が".txt"のファイルのみ表示

PS> Get-ChildItem | Where-Object {$_.Extension.ToLower() -eq ".txt"}

一意の拡張子を表示

PS> Get-ChildItem | Group-Object -Property Extension | Select-Object -Property Name

1つしかない拡張子のファイルを表示

PS> Get-ChildItem | Group-Object -Property Extension | Where-Object {$_.Count -eq 1} | Select-Object -Property Name

ファイル(ディレクトリ)名に"abc"が含まれているもののみ表示(ls -l *abc*)

PS> Get-ChildItem | Where-Object {$_.Name -match "abc"}

特定の文字列を含むファイル名を表示

PS> Get-ChildItem | ForEach-Object ($_) {if (Select-String -Path $_.FullName -Pattern "abc") {Write-Host $_.FullName}}

読み取り専用ファイル(ディレクトリ)のみ表示

PS> Get-ChildItem | Where-Object {$_.Attributes -band [System.IO.FileAttributes]::ReadOnly}
PS> Get-ChildItem | Where-Object {$_.Attributes -match "ReadOnly"}

ジャンクション(リパースポイント)のみ表示

PS> Get-ChildItem -Force | Where-Object {$_.Attributes -match "ReparsePoint"}

ファイル読み取り

通常の読み取り(type, cat)

PS> Get-Content -Path C:\test.txt

ファイルの3行目から5行目まで読み取り

PS> (Get-Content -Path C:\test.txt)[2..4]

ファイルの5行目以降最後まで読み取り

PS> (Get-Content -Path C:\test.txt)[4..(Get-Content -Path C:\test.txt).Length]

ファイルの最初の3行を読み取り(head)

PS> (Get-Content -Path C:\test.txt)[0..2]

ファイルの最後の3行を読み取り(tail)

PS> (Get-Content -Path C:\test.txt)[-3..-1]

ファイルを逆順に読み取り(tac)

PS> (Get-Content -Path C:\test.txt)[(Get-Content -Path C:\test.txt).Length..0]

改行を除いて、1つの文字列として読み取り

PS> (Get-Content -Path C:\test.txt) -join "`r`n"

空白行を除いて読み取り

PS> Get-Content -Path C:\test.txt | Where-Object {$_.trim()}

行の前後の空白を除いて読み取り

PS> Get-Content -Path C:\test.txt | ForEach-Object {$_.trim()}

特定の文字列が含まれる行のみ読み取り(find, grep)

PS> Select-String -Pattern "abc" -Path C:\test.txt

特定の日本語文字列が含まれる行のみ読み取り

PS> Select-String -Pattern "日本語" -Path C:\test.txt -Encoding UTF-8  <- Default(システム既定のエンコード:日本語Windowsの場合Shift-JIS)なども可

マッチする行を周辺行とともに読み取り(grep -C)

  • "abc"にマッチする行とその前後2行を読み取り
    PS> Select-String -Pattern "abc" -Path C:\test.txt -Context 2

CSV(カンマ区切りテキスト)の読み取り

PS> Import-Csv -Path C:\test.csv
PS> Get-Content -Path C:\test.csv | ConvertFrom-CSV    <- 文字化け防止

TSV(タブ区切りテキスト)の読み取り

PS> Import-Csv -Path C:\test.tsv -Delimiter "`t"
PS> Get-Content -Path C:\test.tsv | ConvertFrom-CSV -Delimiter "`t"    <- 文字化け防止

ファイル書き込み

上書きで書き込み

PS> Get-Process | Out-File -FilePath C:\test.txt

追記で書き込み

PS> Get-Process | Out-File -FilePath C:\test.txt -Append

読み取り専用ファイルへの書き込み

PS> Get-Process | Out-File -FilePath C:\test.txt -Force

ファイルが存在した場合は、書き込まない

PS> Get-Process | Out-File -FilePath C:\test.txt -NoClobber

UTF8形式のエンコーディングで書き込み

PS> Get-Process | Out-File -FilePath C:\test.txt -Encoding UTF8    <- 既定はUnicode

ファイル(ディレクトリ)操作

コピー

PS> Copy-Item -Path "C:\a.txt" -Destination "C:\Work"
  • ディレクトリ全部(cp -r)
    PS> Copy-Item -Path "C:\TestDirectory" -Destination "C:\Work" -Recurse
  • コピー前確認(cp -i)
    PS> Copy-Item -Path "C:\a.txt" -Destination "C:\Work" -Confirm
  • カレントディレクトリにコピー(cp test.txt .)
    PS> Copy-Item -Path "C:\test.txt"
  • "*jpg"以外をコピー
    PS> Copy-Item -Exclude "*.jpg" -Path "C:\" -Destination "C:\Work"

移動

PS> Move-Item

リネーム

PS> Rename-Item

削除

  • C:ドライブ内の全てのJPGファイルを削除
    PS> Get-ChildItem -Path C:\ -Include "*.jpg" -Recurse | ForEach-Object ($_) {Remove-Item $_.FullName}

ファイル属性

属性変更

  • 読み取り専用属性設定(他の属性は削除)
    PS> Set-ItemProperty -Path test.txt Attributes ReadOnly
  • 読み取り専用属性設定(他の属性に追加)
    PS> Set-ItemProperty -Path test.txt -Name IsReadOnly -Value $True    <- $Falseで無効化

所有者表示

PS> (Get-Acl -Path "C:\test.txt").Owner

所有者設定

PS> $A = New-Object System.Security.Principal.NTAccount("domainname", "username")
PS> Set-Acl -AclObject (Get-Acl -Path "C:\test.txt").SetOwner($A) -Path C:\test.txt

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-21 (水) 14:12:00 (2464d)