Запуск сценария оболочки с Swift в какао - PullRequest
0 голосов
/ 29 марта 2019

Я работаю над настольным приложением Mac и пытаюсь запустить скрипт оболочки.Я зациклен на установке пути запуска для задачи.Вот код:

    let path = fileURL.deletingLastPathComponent().relativePath

    //set new filename
    let strNewFileName = fileURL.deletingPathExtension().lastPathComponent.appending(".html")

    let newPath = path + "/" + strNewFileName

    //create script
    var strScript = "pandoc -s -o "
    strScript.append(newPath)
    strScript.append(" ")
    strScript.append(fileURL.absoluteString)

    //set storage path
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    var documentPath:URL = URL(string: documentsPath)!
    documentPath.appendPathComponent("pandoc.sh")

    var myURLComponents = URLComponents()
    myURLComponents.scheme = "file"
    myURLComponents.path = documentPath.absoluteString


    do {
        //write file
        try strScript.write(to: myURLComponents.url!, atomically: true, encoding: String.Encoding.utf8)

        //run script
        let myTask = Process()

        myTask.launchPath = "/usr/bin/env"
        myTask.arguments = [strScript]

        let myPipe = Pipe()
        myTask.standardOutput = myPipe

        myTask.launch()

        let data = myPipe.fileHandleForReading.readDataToEndOfFile()
        let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)

        print(output!)



    } catch {
        print(error.localizedDescription)
    }

Это не вызывает такую ​​ошибку файла:

env: pandoc -s -o /Users/stevensuranie/Desktop/MarkdownFiles/targeting-params-ios.html file:///Users/stevensuranie/Desktop/MarkdownFiles/targeting-params-ios.md: No such file or directory

Любая помощь будет оценена.

1 Ответ

1 голос
/ 29 марта 2019

Эта строка не может работать

var documentPath:URL = URL(string: documentsPath)!

URL(string для строк URL, включая схему (file:// или https://), для путей к файловой системе, которые вы должен использовать URL(fileURLWithPath.

Однако, если вы используете API, связанный с URL-адресом FileManager, вы вообще можете избежать использования метода init.
Аналогичная проблема - absoluteString, никогда не вызывайте ее по URL-адресу файловой системы, используйтевсегда path.

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

//create script
let scriptArguments = ["/path/to/pandoc", "-s", "-o", newPath, fileURL.path]

//set storage path
let documentsURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let scriptURL = documentsURL.appendingPathComponent("pandoc.sh")

.следующие строки являются избыточными

var myURLComponents = URLComponents()
myURLComponents.scheme = "file"
myURLComponents.path = documentPath.absoluteString

Запись строки в scriptURL

do {
    //write file
    try strScript.write(to: scriptURL, atomically: true, encoding: .utf8)
...

    myTask.arguments = scriptArguments

И, наконец, неиспользуйте NS... классы в Swift

let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)

Используйте native эквивалент

let output = String(data: data, encoding: .utf8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...