0

スマホからの写真が多い。すべてのファイル名の形式は yyyy-mm-dd hh:mm:ss.jpg です。

週番号に従ってフォルダーに並べ替える必要があります。

AppleScript を使用してファイルをフォルダーに移動することに問題はありません :) また、特定の日付の週番号を定義することにも問題はありません。構文やデータ型に問題があると思いますが、どこに問題があるのか​​ わかりません。

これが私が使用しているものです。

  1. 特定の日付の週番号を定義する関数があります
  2. フォルダをスキャンして、すべての名前をリストに追加します
  3. 名前を解析して、yyyy、mm、および dd を変数として取得します
  4. 次に、これらの変数を使用して関数を呼び出そうとしますが、ここから問題が始まります。

私のコードのこの例を見てください:

property DBFolder : "Macintosh HD:Users:lyubovberezina:Dropbox:DB"
property CUFolder : "Macintosh HD:Users:lyubovberezina:Dropbox:Camera Uploads"

on weekNumber(_inputDate)

script Week_Number_Extras

    on dateOfFirstWeekOfYear(_year)
        -- Get Monday of first week number
        set _date to current date
        set year of _date to _year
        set month of _date to 1
        set day of _date to 1
        set time of _date to 0

        -- Get the first Thursday of this year
        repeat until weekday of _date is Thursday
            set _date to _date + (24 * 60 * 60)
        end repeat

        -- Return the Monday before
        set _date to _date - (3 * 24 * 60 * 60)

        return _date
    end dateOfFirstWeekOfYear

end script

-- Make a copy of the passed date object to avoid changes to the original
copy _inputDate to _targetDate

-- Reset the time and go back to Monday
set time of _targetDate to 0
repeat until weekday of _targetDate is Monday
    set _targetDate to _targetDate - (24 * 60 * 60)
end repeat

-- Get the date of the first week for the current year and the next one
tell Week_Number_Extras
    set _matchDate to dateOfFirstWeekOfYear(year of _targetDate)
    set _nextYearsFirstWeekDate to dateOfFirstWeekOfYear((year of _targetDate) + 1)
end tell

-- Exit early, if the current week is the first one of next year
if _targetDate = _nextYearsFirstWeekDate then return 1

-- Count up until the target date is reached
set _weekNumber to 1
repeat until _targetDate = _matchDate
    set _matchDate to _matchDate + (7 * 24 * 60 * 60)
    set _weekNumber to _weekNumber + 1
end repeat

return _weekNumber
end weekNumber

tell application "Finder"
set this_folder to folder CUFolder
set this_list to every file of this_folder
repeat with i in this_list
    set fileName to name of i
    set fileYear to characters 1 thru 4 of fileName as string
    set fileMonth to characters 6 thru 7 of fileName as string
    set fileDay to characters 9 thru 10 of fileName as string
end repeat
end tell

set theNewDate to date (fileMonth & "/" & fileDay & "/" & fileYear)
weekNumber(theNewDate)

この場合、行

set theNewDate1 to date (fileMonth & "/" & fileDay & "/" & fileYear)

正常に動作しています(つまり、エラーはありません)が、ループの外側にあるため、ループ内の最後の画像のみの結果が得られます。しかし、それをループに移動すると、エラーが発生します:

property DBFolder : "Macintosh HD:Users:lyubovberezina:Dropbox:DB"
property CUFolder : "Macintosh HD:Users:lyubovberezina:Dropbox:Camera Uploads"

on weekNumber(_inputDate)

script Week_Number_Extras

    on dateOfFirstWeekOfYear(_year)
        -- Get Monday of first week number
        set _date to current date
        set year of _date to _year
        set month of _date to 1
        set day of _date to 1
        set time of _date to 0

        -- Get the first Thursday of this year
        repeat until weekday of _date is Thursday
            set _date to _date + (24 * 60 * 60)
        end repeat

        -- Return the Monday before
        set _date to _date - (3 * 24 * 60 * 60)

        return _date
    end dateOfFirstWeekOfYear

end script

-- Make a copy of the passed date object to avoid changes to the original
copy _inputDate to _targetDate

-- Reset the time and go back to Monday
set time of _targetDate to 0
repeat until weekday of _targetDate is Monday
    set _targetDate to _targetDate - (24 * 60 * 60)
end repeat

-- Get the date of the first week for the current year and the next one
tell Week_Number_Extras
    set _matchDate to dateOfFirstWeekOfYear(year of _targetDate)
    set _nextYearsFirstWeekDate to dateOfFirstWeekOfYear((year of _targetDate) + 1)
end tell

-- Exit early, if the current week is the first one of next year
if _targetDate = _nextYearsFirstWeekDate then return 1

-- Count up until the target date is reached
set _weekNumber to 1
repeat until _targetDate = _matchDate
    set _matchDate to _matchDate + (7 * 24 * 60 * 60)
    set _weekNumber to _weekNumber + 1
end repeat

return _weekNumber
end weekNumber

tell application "Finder"
set this_folder to folder CUFolder
set this_list to every file of this_folder
repeat with i in this_list
    set fileName to name of i
    set fileYear to characters 1 thru 4 of fileName as string
    set fileMonth to characters 6 thru 7 of fileName as string
    set fileDay to characters 9 thru 10 of fileName as string
    set theNewDate to date (fileMonth & "/" & fileDay & "/" & fileYear)
    weekNumber(theNewDate)
end repeat
end tell

最初のファイルが取得された後、エラーが発生します。

get name of document file "2013-01-02 02.43.21.jpg" of folder "Camera Uploads" of folder "Dropbox" of folder "lyubovberezina" of folder "Users" of startup disk
    --> "2013-01-02 02.43.21.jpg"
get date "01/02/2013"
    --> error number -1728 from date "01/02/2013"
Result:
error "Finder got an error: Can’t get date \"01/02/2013\"." number -1728 from date "Wednesday, January 2, 2013 12:00:00 AM"

私はApplescriptのほぼ初心者なので、コードがループの外側で機能し、ループの内側で機能しない理由を理解できません。この問題について何か助けていただければ幸いです。

どうもありがとう!

4

2 に答える 2

1

少なくとも週番号部分にはシェルスクリプトを使用する方が簡単かもしれません:

do shell script "date -jf %F 2013-07-19 +%V"

cd ~/Dropbox/Camera\ Uploads; for f in *; do d=../DB/$(date -jf %F ${f:0:10} +%Y-%V "$f"); mkdir -p $d; mv "$f" $d; done

于 2013-07-19T06:06:08.623 に答える
0

次の元の形式に固執する必要があります。

set theNewDate to current date
set theNewDate's year to fileYear
set theNewDate's month to fileMonth
set theNewDate's day to fileDay

また:

set _date to _date + (24 * 60 * 60)

set _date to _date + daysと同じです

set _date to _date - (3 * 24 * 60 * 60)
は、set _date to _date - (3 * days) と同じです。

_matchDate を _matchDate + (7 * 24 * 60 * 60)に設定すると、 _matchDate を _matchDate + 週に設定
することと同じになります。

于 2013-07-18T18:18:40.823 に答える