如何检查目录中是否存在具有相同名称但具有不同扩展名的文件Powershell
how to check if file with same name but with different extension exists in a directory Powershell
我想在这里找到两件事。我在一个文件夹中有数千个文件。让我们以一个文件为例,我们可以对所有文件应用相同的逻辑
- 如果存在同名不同扩展名的文件。
- 如果存在,我需要比较lastwritetime或者timestamp来找出哪个文件更新。
例如,如果我有一个文件culture.txt
,我应该有一个相应的文件culture.log
。
如果我有 culture.txt
但缺少 culture.log
文件,那么这是一个问题,所以我想输出所有缺少相应 .log 文件的 .txt 文件的名称。
如果culture.txt
和culture.log
都可用,那么我想检查culture.txt
是否在culture.log
之后生成。如果 culture.txt
是在 culture.log
之前生成的,那就有问题了,我需要输出这样的 .txt 文件的名称,这个问题是 "Culture.txt was generated before culture.log- Please rerun the program".
如能提供帮助,我们将不胜感激。谢谢。
如果我能得到更多关于同一个问题的帮助。 Esperento 建议的代码完全可以正常工作,但要求已更新。在一个文件夹中,我有多个具有多个扩展名的文件,不仅限于 .txt 和 .log。我可以在同一个文件夹中包含 .doc、.docx、.xls 和许多其他文件。
现在关于更新的要求。我必须查找仅具有 3 个特定扩展名的文件名。其中之一是程序文件。显然应该首先生成哪个。假设 Culture.prog。然后当我 运行 和 Culture.Prog 两个文件将分别生成 culture.log 和 culture.txt 。
很明显,prog 上的时间戳比 log 上的时间戳早,而 log 上的时间戳比最后生成的 txt 早。
我们必须检查 2 个相应文件(log 和 prog)的可用性,仅参考最后生成的 .txt 文件。
因此,首先要检查的是 .txt 文件是否有 2 个对应的文件。接下来检查时间戳是否依次对应这 3 个文件。只有当其中一个条件不满足时我们才输出,否则如果我们不输出任何东西也可以。例如,如果对于 culture.txt,如果缺少 .log 或 .prog 文件,我们必须输出缺少哪个或两个文件的事实。如果 txt 文件的时间戳早于 log and/or prog,我们必须输出该事实。我希望我的要求清楚。谢谢
试试这个:
#list file and group by name without extension
Get-ChildItem "C:\temp\test" -file -filter "*.*" | group Basename |
%{
$group= $_.group
# if not same name, missing message
if ($_.Count -eq 1)
{
"'{0}' are missing" -f $group.Name
}
#else search into current group file with great creation time and print message
else
{
$group | % {$file=$_; $group | %{if ($_.CreationTime -gt $file.CreationTime) {"'{0}' has beeen generated before '{1} " -f $file.Name, $_.Name} } }
}
} | out-file "C:\temp\test\result.txt"
我想在这里找到两件事。我在一个文件夹中有数千个文件。让我们以一个文件为例,我们可以对所有文件应用相同的逻辑
- 如果存在同名不同扩展名的文件。
- 如果存在,我需要比较lastwritetime或者timestamp来找出哪个文件更新。
例如,如果我有一个文件culture.txt
,我应该有一个相应的文件culture.log
。
如果我有 culture.txt
但缺少 culture.log
文件,那么这是一个问题,所以我想输出所有缺少相应 .log 文件的 .txt 文件的名称。
如果culture.txt
和culture.log
都可用,那么我想检查culture.txt
是否在culture.log
之后生成。如果 culture.txt
是在 culture.log
之前生成的,那就有问题了,我需要输出这样的 .txt 文件的名称,这个问题是 "Culture.txt was generated before culture.log- Please rerun the program".
如能提供帮助,我们将不胜感激。谢谢。
如果我能得到更多关于同一个问题的帮助。 Esperento 建议的代码完全可以正常工作,但要求已更新。在一个文件夹中,我有多个具有多个扩展名的文件,不仅限于 .txt 和 .log。我可以在同一个文件夹中包含 .doc、.docx、.xls 和许多其他文件。 现在关于更新的要求。我必须查找仅具有 3 个特定扩展名的文件名。其中之一是程序文件。显然应该首先生成哪个。假设 Culture.prog。然后当我 运行 和 Culture.Prog 两个文件将分别生成 culture.log 和 culture.txt 。 很明显,prog 上的时间戳比 log 上的时间戳早,而 log 上的时间戳比最后生成的 txt 早。 我们必须检查 2 个相应文件(log 和 prog)的可用性,仅参考最后生成的 .txt 文件。 因此,首先要检查的是 .txt 文件是否有 2 个对应的文件。接下来检查时间戳是否依次对应这 3 个文件。只有当其中一个条件不满足时我们才输出,否则如果我们不输出任何东西也可以。例如,如果对于 culture.txt,如果缺少 .log 或 .prog 文件,我们必须输出缺少哪个或两个文件的事实。如果 txt 文件的时间戳早于 log and/or prog,我们必须输出该事实。我希望我的要求清楚。谢谢
试试这个:
#list file and group by name without extension
Get-ChildItem "C:\temp\test" -file -filter "*.*" | group Basename |
%{
$group= $_.group
# if not same name, missing message
if ($_.Count -eq 1)
{
"'{0}' are missing" -f $group.Name
}
#else search into current group file with great creation time and print message
else
{
$group | % {$file=$_; $group | %{if ($_.CreationTime -gt $file.CreationTime) {"'{0}' has beeen generated before '{1} " -f $file.Name, $_.Name} } }
}
} | out-file "C:\temp\test\result.txt"