Cocoa NSTask 输出提取

Posted

技术标签:

【中文标题】Cocoa NSTask 输出提取【英文标题】:Cocoa NSTask ouput extraction 【发布时间】:2018-11-02 10:47:20 【问题描述】:

我想在我的 Cocoa 应用程序中运行此命令 system_profiler -xml SPUSBDataType。在NSTask 的帮助下完成后,我通过将fileHandle 输出编码为NSString 得到以下输出。但我不能提取特定键的值。我尝试使用SWXMLHash 将其转换为xml,并使用jsonSerializer 转换为JSON。但它变得更加复杂。

有什么办法吗?

 <?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

 <plist version="1.0">

 <array>

  <dict>

   <key>_SPCommandLineArguments</key>

   <array>

       <string>/usr/sbin/system_profiler</string>

       <string>-nospawn</string>

       <string>-xml</string>

       <string>SPCameraDataType</string>

       <string>-detailLevel</string>

       <string>full</string>

   </array>

   <key>_SPCompletionInterval</key>

   <real>0.13360595703125</real>

   <key>_SPResponseTime</key>

   <real>0.22787702083587646</real>

   <key>_dataType</key>

   <string>SPCameraDataType</string>

   <key>_detailLevel</key>

   <integer>-1</integer>

   <key>_items</key>

   <array>

       <dict>

           <key>_name</key>

           <string>FaceTime HD Camera</string>

           <key>spcamera_model-id</key>

           <string>Apple Camera VendorID_0x106B ProductID_0x1570</string>

           <key>spcamera_unique-id</key>

           <string>CC89657KQR6GDV4AQ</string>

       </dict>

   </array>

  </dict>

 </array>

</plist>

【问题讨论】:

您在下面得到了一些很好的答案。如果它们还不足以让你越过这个障碍,那么下一步就是提取这部分代码并做一个简单的例子来完成这部分(调用 NSTask 获取输出,转换为属性列表)并查看如果你仍然无法让它工作。如果你不能,那么你至少可以在这里分享一些更简单的独立代码,以便我们可以进一步帮助你。 【参考方案1】:

您应该能够使用PropertyListSerialization 直接解析此输出。查看documentation。

我建议您改用 IOKit。处理它可能是一个令人生畏的 API,但它提供了强大的功能。我过去曾将它用于 USB 设备信息和连接/断开连接通知,并且效果非常好。我认为您会发现它比解析命令行实用程序的输出更强大。

【讨论】:

我试图这样做。但是由于数据格式无效,数据我得到了错误。以下代码行用于从文件句柄中获取数据。 let readHandle : FileHandle = privilegedTask.outputFileHandle() let outputData: Data = readHandle.readDataToEndOfFile(). 您能否更具体地说明您遇到的具体错误?以下对我来说很好,我相信这证明这是一个有效的 plist system_profiler -xml SPUSBDataType | plutil -p -【参考方案2】:

您可以使用类似下面的方法来获取包含 Dictionary 的数组。

let url = Bundle.main.url(forResource: "data", withExtension: "plist")!
let plistData = try! Data(contentsOf: url)
if let array = try! PropertyListSerialization.propertyList(from: plistData, options: [], format: nil) as? [[String:Any]] 

   print(array)

【讨论】:

以上是关于Cocoa NSTask 输出提取的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa Extract(可可提取物)

Cocoa 应用程序无法开始循环 python 脚本。通过 xcode 构建/运行时工作

Cocoa/iPhone:如何防止凳子在 xib 文件中输出不可本地化的字符串?

NSTask 字符输出到 NSTextField 无缓冲作为连续流

如何使用 Cocoa 以编程方式获取当前电池电量 [重复]

在 Cocoa 中搜索目录及其子目录中的所有目录/文件