Войти

Показать полную графическую версию : [решено] Добавить фильтр в скрипт.


Rey71
06-07-2018, 09:37
День добрый.
Имеется следующий скрипт (найден в просторах инета) - поворачивает файлы картинок в текущей папке и подпапках в альбомную ориентацию. Отлично работает.
Необходимо добавить условие чтобы обрабатывались только файлы с текущей датой создания (либо начинать с текущая дата минус 1 день), старше файлы не обрабатывать.
Как это можно добавить?

<job>
<script language="JScript">

var fs =new ActiveXObject("Scripting.FilesystemObject");
var gfl=new ActiveXObject("GFLAx.GFLAx"); // GFLAx Free component (c) Pierre-E Gougelet
var n=0;
var t= Date();
var pics=dir(".",/jpg$/i).files; // список картинок *.jpg
for(i in pics)
rotate(pics[i]); // их разворот

WSH.echo("OK. Повернуто файлов: "+n);

// ==============================================================

function rotate(file) // разворот катинки
{
with(gfl)
{
LoadBitmap(file);
if(Width>Height) return;
Rotate(-90);
// try{file.name=file.name+".bak"} catch(e){};
SaveJPEGQuality=95;
SaveKeepMetadata=true;
SaveBitmap(fs.GetParentFolderName(file)+"\\"+fs.GetFileName(file));
n++;
}
}

function dir(f,filter,n) // dir.folders[] - подпапки папки f
{ // dir.files[] - файлы папки f
var fs=new ActiveXObject("Scripting.FilesystemObject");
if(!f.files) var n=1,f={folders:[fs.GetFolder(f)],files:[]};
for(var e=new Enumerator(f.folders[n-1].files); !e.atEnd(); e.moveNext())
if(e.item().name.match(filter||"")) f.files.push(e.item());
for(var e=new Enumerator(f.folders[n-1].SubFolders); !e.atEnd(); e.moveNext())
dir(f,filter,f.folders.push(e.item()));
return f;
}
</script>
</job>

Iska
06-07-2018, 13:39
Rey71, на VBScript устроит?
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objGFLAx


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objGFLAx = WScript.CreateObject("GFLAx.GFLAx")

ScanSubFolders objFSO.GetFolder(WScript.CreateObject("WScript.Shell").CurrentDirectory)

Set objGFLAx = Nothing
Set objFSO = Nothing

WScript.Quit 0

Sub ScanSubFolders(objFolder)
Dim objFile
Dim objSubFolder
Dim strFilePath

WScript.StdOut.WriteLine objFolder.Path

For Each objFile In objFolder.Files
Select Case LCase(objFSO.GetExtensionName(objFile.Name))
Case "jpg", "jpeg", "jpe"
WScript.StdOut.Write vbTab

With objGFLAx
.LoadBitmap(objFile.Path)

If .Width < .Height Then
WScript.StdOut.WriteLine "+ " & objFile.Path

.Rotate -90

.SaveJPEGQuality = 95
.SaveKeepMetadata = True

strFilePath = objFile.Path
objFile.Name = objFile.Name & ".bak"
.SaveBitmap strFilePath
Else
WScript.StdOut.WriteLine "- " & objFile.Path
End If
End With
Case Else
' Nothing to do
End Select
Next

For Each objSubFolder In objFolder.SubFolders
ScanSubFolders objSubFolder
Next
End Sub
Работает под cscript.exe (из-за прямого вывода — для красоты — в StdOut). Единственное, что мне не нравится — работа с текущим каталогом, а не с заданным параметром скрипта. Ну, да ладно.

Обычно же такие вещи реализуют посредством ImageMagick.

Rey71
09-07-2018, 07:12
Все работает. Спасибо большое.
А как в Вашем скрипте задается выбор файлов с текущей датой создания? Ткните носом в строчку, плиз ))).

Iska
09-07-2018, 10:02
А как в Вашем скрипте задается выбор файлов с текущей датой создания? Ткните носом в строчку, плиз ))). »
Хмм… А некуда тыкать. То, что было про текущую дату в тексте сообщения — совершенно запамятовал сделать после перевода на VBScript :lol:. Приношу Вам свои извинения.

Пробуйте:
Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objGFLAx


Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objGFLAx = WScript.CreateObject("GFLAx.GFLAx")

ScanSubFolders objFSO.GetFolder(WScript.CreateObject("WScript.Shell").CurrentDirectory)

Set objGFLAx = Nothing
Set objFSO = Nothing

WScript.Quit 0

Sub ScanSubFolders(objFolder)
Dim objFile
Dim objSubFolder
Dim strFilePath

WScript.StdOut.WriteLine objFolder.Path

For Each objFile In objFolder.Files
Select Case LCase(objFSO.GetExtensionName(objFile.Name))
Case "jpg", "jpeg", "jpe"
If DateDiff("d", objFile.DateCreated, Date()) = 0 Then
With objGFLAx
.LoadBitmap(objFile.Path)

If .Width < .Height Then
WScript.StdOut.WriteLine vbTab & "+" & vbTab & objFile.Path

.Rotate -90

.SaveJPEGQuality = 95
.SaveKeepMetadata = True

strFilePath = objFile.Path
objFile.Name = objFile.Name & ".bak"
.SaveBitmap strFilePath
Else
WScript.StdOut.WriteLine vbTab & "-" & vbTab & objFile.Path
End If
End With
Else
WScript.StdOut.WriteLine vbTab & "*" & vbTab & objFile.Path
End If
Case Else
' Nothing to do
End Select
Next

For Each objSubFolder In objFolder.SubFolders
ScanSubFolders objSubFolder
Next
End Sub

Rey71
09-07-2018, 11:37
Спасибо огромное! Теперь увидел!




© OSzone.net 2001-2012