我已将此修改为下面更简单的解释并删除了我以前的版本
下午好。
我想知道是否有人可以提供建议
我们每天都有带有当前日期的alogfile,例如22012013.txt,23012013.txt等
我的脚本中有一个移动项cmdlet,我想记录每天有多少文件被移动到3个特定文件夹,并将计数器写入上面提到的日期文本日志
假装这是我的文件夹结构
folder1中
文件夹2 folder3
作为一个例子,这是我的移动项目如何工作
我的移动项目将file1.txt移动到folder1
file2到folder3
file3到folder1
file4到folder3
file5到folder2
file6到folder1
在日志文件中,我想看到
项目已移至Folder1 = 3
项目已移至Folder2 = 1
项目已移至Folder3 = 2
就在第二天,那天文件移动将记录在当天的新日志文件中,如果可能的话,我希望每个移动项目的增量都增加
希望这是有道理的
此致
巴里
答案 0 :(得分:0)
以下是移动文件然后更新日志的函数的示例实现 毫无疑问,它可能更简洁,但它完成了工作并且具有合理的可读性。
第一个参数是要移动的文件,第二个参数是目标文件夹的名称(它不能包含空格)。
基本上,在将文件移动到指定文件夹后,会抓取日志文件的最后一行并检查它是否包含今天的日期。如果是,则将行拆分为空格,并迭代生成的数组以查找文件夹名称。如果找到,则数组的下一项(将是对该文件夹所做的移动次数)加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