Как выполнить команды cd с помощью сценария Apple - PullRequest
0 голосов
/ 05 июня 2019

Я написал программу для выполнения команд в cocoapp, используя скрипт Apple. Есть 2 проблемы, с которыми я сталкиваюсь 1) Яблочный скрипт всегда выходит из каталога projet, а не из корня 2) команда cd работает, но когда я делаю pwd, она показывает предыдущее имя каталога, а не новое.

+(BOOL)callAppleScriptForScriptFile:(NSString *)command{
    BOOL isError = YES;
NSAppleEventDescriptor* returnDescriptor = NULL;
NSDictionary* errorDict = nil;

NSString *appleScriptCommand = [NSString stringWithFormat:@"do shell script \" %@  &> /Users/username/Desktop/.output.txt\"  user name \"username\" password \"password\" with administrator privileges",command];
    //NSLog(@"Script command %@",appleScriptCommand);
NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:appleScriptCommand];


returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
if (errorDict != NULL){
    NSLog(@"%@",errorDict);
    isError = NO;
}
DescType descriptorType = [returnDescriptor descriptorType];
NSLog(@"descriptorType == %@", NSFileTypeForHFSTypeCode(descriptorType));
NSData *data = [returnDescriptor data];
double currentPosition = 0;
[data getBytes:&currentPosition length:[data length]];
NSLog(@"currentPosition == %f", currentPosition);
[self readFromFileAndSend];
return isError;

}

Ожидается вывод, как это Рабочий стол CD o / p: успех (не нужно печатать) PWD o / p: Рабочий стол

1 Ответ

0 голосов
/ 07 июня 2019

Каждый оператор do shell script использует новый процесс оболочки, поэтому вы не можете сделать что-то вроде изменения рабочего каталога в одном операторе, а затем ожидать, что он будет таким же в другом. Например, если вы используете отдельные операторы

do shell script "cd ~/Desktop"
do shell script "pwd"

второй оператор покажет корневой каталог, потому что он начинается заново - он не имеет ничего общего с первым оператором. Вы должны включить все команды в одном выражении

do shell script "cd ~/Desktop; pwd"

Из приложения Какао вы также можете использовать NSTask, что позволит избежать всего, что связано с Apple Event.

...