将文件名与文件修改日期进行比较的语句

时间:2016-01-20 22:19:45

标签: powershell automation renaming

我一直在尝试编写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 来构建新文件的路径。

希望有人能提供帮助。

1 个答案:

答案 0 :(得分:1)

"不等于" PowerShell中的运算符为-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"
    }
}