Wie kann ich einen Versuch abfangen, in eine geöffnete Datei zu schreiben?Hallo - Ich habe ein JSL-Skript, das den Benutzer auffordert, eine Auswahl von JMP-Grafiken, die gerade durch eine Analyse generiert wurden, direkt in einer PowerPoint-Präsentation zu speichern.Der Benutzer möchte die resultierenden Folien wahrscheinlich sofort inspizieren, daher möchte ich die PowerPoint-Datei nicht automatisch schließen - aber wenn der Benutzer dann versucht, welche anzuhängen mehr Grafiken mit einem zweiten Lauf des Skripts hinzuzufügen, erhalten sie eine JMP-Warnung, die ihnen mitteilt, dass sie versuchen, eine Datei zu überschreiben, die möglicherweise in einem anderen Programm geöffnet ist (was es natürlich ist).
Ich habe versucht, einen Versuch abzufangen, der mit der Try()-Funktion fehlschlagen könnte, aber das scheint nicht zu funktionieren: Der Fehler tritt trotzdem auf – und obwohl JMP Alert dem Benutzer korrekt sagt, was das Problem ist, tue ich es nicht wirklich wollen, dass Fehlermeldungen den Programmfluss unterbrechen.Ich dachte, mit der Funktion "Is File Writable()" im Voraus zu überprüfen, würde es damit umgehen, aber das scheint auch nicht zu funktionieren: die PowerPoint-Datei ist als beschreibbar angesehen, obwohl es geöffnet ist.
Momentan lasse ich mir eine Meldung auf dem Bildschirm anzeigen - falls die Datei schon existiert (was ich natürlich kann check for) - warnt den Benutzer im Voraus davor wenn es offen ist, müssen sie es schließen, bevor sie fortfahren - aber das ist ein bisschen unelegant und löst das Problem nicht wirklich.Gibt es eine Möglichkeit, automatisch (a) zu prüfen, ob es nicht bereits geöffnet ist, und (b) es bei Bedarf zu schließen?
GrafikSkripterstellungBetreff: Wie kann ich einen Versuch abfangen, in eine geöffnete Datei zu schreiben?Vielen Dank Jim und Craige – ich habe jetzt eine funktionierende Lösung, die eine Mischung aus Ihren beiden Empfehlungen ist.Ich musste den Befehl „Batch Interactive“ verwenden, weil der JMP-Alarm nicht an das Protokoll gesendet wurde, aber ich konnte den Befehl logcapture() nicht zum Laufen bringen, während << get log() das tat, was ich brauchte.
Ich stelle fest, dass das Protokoll jedes Mal gelöscht werden muss, oder dass die gleiche Fehlermeldung bei jedem nachfolgenden Lauf abgeholt wird.Nur fürs Protokoll, ich habe unten eine abgespeckte Version meines endgültigen Skripts beigefügt.(Ich vermute, dass der zweite "Batch Interactive(bi)-Begriff den interaktiven JMP-Alarm wieder einschaltet - ist das richtig?)"
OutputFileName = "$DESKTOP\My Slides.pptx";
if(not(file exists(OutputFileName)),
// No possible problem here;
Text Box("New File - First Page") << save presentation(OutputFileName);
caption("You've just started a new presentation - here it is..."); wait(2); caption(remove);
open(OutputFileName)
,
// The file exists but it might be open - so be wary;
bi = Batch Interactive( 1 );
// If I don't clear the log first, it will tell me there's an error even when there isn't;
clear log();
Text Box("Existing File - Next Page") << save presentation(OutputFileName, append);
Error_List = get log();
if(contains(concat items(Error_List), "Unable to overwrite"),
beep();
caption("You can't write to the file\!rbecause it's open right now.\!rPlease close it, then try again.");
wait(3);
caption(remove);
Batch Interactive(bi)
,
caption("Here's the updated presentation with your latest slide"); wait(2); caption(remove);
open(OutputFileName)
)
);Betreff: Wie kann ich einen Versuch abfangen, in eine geöffnete Datei zu schreiben?txt = logcapture(...jsl that might make log messages...)
könnte auch mit dem gleichen Ansatz helfen.
Bearbeiten: Sie könnten brauchen Fehler beim Erstellen einer Datenbankverbindung auch, was zeigt, wie man BatchInteractive() verwendet, um einen Dialog zu unterdrücken und nur eine Protokollnachricht zu erhalten. ...und mehr zu Batch Interactive .
Betreff: Wie kann ich einen Versuch abfangen, in eine geöffnete Datei zu schreiben?Sie können verwenden
mylist = get log();
und analysieren Sie dann mylist, um zu sehen, ob die Warnung aufgetreten ist, und wenn dies der Fall ist, ergreifen Sie die gewünschte Aktion.