Использовать NSAppleScript создает и вызывает приложение AppleScript в Objective C имеют разные результаты с тем же кодом?

Во-первых, я создал приложение AppleScript со следующим кодом (имя файла: UnloadTest.scpt):

-- Set user name and password
set UserName to "MyAccount"
set MyPASSWORD to "MyPassword"
-- unload FTDIUSBSerialDriver
do shell script "sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext" user      name UserName password MyPASSWORD with administrator privileges
-- Copy driver to the used location
do shell script "sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib" user name UserName    password MyPASSWORD with administrator privileges
do shell script "sudo cp ./libd2xx_table.dylib /usr/local/lib" user name UserName password MyPASSWORD with administrator privileges
do shell script "cd /usr/local/lib" user name UserName password MyPASSWORD with administrator privileges
do shell script "sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib" user name UserName password MyPASSWORD with administrator privileges

И используйте класс NSAppleScript для вызова этого кода, как показано ниже:

NSString * strScript = [[NSBundle mainBundle] pathForResource:@"UnloadTest" ofType:@"scpt"];
NSAppleScript * appScript = [[NSAppleScript alloc] initWithContentsOfURL:[NSURL fileURLWithPath:strScript] error:nil];
[appScript executeAndReturnError:NULL];
[appScript release];

Это может работать нормально, но есть проблема: если я хочу запустить свое приложение на другом компьютере, мне нужно изменить имя пользователя и MyPASSWORD на имя другого человека в файле "UnloadTest.scpt", это глупо! Поэтому я хочу пойти другим путем: используйте функцию "- (id)initWithSource:(NSString *)source" для создания AppleScript из кода, я могу отправить имя пользователя и пароль из моего интерфейса APP:

    NSString        *strScriptUnload    = [NSString stringWithFormat:@"\
                                           set UserName to \"%@\"\
                                           set MyPASSWORD to \"%@\"\
                                           do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\
                                           do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges",[m_textUserName stringValue], [m_textPassword stringValue]];
    NSAppleScript   *appUnloadScript    = [[NSAppleScript alloc] initWithSource:strScriptUnload];
    returnDescriptor = [appUnloadScript executeAndReturnError:nil];
    [appUnloadScript release];

Но это работа не удалась для меня, похоже

sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib

не работает успешно. Я думаю, что AppleScript не получил привилегии, но я не знаю, как это исправить.

Кто-нибудь может мне помочь разобраться в этой проблеме?

1 ответ

Решение

Я нашел причину, вызвавшую эту проблему, просто пропустив "\n" после строки кода AppleScript. Ниже код является успехом:

NSString        *strScriptUnload    = [NSString stringWithFormat:@"\
                                       set UserName to \"%@\"\n\
                                       set MyPASSWORD to \"%@\"\n\
                                       do shell script \"sudo kextunload /System/Library/Extensions/FTDIUSBSerialDriver.kext\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libftd2xx.1.0.2.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo cp ./libd2xx_table.dylib /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"cd /usr/local/lib\" user name UserName password MyPASSWORD with administrator privileges\n\
                                       do shell script \"sudo ln -sf libftd2xx.1.0.2.dylib libftd2xx.dylib\" user name UserName password MyPASSWORD with administrator privileges\n",[m_textUserName stringValue], [m_textPassword stringValue]];
NSAppleScript   *appUnloadScript    = [[NSAppleScript alloc] initWithSource:strScriptUnload];
returnDescriptor = [appUnloadScript executeAndReturnError:nil];
[appUnloadScript release];

Спасибо всем!

Другие вопросы по тегам