利用シーン
- 複数のディレクトリに散らばっているファイルを一箇所にまとめたい
- まとめてファイル名を変更したい(変更したいファイル名が決まっている)
自分が試した環境
- Windows10
- PowerShell 5.1
書いたコード
記事最下部の「コード」から、一部を抜粋
▼再帰的に取得した情報が、ファイルかディレクトリかを判定する
testpath.ps1
$files = Get-ChildItem -Recurse -Name
# 取得した情報を一つ一つ処理する
foreach($file in $files) {
if( Test-Path $file -PathType Leaf ) {
Write-Host($file + 'はファイルです。')
}
}
▼ファイル名に「txt」という文字があるかどうかを判定(拡張子判定のつもり)
splitpath.ps1
# ファイル名だけを抽出する('.\dir\file.txt'みたいなときに'file.txt'を抽出する)
$tailFileName = Split-Path $file -Leaf
if( $tailFileName.Contains('txt') ) {
Write-Host($tailFileName + 'にはtxtという文字が含まれています')
}
▼外部ファイルを一行ずつ読み込む
get-content.ps1
Get-Content '.\nameList.txt' -as[string[]]
コード
meetupAndChangeFIlesAll.ps1
# いろんなところに散らばるファイルを一つのディレクトリに集める
$files = Get-ChildItem -Recurse -Name
foreach($file in $files) {
if( Test-Path $file -PathType Leaf ) {
$tailFileName = Split-Path $file -Leaf
if( $tailFileName.Contains('txt') ) {
Copy-Item $file '.\target_dir'
}
}
}
# 外部ファイルから読み取った文字列(一行に一単語)を使って指定ディレクトリ内のファイル名を変更
$nameList = (Get-Content '.\in.txt') -as[string[]]
$targetDir = Get-ChildItem '.\target_dir'
$concatDir = '.\target_dir\'
$i = 0
foreach($f in $targetDir) {
Write-Host ('新しいファイル名は ' + $nameList[$i])
Write-Host ('現在のファイル名は ' + ${concatDir} + ${f})
Rename-Item ${concatDir}${f} -NewName $nameList[$i]
$i++
}
Get-ChildItem '.\target_dir'