Applescript che dà errore 1728 quando verifica se il file esiste

3

Sto provando a rendere più semplice la compressione di un file video usando HandBrake tramite il applescript e ho basato la maggior parte del codice sui modelli che ho trovato.
A questo punto nel codice, l'utente ha specificato il file sorgente e la cartella di destinazione.
Invece di HandBrakeCLI semplicemente sovrascrivendo ciecamente un file con lo stesso nome nella cartella di destinazione, volevo Finder per fare un controllo e, se un file con lo stesso esiste già nella cartella di destinazione, allora volevo avere il nome del file aggiunto al data e ora correnti prima dell'estensione.
Tutto ha funzionato bene fino a quando ho iniziato ad aggiungere il codice "se esiste".

Ecco il pezzo di codice:

tell application "Finder"
    set newFilepathPOSIX to POSIX path of dest_folder
    set newFilepathPOSIX to newFilepathPOSIX & "video.mp4"
    -- Check if file with same name exists
    if exists file newFilepathPOSIX then
        display dialog "There is already a file named \"video.mp4\". Do you want to replace the file?" buttons {"Quit", "No", "Yes"} cancel button 1
        if result = {button returned:"No"} then
            set newFilepathPOSIX to POSIX path of dest_folder
            set newFilepathPOSIX to newFilepathPOSIX & "video" & getDateAsString & ".mp4"
        end if
    end if
    set newFilepathPOSIX to quoted form of newFilepathPOSIX
    set shellCommand to "/Volumes/Flash Drive/HandBrakeCLI -i " & origFilepathPOSIX & " -o " & newFilepathPOSIX & " --preset=\"Classic\""
end tell

to getDateAsString from t
    set creationDateString to year of t as string
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & getMonthNum(t) as string)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & day of t as string)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & hours of t as string)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & minutes of t as string)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & seconds of t as string)
    return creationDateString
end getDateAsString

Ecco cosa restituisce:

exists file "/Users/me/Box Documents/My Folder/video.mp4"
    --> false

Se aggiungo "come file POSIX" alla riga "if exists", questo è ciò che restituisce:

get file "/Users/me/Box Documents/My Folder/video.mp4"
    --> error number -1728 from file "/Users/me/Box Documents/My Folder/video.mp4"
exists file "My HD:Users:me:Box Documents:My Folder:video.mp4"
    --> true
display dialog "There is already a file named \"video.mp4\". Do you want to replace the file?" buttons {"Quit", "No", "Yes"} cancel button 1
    --> {button returned:"No"}

Dopo questo, ha errato.
Totalmente nuovo in questo modo, spero di aver dato abbastanza dettagli senza dare troppi dettagli.

    
posta thefigg88 08.02.2013 - 22:39
fonte

2 risposte

1

Prova:

set dest_folder to POSIX path of dest_folder
set newFilepathPOSIX to dest_folder & "video.mp4"

tell application "System Events" to exists file newFilepathPOSIX
if the result then
    display dialog "There is already a file named \"video.mp4\". Do you want to replace the file?" buttons {"Quit", "No", "Yes"} cancel button 1
    if button returned of the result = "No" then
        beep
        --Insert your code here
    end if
end if

Modifica

 set handPath to "/Volumes/Flash Drive/HandBrakeCLI"
set dest_folder to POSIX path of dest_folder
if text -1 of dest_folder ≠ "/" then set dest_folder to dest_folder & "/"
set newFilepathPOSIX to dest_folder & "video.mp4"

tell application "System Events" to exists newFilepathPOSIX
if the result then
    display dialog "There is already a file named \"video.mp4\". Do you want to replace the file?" buttons {"Quit", "No", "Yes"} cancel button 1
    if button returned of the result = "No" then set newFilepathPOSIX to dest_folder & "video" & getDateAsString(current date) & ".mp4"
end if

set shellCommand to quoted form of handPath & " -i " & quoted form of origFilepathPOSIX & " -o " & quoted form of newFilepathPOSIX & " --preset=\"Classic\""
do shell script shellCommand

on getDateAsString(myDate)
    set creationDateString to year of myDate as string
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & (month of myDate as integer) as text)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & day of myDate as text)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & hours of myDate as text)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & minutes of myDate as text)
    set creationDateString to creationDateString & text -2 thru -1 of ("0" & seconds of myDate as text)
end getDateAsString
    
risposta data 09.02.2013 - 00:36
fonte
1

Potresti semplicemente scrivere i file con il timestamp sempre incluso. E non hai bisogno di tutto quel codice per farlo.

set theDate to do shell script "date +%Y_%m_%d_%H%M%S" -- use the unix  date command to get a formated text date

set newFilepathPOSIX to POSIX path of dest_folder
set newFilepathPOSIX to newFilepathPOSIX & "video_" & theDate & ".mp4"

Inserisci anche solo il codice tra tell blocks che deve essere interpretato da a  data applicazione.

Il codice seguente non richiede un tell block .

Nessuno dei seguenti esempi di codice si trova in un tell block ma funziona bene.

  set newFilepathPOSIX to "/Users/USERNAME/Movies/CLI/"
    set theDate to do shell script "date +%Y_%m_%d_%H%M%S"
   set the sourceFile to "/Users/USERNAME/Movies/The Studio.m4v"
    set newFilepathPOSIX to newFilepathPOSIX & "video_" & theDate & ".mp4"

   set shellCommand to "/Volumes/HandBrake-0.9.8-MacOSX.6_CLI_x86_64/HandBrakeCLI -i " & quoted form of sourceFile & " -o " & quoted form of newFilepathPOSIX & " --preset=\"Classic\""

    do shell script shellCommand

Mettendo erroneamente il codice tra di loro (come il tuo fare con il finder) genererà errori o risultati imprevisti.

Puoi anche ottenere il titolo di un video se ne ha uno usa il comando mdls

esempio: cercherà il primo titolo del video. Se non lo trova, utilizzerà "video"

set theDate to do shell script "date +%Y_%m_%d_%H%M%S"
set sourceFile to "/Users/USERNAME/Desktop/Desktop--MOVIES/The Studio2.mov"

set nulmaker to "Video"
set title to (do shell script "mdls   -name  kMDItemTitle -raw -nullMarker" & space & quoted form of nulmaker & space & quoted form of sourceFile) -- get the first title name or if none set to "Video"
set newFilepathPOSIX to newFilepathPOSIX & title & "_" & theDate & ".mp4"



set shellCommand to "/Volumes/HandBrake-0.9.8-MacOSX.6_CLI_x86_64/HandBrakeCLI -i " & quoted form of sourceFile & " -o " & quoted form of newFilepathPOSIX & " --preset=\"Classic\""
do shell script shellCommand
    
risposta data 11.02.2013 - 21:58
fonte

Leggi altre domande sui tag