我正在使用以下applescript
重新启动finder应用程序。
osascript -e "tell application \"Finder\"" -e "delay 1" -e "try" -e "quit" -e "delay 1" -e "activate" -e "end try" -e "end tell"
但有时这个脚本不会重新启动finder应用程序(只有quiting finder应用程序)。我在控制台中没有收到任何错误
http://www.cocoabuilder.com/archive/cocoa/113654-nsapplescript-buggy.html
有人可以帮帮我吗?
答案 0 :(得分:4)
如果您正在使用Cocoa,这是错误的方法。您应该尽可能使用本机API,而您尝试调用自己构建并运行AppleScript的shell脚本。在尝试重新启动之前,AppleScript会等待一秒钟,这是一个任意值。你应该等待Finder退出。
相反,您应该使用NSRunningApplication
类来管理它,通过使用键值观察来监视实例的terminated
属性,以便您可以在应用终止时重新启动它:
//assume "finder" is an ivar of type NSRunningApplication
//it has to be a strong reference or it will be released before the observation method
//is called
- (void)relaunchFinder
{
NSArray* apps = [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.finder"];
if([apps count])
{
finder = [apps objectAtIndex:0];
[finder addObserver:self forKeyPath:@"isTerminated" options:0 context:@"QuitFinder"];
[finder terminate];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == @"QuitFinder")
{
if([keyPath isEqualToString:@"isTerminated"])
{
[[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:@"com.apple.finder" options:NSWorkspaceLaunchDefault additionalEventParamDescriptor:NULL launchIdentifier:NULL];
[object removeObserver:self forKeyPath:@"isTerminated"];
}
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
答案 1 :(得分:4)
这是一种AppleScript方式。你不能像你看到的那样依赖特定的延迟时间。因此,我们手动等待Finder退出,检查它是否在正在运行的进程列表中。当它不在列表中时,我们就知道它已经退出,我们可以再次激活它。
您还会注意到,由于重复循环,我在脚本中进行了时间检查。万一出现问题,我们不希望重复循环永远运行。因此,如果它运行超过10秒,我们会自动退出重复循环。
tell application "Finder" to quit
set inTime to current date
repeat
tell application "System Events"
if "Finder" is not in (get name of processes) then exit repeat
end tell
if (current date) - inTime is greater than 10 then exit repeat
delay 0.2
end repeat
tell application "Finder" to activate
这是该代码的osascript版本。
/usr/bin/osascript -e 'tell application "Finder" to quit' -e 'set inTime to current date' -e 'repeat' -e 'tell application "System Events"' -e 'if "Finder" is not in (get name of processes) then exit repeat' -e 'end tell' -e 'if (current date) - inTime is greater than 10 then exit repeat' -e 'delay 0.2' -e 'end repeat' -e 'tell application "Finder" to activate'