2015-07-17 22 views
9

Swift'de bir komut dosyası yazıyorum ve bu betiğin kendisi ile aynı dizinde bulunan bazı dosyaları değiştirmek istiyorum. Senaryonun içinden kendi yolunu bulmanın bir yolu var mı? Denedim:Komut dosyasından Swift komut dosyasının yolunu alın

print(Process.arguments) 

Ama bu aslında aradaki tam olarak çözümlenmiş yolu, sadece dosya adını, ya da bir şey olabilir senaryo, verildi sadece yolunu çıkarır.

Komut dosyasının swift /path/to/my/script.swift ile çalıştırılmasını istiyorum.

let cwd = FileManager.default.currentDirectoryPath 
print("script run from:\n" + cwd) 

let script = CommandLine.arguments[0]; 
print("\n\nfilepath given to script:\n" + script) 

//get script working dir 
if script.hasPrefix("/") { //absolute 
    let path = (script as NSString).deletingLastPathComponent 
    print("\n\nscript at:\n" + path) 
} else { 
    let urlCwd = URL(fileURLWithPath: cwd) 
    if let path = URL(string: script, relativeTo: urlCwd)?.path { 
     let path = (path as NSString).deletingLastPathComponent 
     print("\n\nscript at:\n" + path) 
    } 
} 

cevap

4

Ancak

import Foundation 

let currentDirectoryURL = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) 
let url = URL(fileURLWithPath: CommandLine.arguments[1], relativeTo: currentDirectoryURL) 
print("script at: " + url.path) 

, aynı sorun işaret vardır komut dosyası dizini PATH'nızdaysa @ rob-napier tarafından dışarı.

+1

Kullanım # kullanın, bu başarısız olur unutmayın! ve bu PATH'da (ancak OP'nin betiği çalıştırmak için söylediği şekilde eşleşiyor, yani sorun yok) –

+0

@RobNapier ne demek istiyorsun? Üstte "#!/Usr/bin/env swift" var, ama bu benim $ PATH'imde değil –

+0

demek istiyorum. Eğer PATCH'inizde, eğer sadece "script.swift" yazıyorsa betik şu anda içinde bulunduğunuz dizinde olup olmadığına bakın. –

5

kabul cevabı Ayrıca Swift 3'te çalışmıyor, bu bir daha basit bir yaklaşımdır: sadece Swift içinde

+0

Bu, Swift 3'te neredeyse mükemmel çalışır, ancak 'CommandLine.arguments [0]' komut dosyasının adını içerir (Zev'in sorusu içinde). Geçirilen yolun/komut dosyasının adını içerecek “CommandLine.arguments [1]' öğesini istiyorsunuz. – worthbak

+0

@worthbak: Haklısınız - güncelledikleriniz – ganzogo

İlgili konular