比较文件名和文件修改日期的语句

statement to compare file name to file modified date

我一直在尝试编写 PowerShell 脚本以将目录中的文件重命名为文件的“.LastWriteTime”属性。

我原本想提取 EXIF "Date Taken" 日期并使用它,但我只是想先获取其余的自动化过程。此外,并非所有图片都有 EXIF 数据,因此使用 .LastWriteTime 是下一个最好的选择。

$pictures = Get-ChildItem -path $picsdir\* -Include "*.jpg" | Sort {$_.LastWriteTime}
foreach ($picture in $pictures)
{
    $newfile = $picture.LastWriteTime | Get-Date -Format "yyyyMMdd-hhmmss"

    If ($picture.FullName -eq! "$picture.DirectoryName$newfile.jpg" -And! (Test-Path -Path "$newfile.jpg"))
    {
        Rename-Item $picture.FullName -NewName $newfile$format
    }
}

问题是我认为我似乎无法在 If 语句中正确比较现有文件和当前文件之间的差异。我这样做是为了进一步为具有相同日期的图像创建逻辑。

我想,我被卡住了,我正在尝试使用当前文件的 $picture.DirectoryName 构建新文件的路径。

希望有人能提供帮助。

PowerShell 中的 "not equals" 运算符是 -ne(不是 -eq!)。

不需要比较FullName属性,可以用BaseName属性代替(不带扩展名的文件名):

if($picture.BaseName -ne $newfile)
{ 
    #Picture does not follow datetime naming
}

if 语句的另一半也会失败,因为它将在当前目录而不是图片所在的目录中测试文件 "$newfile.jpg"。您可以使用 Join-Path:

构建完整路径
Test-Path -Path (Join-Path $picture.Directory.FullName -ChildPath "$newfile.jpg")

最后是这样的:

foreach ($picture in $pictures)
{
    $newName = $picture.LastWriteTime | Get-Date -Format "yyyyMMdd-hhmmss"
    $newFilePath = Join-Path $picture.Directory.FullName "$newName.jpg"

    if ($picture.BaseName -ne $newName -and -not(Test-Path -Path $newFilePath))
    {
        Rename-Item $picture.FullName -NewName "$newName.jpg"
    }
}