Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heiner •-->
Anmeldedatum: 03.12.2005 Beiträge: 62 Wohnort: Moers
|
Verfasst am: 14.03.2006 - 20:35 Titel: Leerzeichen im Pfad durch '\ ' (backslash, space) ersetzen |
|
|
Hallo allerseits,
es ist in diesem Forum schon oft angesprochen worden, aber ich hab's wohl immer noch nicht verstanden und ich finde auch die entsprechenden Stellen nicht mehr. Das Problem mit der Pfaden:
Z.B. set path to "~/Documents/Meine Datei" wird so nicht verstanden, weil ein Leerzeichen vorkommt. Ich möchte also in einem Pfad die (eventuell) vorkommenden Leerzeichen durch '\ ' (backslash, space) ersetzen. Meine Versuche mit dem Terminal und AS verliefen sehr unterschiedlich.
Auf dem Terminal klappt es:
% echo "Meine Datei" | sed 's/[\" "]/\\ &/g'
Meine\ Datei
Aber in meinem Skript kommt es, wie auch immer ich die 'Hieroglyphen' setze, zu Fehlermeldungen. Z.B. auch somit:
set path to "~/Documents/Meine Datei"
set myPath to do shell script "echo" & path & "| sed 's/[\" "]/\\ &/g'"
(Die klassische Methode mit Suchen und Ersetzen in AS führt zum gleichen Problem.)
Wo liegt der Fehler? Wer erklärt es mir nochmal?
Grüße Heiner |
|
Nach oben |
|
|
Snow Administrator
Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 15.03.2006 - 01:44 Titel: |
|
|
Hallo Heiner,
du brauchst nicht extra mit Suchen/Ersetzen zu arbeiten. AppleScript sieht für diesen Fall 'quoted form' vor.
Pfadangaben mit Leerzeichen müssen in einfache Anführungszeichen gesetzt werden, damit sie per Shell-Befehl verarbeitet werden können. Genau das macht nun 'quoted form'.
Kleines Beispiel zum Testen (bitte Datei mit Leerzeichen im Namen auswählen):
set MacPfad to choose file
set UnixPfad to quoted form of POSIX path of MacPfad
Nun das Ergebnis begutachten. _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
|
Heiner •-->
Anmeldedatum: 03.12.2005 Beiträge: 62 Wohnort: Moers
|
Verfasst am: 17.03.2006 - 15:36 Titel: |
|
|
Hallo Snow,
vielen Dank für Deine rasche Antwort und Deinen Tip!
Zunächst, er funktioniert in der Form, die Du angegeben hast wirklich gut.
Aber - und das erklärt meine verzögerte Antwort - bei mir tauchen doch einige Probleme auf, die ich so schnell nicht in den Griff kriege. Allerdings nur dann, wenn ich in den Verzeichnisnamen Leerzeichen zulassen, ansonsten läuft das Programm gut.
Zum besseren Verständnis will ich die Teile des Programms, die davon betroffen sind kurz skizzieren.
Der Benutzer des Programms soll seine Daten in einem Verzeichnis ablegen, das es für ihn anlegt. Der geeignete Ort ist wohl im persönlichen Verzeichnis das Verzeichnis 'Dokumente'. Also: Falls es noch nicht existiert, ein neues Verzeichnis 'Meine.Dateien' anlegen!
property defaultLocation : "~/Documents/Meine.Dateien"
property userLocation : ""
-- userLocation wird bei Beendigung über 'user dafaults' gespeichert, bzw. beim Start wieder eingelesen
.
.
on SichernAls()
if userLocation is equal to "" then
set thePath to defaultLocation
else
set thePath to userLocation
end if
(* Jetzt suchen, ob das Verzeichnis 'Meine.Dateien" noch über thePath zu erreichen ist. Der Benutzer könnte es entweder gelöscht oder verschoben haben.
Dazu muss aber das letzte Item des Pfades (Meine.Dateien) glöscht werden.
Mir ist nichts Besseres eingefallen, als den Pfad zu zerlegen und neu zusammen zu setzen. Gibt es einen intelligenteren Vorschlag?*)
set oldTextItemDelimiters to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"/"}
set lastItem to last text item of thePath
set newPath to ""
repeat with i from 1 to (count text items of thePath)
if text item i of thePath is not lastItem then
set newPath to newPath & (text item i of thePath) & "/"
else
exit repeat
end if
end repeat
set AppleScript's text item delimiters to oldTextItemDelimiters
-- Existiert ein Verzeichnis "Meine.Dateien"im Verzeichnis
set folderList to do shell script "ls -1 " & newPath -- Liste aller Inhalte im Verzeichnis
if "Meine.Dateien" is not in folderList then -- falls nicht, Suche!
findePfad()
else
SichernAls2() -- dann sichern wie sonst
end if
end SichernAls
.
.
on findePfad() -- Suche Datei und erzeuge ggfs ein neues Verzeichnis im Verzeichnis 'Dokumente'
if FindePanel is equal to missing value then -- über den Fortschritt der Aktion wird der Benutzer über ein Panel informiert
load nib "SuchenPanel"
set FindePanel to window "Suchen"
end if
tell FindePanel
set uses threaded animation of progress indicator "progressIndikator" to true
tell progress indicator "progressIndikator" to start
set enabled of button "OK" to false
set enabled of text field "pfadname" to false
end tell
show FindePanel in front of front window -- Panel in den Vordergrund bringen
set suchVerzeichnis to "Meine.Dateien"
set pfad to do shell script "find ~ -name " & suchVerzeichnis & " -type d -print"
-- falls nicht vorhanden, dann suchen
if (pfad is "") then -- nicht vorhanden
set saveDirectory to do shell script "mkdir -p " & defaultLocation" -- erzeuge den Ordner 'Meine.Dateien' im Ordner 'Dokumente'
set text2 to "Das Verzeichnis 'Meine.Dateien' liegt nicht im persönlichen Verzeichnis." & return & "Das Verzeichnis 'Meine.Dateien' ist im Verzeichnis 'Dokumente' neu angelegt."
set contents of text field "infoFeld" of window "Suchen" to text2
set contents of text field "pfadname" of window "Suchen" to "Pfad: " & defaultLocation
set newPath to defaultLocation -- für open- und save-panel
set userLocation to pfad -- für preferences
else if (".Trash" is in pfad) then -- liegt im Papierkorb
set saveDirectory to do shell script "mkdir -p " & defaultLocation" -- erzeuge den Ordner 'Meine.Dateien' im Ordner 'Dokumente'
set text2 to "Das Verzeichnis 'Meine.Dateien' liegt im Papierkorb." & return & "Das Verzeichnis 'Meine.Dateien' ist im Verzeichnis 'Dokumente' neu angelegt."
set contents of text field "infoFeld" of window "Suchen" to text2
set contents of text field "pfadname" of window "Suchen" to "Pfad: " & defaultLocation
set userLocation to pfad -- für preferences
else if (pfad is not "") and (".Trash" is not in pfad) then
set text1 to "Das Verzeichnis 'Meine.Dateien' ist gefunden." & return
set contents of text field "infoFeld" of window "Suchen" to text1
set contents of text field "pfadname" of window "Suchen" to "Pfad: " & pfad
set saveDirectory to pfad
set userLocation to pfad -- für preferences
end if
tell FindePanel
set uses threaded animation of progress indicator "progressIndikator" to false
tell progress indicator "progressIndikator" to stop
set enabled of button "OK" to true
end tell
end findePfad
Wie gesagt, so funktioniert es. Ich vermute, dass Problem ist die Form von defaultLocation, die vorgegeben ist, und das jeder Benutzer (Rechner) über das Kürzel ~ (Home directory) angesprochen werden muss.
Für Lösungsvorschläge bin ich dankbar.
Grüße
Heiner |
|
Nach oben |
|
|
Heiner •-->
Anmeldedatum: 03.12.2005 Beiträge: 62 Wohnort: Moers
|
Verfasst am: 20.03.2006 - 13:39 Titel: |
|
|
Mein Problem ist gelöst!
Für Diejenigen, die es interessiert:
Will man über einen UNIX-Pfad ein Verzeichnis mit einem Leerzeichen in seinem Namen einfügen, dann darf nicht der gesamte Pfadnamen als 'quoted form' eingegeben werden, sondern lediglich nur der einzelne Name.
Z.B. set pathToDirectory to do shell script "mkdir -p ~/Documents/'Mein neuer Ordner'".
Erzeugt einen neuen Ordner ('Mein neuer Ordner') im Ordner 'Dokumente' im persönlichen Ordner (HOME).
Wie immer, im Nachhinein ist alles klar.
Heiner |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2002 phpBB Group Deutsche Übersetzung von phpBB.de
|
|
|