1

在 Cocoa 中,我正在尝试实现一个按钮,当用户单击该按钮时,它将捕获系统分析器报告并将其粘贴到桌面上。

代码

 NSTask *taskDebug;
NSPipe *pipeDebug;
 taskDebug = [[NSTask alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(taskFinished:)       name:NSTaskDidTerminateNotification object:taskDebug];
 [profilerButton setTitle:@"Please Wait"];
 [profilerButton setEnabled:NO];

  [taskDebug setLaunchPath: @"/usr/sbin/system_profiler"];

  NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-detailLevel",@"full",@">", @" 
    ~/Desktop/Profiler.spx",nil];
  [taskDebug setArguments:args];


  [taskDebug launch];

但这不会将文件保存到桌面。拥有 NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-detailLevel",@"full",nil] 可以工作,它会将整个 sys 分析器输出丢弃在控制台窗口中。

关于为什么这不起作用或如何更好地实现这一点的任何提示?我试图避免使用 shell 脚本或 AppleScript 来获取系统分析器。如果没有任何工作,那将是我的最终选择。提前致谢。

4

3 回答 3

1
NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-detailLevel",@"full",@">", @"~/Desktop/Profiler.spx",nil];

那是行不通的,因为您没有通过外壳,并且>是外壳操作员。(此外,~除了使用 . 扩展它时,它并不特别stringByExpandingTildeInPath。)

创建一个 NSFileHandle 用于写入该 Profiler.spx 文件,确保使用完整的绝对路径,而不是波浪号缩写的路径。然后,将该 NSFileHandle 设置为任务的标准输出。这本质上就是当您在其中使用>运算符时 shell 所做的事情。

于 2010-02-26T18:02:18.437 回答
1

这完成了(感谢彼得和科斯蒂克)

[taskDebug setLaunchPath: @"/usr/sbin/system_profiler"];    
NSArray *args = [NSArray arrayWithObjects:@"-xml",@"-         detailLevel",@"full",nil];


[taskDebug setArguments:args];

[[NSFileManager defaultManager] createFileAtPath: [pathToFile stringByExpandingTildeInPath] contents: nil attributes: nil];

outFile = [ NSFileHandle fileHandleForWritingAtPath:[pathToFile stringByExpandingTildeInPath]];

[taskDebug setStandardOutput:outFile];
[taskDebug launch];
于 2010-02-27T00:03:53.250 回答
0

创建一个 NSPipe,发送 [taskDebug setStandardOutput: myPipe] 并从管道的文件句柄中读取。

于 2010-02-26T17:35:44.007 回答