ファイルを移動してからログを更新する関数の実装例を次に示します。
間違いなくもっと簡潔になる可能性がありますが、仕事は完了し、適度に読みやすくなっています。
最初の引数は移動するファイル、2 番目の引数は移動先フォルダーの名前です (空白を含めることはできません)。
基本的には、ファイルを指定したフォルダに移動した後、ログ ファイルの最後の行を取得して、今日の日付が含まれているかどうかを確認します。含まれている場合は、行が空白で分割され、結果の配列が反復処理されてフォルダー名が検出されます。見つかった場合、配列の次の項目 (そのフォルダーへの移動回数) が 1 増加します。見つからない場合は、フォルダー名が行に追加されます。修正された行は、ファイルの最後の行を置き換えます。ログ ファイルの最後の行に今日の日付が含まれていない場合は、ファイルに今日の日付とフォルダ名などの行が追加されます。
@()
囲まれた式が配列を返すようにするために使用されます。これにより、コンテンツを適切な行としてファイルに簡単に追加できます。
function Log-Move() {
$logfile = 'O:\AutoScan\log.txt'
$destination = 'O:\AutoScan\'
$folder = $args[1]
Move-Item -ErrorAction Stop $args[0] ( $destination + $folder )
$content = @( get-content -path $logfile )
$line = $content[-1]
$date = Get-Date -format 'd'
if ( $line ) {
if ( $line.Contains( $date ) ) {
$items = $line.split()
$count = $items.count
for ( $i = 0; $i -lt $count; $i++ ) {
if ( $items[$i] -eq $folder ) {
$items[$i + 1] = 1 + $items[$i + 1]
break
}
}
if ( $i -eq $count ) {
$items += @( $folder, '1' )
}
$line = $items -join ' '
if ( $content.length -gt 1 ) {
$content = @( $content[0..$($content.length-2)] ) + $line
} else {
$content = @( $line )
}
} else {
$content += $date + ' ' + $folder + ' 1'
}
} else {
$content = @( $date + ' ' + $folder + ' 1' )
}
$content | Set-Content -path $logfile
}
使用例
Log-Move $newLongFilename Multiples
# log.txt:
# 22/01/2013 Multiples 1
Log-Move $anotherfile Multiples
Log-Move $anotherfile Autosorting
# 22/01/2013 Multiples 2 Autosorting 1