This is my first post on MacScripter although i’ve used this site very much.
Im creating a program with with u can synchronize certain folders (LOCALY).
As of this moment this program uses the rsync terminal command.
I want to be able to monitor the progress from terminal as it advances (Like a progress bar).
welcome to MacScripter.
No worry, you’re at the right place.
Search the AppleScriptObjC forum for the keyword fileHandleForReading,
there are some examples of using NSTask asynchronously.
I’m using the mentioned ObjC code exactly for rsync,
the switch --progress prints out the state of progress.
You have to parse the paragraphs to get the information.
I have to step in here. That AppleScript is single threaded doesn’t mean that ASOC is single threaded as well. Even if you write almost eveything in ASOC, the application remains an ObjC application. An ASOC application can’t run without the OOP implicit runtime environment (the drawback of every OOP) because it needs it as much as Objective-C code self does.
Here another NSTask example. If you pm me your mail address I can send you the xcode project.
property NSNotificationCenter : class "NSNotificationCenter"
property NSPipe : class "NSPipe"
property NSTask : class "NSTask"
property NSString : class "NSString"
script NSTaskAppDelegate
property parent : class "NSObject"
property searchField : missing value
property searchResults : missing value
on applicationWillFinishLaunching_(aNotification)
end applicationWillFinishLaunching_
on applicationShouldTerminate_(sender)
return current application's NSTerminateNow
end applicationShouldTerminate_
on startSearch_(sender) --IBACTION
searchResults's setString_("")
set currentTask to NSTask's alloc's init()
set outputpipe to NSPipe's pipe()
currentTask's setStandardOutput_(outputpipe)
currentTask's setStandardError_(outputpipe)
currentTask's setLaunchPath_("/usr/bin/mdfind")
currentTask's setArguments_({searchField's stringValue()})
NSNotificationCenter's defaultCenter()'s addObserver_selector_name_object_(me, "readPipe:", "NSFileHandleReadCompletionNotification", currentTask's standardOutput()'s fileHandleForReading())
NSNotificationCenter's defaultCenter()'s addObserver_selector_name_object_(me, "endPipe:", "NSTaskDidTerminateNotification", currentTask)
currentTask's standardOutput()'s fileHandleForReading()'s readInBackgroundAndNotify()
currentTask's |launch|()
end startSearch_
on readPipe_(aNotification)
set dataString to aNotification's userInfo's objectForKey_("NSFileHandleNotificationDataItem")
set newstring to ((NSString's alloc()'s initWithData_encoding_(dataString, current application's NSUTF8StringEncoding)))
searchResults's setString_((searchResults's |string|() as text) & newstring as text)
aNotification's object()'s readInBackgroundAndNotify()
end readPipe_
on endPipe_(aNotification)
NSNotificationCenter's defaultCenter()'s removeObserver_(me)
end endPipe_
end script
Hi! This was an excellent “tutorial” for me to build my own small tool set of shell commands. It works fine for commands like mdfind and tail. But when I try more simpler ones like “ls -l” all I get is nothing, nothing in stdout, nothing in stderr! Why? Do some commands have a hidden asynchronous attribute or something like that? Or is Applescript to lazy to show results that are already finished???