这是一个移动文件然后更新日志的函数的示例实现。
毫无疑问,它可以更简洁,但它可以完成工作并且具有合理的可读性。
第一个参数是要移动的文件,第二个是目标文件夹的名称(不能包含空格)。
基本上,将文件移动到指定文件夹后,会抓取日志文件的最后一行并检查它是否包含今天的日期。如果是这样,则在空格处拆分该行,并迭代生成的数组以查找文件夹名称。如果找到,则数组的下一项(即对该文件夹的移动次数)加一。如果未找到,则将文件夹名称附加到该行。然后修改后的行替换文件中的最后一行。如果日志文件的最后一行不包含今天的日期,则会在文件中附加一行,其中包含今天的日期和文件夹名称等。
@()
用于确保包含的表达式返回一个数组 - 它可以更轻松地将内容作为正确的行添加到文件中。
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