問題タブ [nstask]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - コマンドラインから圧縮 - パス要素をトリミングする方法
NSTask を使用してアプリ内から zip コマンドを実行しています。圧縮するファイル/フォルダーを指すいくつかのパスが引数として渡されます。
問題は、-j オプションを指定しないと、最終的な zip が zip 内の不条理なファイルパスになってしまうことです (「/private/var/folders/A5/A5CusLQaEo4mop-reb-SYE+++TI/-Tmp-/9101A216-」など)。 5A6A-4CD6-A477-E4B86E007476-51228-00014BCB9514323F/myfile.rtf")。ただし、-j オプションを追加すると、ネストされたフォルダー内のどこかにファイルがある場合、常に名前の競合が発生します。
NSTask を実行する前にパスを設定してみました:
zip のドキュメントが真実を語っていることを期待して:
デフォルトでは、zip はフル パス (現在のディレクトリからの相対パス)を格納します。
しかし、これは期待どおりに機能しませんでした。-j と -p と -r の設定を調整すると、さまざまな組み合わせで上記の問題が発生します。
質問:
次のような一連のディレクトリを取得するにはどうすればよいですか
- /some/long/path/sub1/file1.txt
- /some/long/path/sub2/file1.txt
それらをzipに圧縮し、その内容は次のとおりです
- /sub1/file1.txt
- /sub2/file1.txt
zip の微妙な点についてアドバイスをいただきありがとうございます。
- - -編集
追加するのを忘れていたもう1つのことは、渡される元のディレクトリが「パス」であるため、望ましい結果は期待される結果でもあるということです。
stdout - PHPCLIはstderrを使用してエラーを出力しません
MacOSのNSTaskを介してPHPCLIを実行していますが、この質問はCLI自体に関するものです。
パイプを聞いていstderr
ますが、実行しようとしているファイルに関係なく、何も出力されません。
- ファイルタイプがプレーンテキストでない場合は、に
stdout
設定し?
ます。 - ファイルがエラーのあるphpスクリプトである場合でも、エラーメッセージはに出力され
stdout
ます。
エラーを処理するためのインタプリタへの切り替えはありstderr
ますか?解析以外のエラーを検出するオプションはありますstdout
か?
objective-c - 連続ストリームとしてバッファリングされていない NSTextField への NSTask 文字出力
私が達成したいのは、コマンド ライン (CL) タスク (ラップされた NSTask) を開始し、文字のストリームとしてリアルタイムで、UI の NSTextField ラベルを介して文字出力をパイプ (NSPipe) することです。テキストフィールドの目的は、出力をキャプチャしたり、読み取れるようにしたりすることではありません。一部はUIの装飾として、一部は一種の進行状況インジケーターとして表示するだけです。CL タスクが作業を行っているときに、文字列が (高速で) 流れているのをユーザーに見てもらいたいのです。
CL タスクを NSTask でラップし、[task setStandardOutput:outputPipe] を設定してその出力を取得し、その出力から NSFileHandle を読み取る方法を知っています。そして、NSFileHandle読み取りメソッドの1つを使用し、出力を同期的にチャンクに切り刻み、それらのチャンクをテキストフィールドに1つずつ表示するという「難しい」方法を実行する方法を知っていると思います。しかし、生のASCII文字をstdoutからテキストフィールドにリアルタイムで爆破する、私が考えていなかった軽量の方法があるかもしれないと思っています。
誰にもアイデアがありますか?
編集: @Peter Hosey の回答に基づいた実用的なコードを次に示します。それは私がやりたいことをやっていますが、ピーターのコンセプトを完全に理解したのか、ここで何かおかしなことをしているのかわからないので、お気軽にコメントしてください. 再びピーターに感謝します!
このコードに関する注意事項:
1) init の scheduleTimerWithTimeInterval を .001 から .005 に変更すると、テキスト スクロール効果の視覚的な範囲が興味深いものになります。
2) 私が使用しているラベルは、インターフェイス ビルダーの UI で作成された単純なテキスト ラベルでした。私の目的のために、Peter の回答の 2 番目の部分を右揃えの属性付き文字列で行う必要はありませんでした。インターフェイスビルダーでテキストラベルの正当化を設定しただけです。
iphone - 配布していないアプリに iPhone で NSTask を使用できますか?
これについてはあまり情報を見つけることができませんでしたが、iPhone アプリで NSTask を使用できるといういくつかのヒントを見てきました。可能であれば、どうすればよいでしょうか?
iPhone をジェイルブレイクしたくありませんが、開発中のアプリは内部使用のみです。配布されないので、Apple が NSTask を使用するアプリを拒否してもかまいません。
更新: 先に進んで試してみたところ、ヘッダー ファイル NSTask.h をプロジェクトにコピーすることで、コードを正常にコンパイルできました。これまでのところ良い。しかし、コードを実行すると、うまくいきませんでした。タスクを作成し、その setLaunchPath メソッドを呼び出すことはできましたが、それを起動しようとすると、「起動パスにアクセスできません」というエラーが発生しました。ただし、起動しようとしているプロセスはソケットを介してコピーしたプログラムであり、ファイルの書き込みに使用したのと同じパスを使用しているため、起動パスは問題ないはずです。仕事。これは、ファイルを開いて書き込むためにその場所にアクセスできたとしても、iOS ファイル システムがファイルにアクセスして起動することを妨げていることを示唆していますか? それとも、どこかで別の間違いを犯している可能性が高いですか?
objective-c - バックグラウンドでNSTaskを実行する
NSTaskを使用してシェルスクリプトを実行していますが、問題は、シェルスクリプトがcontrol+cを押すまで実行され続けるスクリプトの1つであるということです。正常に起動しますが、私のMacアプリケーションはそれが終了するのを待つだけです。タスクをMacアプリケーションから切り離し、バックグラウンドで実行するようにするにはどうすればよいですか。
objective-c - NSTask を介して「パージ」コマンドを実行する方法は?
ターミナルで実行できる「パージ」コマンドの単なるラッパーである無料の Mac アプリを作成しています。私は Mac App Store にあふれているぼったくりにうんざりしていて、ただ人々を助けたいだけです。GUI は完成しましたが、コマンドを正常に実行する方法がわかりません。
を使用する必要があることはわかっていますNSTask
が、おそらく正しく行っていません。
どうすればこれを修正できますか?
objective-c - NSTaskでターミナルコマンドを実行します
プログラムでターミナルコマンドを実行したい。コマンドは次のようになります。
で動作しsystem()
ますが、使用すると動作しませんNSTask
。
正常に動作しますが
そうではありません。出力:
誰かアイデアはありますか?
macos - NSTask のリアルタイム出力
複数のコマンドを持つ PHP スクリプトがありsleep()
ます。を使用してアプリケーションで実行したいと思いますNSTask
。私のスクリプトは次のようになります。
通知を使用してタスクを非同期に実行できます。
私の出力は(もちろん2秒後):
私の質問は、印刷された直後にこれらの 3 つの単語を取得するにはどうすればよいですか?
cocoa - NSTask: プロセスの起動パスは存在しますか
このコードは、プロセスの標準出力を取得するために使用されます
/usr/bin/lspci
一部のシステムには存在しないため、この致命的なエラーが発生します
キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '起動パスにアクセスできません'
存在することを事前に確認し、lspci
存在しない場合はユーザーにエラーメッセージを表示する方法は?