Hallo Ihr lieben schlauen Leute! Ich habe mal wieder ein Problem mit mdfind in der Shell

############################### Hier habe ich das Problem: E-Mail

var sh as new shell
var a as string
a="mdfind '(((** = ""corona*""cdw)) && ((kMDItemDisplayName = ""eml*""cdw)))'"

sh.Execute(a)

if sh.Result="" then
  Bash ???
 'im Shell gehts nicht!!!
end if

Inhalt von a funktioniert im Terminal!
mdfind ‘(((** = "corona*"cdw)) && ((kMDItemDisplayName = "eml*"cdw)))’

##################################### einwandfrei
Dokumenten-Suche:
mdfind ‘((kMDItemTextContent = "hanna*"cdwt) && ((kMDItemDisplayName = "*pages"cd) || (kMDItemDisplayName = "*numbers"cd) || (kMDItemDisplayName = "*rtf"cd) || (kMDItemDisplayName = "*pdf"cd) || (kMDItemDisplayName = "*doc"cd)))’

Hier funktionieren beide (Shell und Terminal!)

Hat jemand eine Idee, warum?
Wo ist der Fehler?

Vielen Dank im Voraus
Micha

Möglicherweise müssen Sie den vollständigen Pfad für mdfind angeben

Die Shell hat nicht die gleiche Umgebung wie ein Terminal.

Hallo Greg!
Lieben Dank für die Rückmeldung.
Wie, oder was muss ich als Pfad für MDFIND eingeben?

Öffnen Sie ein Terminal und geben Sie

which mdfind

sorry, leider funktioniert es hiermit auch nicht.
/usr/bin/mdfind ‘(((** = "corona*"cdw)) && ((kMDItemDisplayName = "eml*"cdw)))’
Diese Copy im Terminal ok.

Ich frage mich, ob mdfind keine Ausgabe an stdout sendet. Wenn es auf stderr gedruckt wird, wäre es nicht im Shell-Ergebnis enthalten.

Versuchen Sie, den folgenden Code am Ende Ihres Befehls hinzuzufügen:

2>&1

Leider ohne Erfolg!
Trotzdem vielen Dank für die Mühe

Es gibt im Forum noch andere Threads zu dem Thema:

Schau doch mal, ob Du von den Beispielen eines zum Laufen bringst. Kann es ein Problem mit den ’ oder “” sein?

Hallo Beatrix!
Du hast mir sch des Öfteren sehr gut geholfen!
Ich habe folgende Idee.
tell application “Terminal”
activate
run
do shell script “mdfind ‘(((** = "“corona*”"cdw)) && ((kMDItemDisplayName = "“eml*”"cdw)))’”" >Ausgabe.txt

end tell

wäre sowas nicht möglich?
Leider bin ich zu blöd, sowas in der Tat umzusetzen!

Es gibt immer Sachen, bei denen ich mich auch blöd fühle (hust… Gmail und Microsoft 365).

Ich habe jetzt erst einmal einen Teil der Query ausprobiert:

dim d as new Shell
d.Execute("usr/bin/mdfind 'kMDItemDisplayName = ""eml*""cdw'")
dim r as String = d.Result

Im Terminal gibt das ein langes Resultat:

In Xojo gibt es auch ein Resultat. Das sieht aber wesentlich kürzer aus:

Screenshot 2023-04-03 at 16.18.39

Die Länge des Strings ist 719 Zeichen.

Wenn ich Deine ganze Suche in der Shell verwende:

mdfind ‘kMDItemDisplayName = "eml*"cdw && ** = "corona*"cdw’

bekomme ich ein Resultat und keines in Xojo. Beim obigen Resultat würde ich vermuten, daß die Xojo-Shell zu schnell ist.

Hallo Beatrix!
Ich habe fast die Lösung.
Hiermit funktioniert es wunderbar. Meine Folder-Shells liegen im Test.txt File
var c as new Clipboard
c.text=“/usr/bin/mdfind ‘(((** = "“Testergebnis vom 17.05.2022*”"cdw)) && ((kMDItemDisplayName = "“eml*”"cdw)))’ >/Volumes/Quick/Test.txt”

Du hattest mir freundlicherweise diesen Script-Code für ein anderes Problem zur Verfügung gestellt.

theScript.Append “tell application ‘Terminal’”
theScript.Append “activate”
?? Hier möchte ich meinen MDFIND-Code aus der Zwischenablage im Terminal einsetzen.
?? Jetzt mit Return abschliessen
?? Terminal schliessen.
theScript.Append “end tell”
dim doAppleScript as new RunAS(theScript, array(0))

Wie oben erwähnt, geht das per Hand, ich möchte es gerne automatisch mit Script.
Wie ich dich kenne, hast Du bestimmt eine finale Lösung!

Theoretisch mußt Du nur Dein shell script in das AppleScript einbetten. Das wird aber lustig, weil Du dann Shell UND AppleScript quoten mußt.

Ok, Ich möchte nur die vorhanden Zwischenablage im Terminal einfügen.
Danach Return
Danach Terminal schliessen.
Nur weiss ich nicht, wie die Befehle bei AppleScript aussehen.