【问题标题】:Accepting arguments with Cocoa and running system commands使用 Cocoa 接受参数并运行系统命令
【发布时间】:2012-01-20 19:51:42
【问题描述】:

我是 Cocoa 和 Xcode 的新手,但我真的很想学习。问题是我花了很多时间在 PHP、perl、python 和 shell 脚本等脚本语言上工作,虽然 Cocoa 比在 OS X 上的终端中运行 shell 脚本强大得多,但它也是一个有点难进入。

不过我有一个假设:如果我可以开始使用 Cocoa 和 Xcode 来实际做一些事情,那么我会更加适应它,并逐渐开始释放越来越多的潜力。

这就是我希望 StackOverflow 发挥作用的地方。看,我习惯于编写将参数(主要是文件名)作为输入的脚本,并对它们采取行动 - 调度其他程序或读取和写入基于文本的内容.因此,考虑到这一点,我如何编写一个简单的 Cocoa 应用程序来接受输入、将该输入保存到文件并启动系统命令?

所需输入:

open -a MyApp.app --args "hello world"

期望的输出:

  • 文件/tmp/test.txt 已创建,现在包含文本hello world
  • 通过运行/usr/bin/php -v 来检查php 版本,然后将输出附加到/tmp/test.txt(只是想调用一些系统命令)

我知道这种事情很容易做到,只需 1-2 行 bash 脚本,但我真的很想看看我是否可以在 Cocoa 应用程序中实现这一点。我提前道歉,因为我意识到这是一个非常菜鸟的问题 - 只是试图以一种熟悉的方式开始。

【问题讨论】:

    标签: xcode macos cocoa osx-snow-leopard osx-lion


    【解决方案1】:

    如果您正在编写一个没有 UI 的纯输入/输出类型的应用程序,只需使用 C/C++/Objective-C(无论您喜欢哪个)编写一个直接的 Unix 风格的应用程序。您的程序的参数将显示在传递给您的 main 函数的 argcargv 参数中:

    int main(int argc, char **argv)
    {
        // argc is the total number of arguments (including the program name)
        // argv[0] is the first argument (the program name)
        // argv[1] is the second argument (first real argument)
        // ...
        // argv[argc-1] is the last argument
    }
    

    如果您确实有一个真实的 UI,通常 main 函数由 Xcode 自动生成并放置在一个名为 main.m 的文件中——它是一个调用 NSApplicationMain 的存根函数,其周围有一个自动释放池。您可以修改它以保存 argcargv 和/或在此处处理它们。

    【讨论】:

    • 太棒了!得到它的工作!还有更多问题:如何调用系统命令,如何执行std::cout << argv[*]; 之类的操作来一次回显所有参数?
    • @cwd:请针对这些问题提出单独的问题,但简短的答案是 system(3)ostream_iterator
    【解决方案2】:

    如果你想处理命令行参数并拥有一个 GUI,你肯定会想看看NSProcessInfo。除此之外,它还有一个名为 arguments 的方法,该方法将命令行参数作为 NSArray 返回。

    它还可以通过environment 方法为您提供NSDictionary 的环境变量,这也非常有用。

    编辑:我忘了说,如果你想将字符串的内容保存到文件中,NSString 已经有方法了!查看writeToFile:atomically:encoding:error: 的文档。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多