我的操作系统是Windows 10。
我有一个包含一到多个 .txt 文件的文件夹。每个文件中的行格式如下:
2016-12-07 14:08:43 7.7 b=123 r=890
我希望创建一个可执行的可重复过程,它将查看文件夹中的所有文件,并在 .txt 文件中为我提供包含6.7
日期超过七天的所有文件的文件名。
示例场景:
File1 包含:2016-12-07 14:08:43 7.7 b=123 r=890
File2 包含:2017-01-24 14:08:43 7.7 b=123 r=890
File3 包含:2017-01-23 14:08:43 6.7 b=123 r=890
我执行该过程并收到一个包含以下内容的 .txt 文件:File3
我不知道是否可以使用命令行、PowerShell 来完成这项任务,或者是否需要全力开发才能完成这项任务。
答案1
遵循 PowerShell 脚本
Get-ChildItem *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7') {
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {
$aux.FullName
}
}
}
}
或等效的一行代码
Get-ChildItem *.txt -Recurse | ForEach-Object { $aux=$_; Get-Content "$aux" | ForEach-Object {if ($_ -match '6\.7') {if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7)) {$aux.FullName}}}}
基本解释:
txt
获取文件列表Get-ChildItem
并将|
结果传送到下一个 cmdlet- (管道)对于每个特定文件
ForEach-Object
- 将其保存到辅助变量
$aux=$_
(注意;
一行中的尾随分号) - 并逐行获取其内容
Get-Content
并将|
结果通过管道传输到下一个 cmdlet - (管道)对于每一行
ForEach-Object
- 测试某一行是否包含
6.7
字符串if ($_ -match '6\.7')
- 如果是,则测试日期(前 19 个字符)是否符合给定条件
if ( [datetime] …
- 如果是则公开文件名
$aux.FullName
{
并使用一系列的收尾s来关闭所有的开尾s}
。
答案2
扩展 JosefZ 的原始答案,我发现以下答案更完整。
在 PowerShell 文件中包括以下内容:
$filespath = "\\sampledirectory\log\"
$outputfilename = "\\sampledirectory\log\results.txt"
########## file creation step
Get-ChildItem -Path $filespath *.txt -Recurse |
ForEach-Object {
$aux=$_
Get-Content "$aux" |
ForEach-Object {
if ($_ -match '6\.7')
{
if ( [datetime] $_.Substring(0,19) -gt (Get-Date).AddDays(-7))
{
$aux.FullName | Out-File $outputfilename -append
}
}
}
}