2016-01-20 40 views
0

我一直在尝试编写一个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 
    } 
} 

问题是,我想我不能似乎在如果声明正确地比较,现有的文件和当前文件之间的差异。我正在这样做,以进一步创建具有相同日期的图像的逻辑。

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

希望有人能帮忙。

回答

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" 
    } 
} 
+0

感谢,这是非常有用的。 – Kareem

相关问题