1

私が使用しなければならないアーキテクチャのために、多くの非常に優れたソフトウェア設計ルールに違反する可能性があります。Webブラウザで実行されているJavaScriptコードから同じマシン上のWindowsバッチファイルにメッセージを送信する必要があります。オペレーティングシステムはWindowsVista以降です。使用されているブラウザは主にChromeとFirefoxです。jQueryはjavascriptでも使用されています。

ブラウザはインターネットに接続されており、それらは関係するサーバーであるため、メッセージをサーバーに中継してから、バッチファイルに中継することができます。現在、1分ごとに実行されるバッチファイルがあり、理論的にはサーバーにメッセージを照会できます。それ以外に良いアイデアはありません。

さらに、これは「クローズド」システムです。クライアントブラウザ、クライアントシステム、およびサーバーは、私の完全な制御下にあります。一般の人がブラウザでJavascriptを実行している状況ではありません。クライアントコンピュータは、メッセージを受信できるように操作できます。

このメッセージを送信する良い方法は何ですか?

4

4 に答える 4

5

1.ローカルHTTPサーバー

JavaScriptから、コマンドを含むAJAXリクエストをローカルHTTPサーバーに送信します。最新のブラウザはすべて、クロスドメインAJAXをサポートしています。サーバーは、コマンドをパラメーターとしてバッチファイルに渡すことができます。サーバーがネットワークからアクセスできないことを確認してください

このアプローチの利点は、コマンドからJavaScriptに応答を送り返すことができることです。

  • JavaScript:

    $.post('http://localhost:8080', {command: '...'});
    
  • Bottle.pyサーバー:

    #!/usr/bin/python
    from bottle import run, route, request, response
    import subprocess
    
    @route('/', method='POST')
    def index():
        command = request.POST['command']
        result = subprocess.check_output(['batchfile.bat', command], shell=True)
    
        response.set_header('Access-Control-Allow-Origin', '*')
        return result
    
    run(host='localhost', port=8080, reloader=True)
    
  • またはApache/nginxでのPHP:

    $result = shell_exec("batchfile.bat " . escapeshellarg($_POST['command']));
    
  • またはPHPのデーモン

    さらに楽しくするために、完全なシェルアクセスがあり、コマンドを非同期で実行できるため、ブロックせずにデスクトップアプリケーションを起動できます。Apacheは必要ありません。

    始める:php.exe -f batrunner_daemon.php

    使用する:$.get('http://localhost:33333/ping -h', function(response) { console.log(response) });

    $host = '127.0.0.1';
    $port = 33333;
    $async = false; // enable to run commands without blocking the server (useful for GUI applications)
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $open = @socket_bind($socket, $host, $port);
    if ($open) {
        echo "\nListening on http://{$host}:{$port}";
    } else {
        echo "\nError. Port {$port} in use";
        exit;
    }
    socket_listen($socket, 1);
    
    while(1) {
        $connection = socket_accept($socket);
        $http_request = socket_read($connection, 32768);
        $command = rawurldecode(substr(strstr($http_request, "\r\n", true), 5, -9));
    
        echo "\nRunning: {$command}...";
    
        if ($async) {
            $response = pclose(popen('start "" /B ' . $command, 'r')) ? 'error' : 'success';
        } else {
            $response = shell_exec($command);
        }
    
        echo " Done.";
    
        socket_write($connection, implode("\r\n", array(
            'HTTP/1.1 200 OK',
            'Content-Type: text/plain; charset=UTF-8',
            'Connection: close',
            'Content-Length: ' . strlen($response),
            'Access-Control-Allow-Origin: *',
            "\r\n" . $response
        )));
        socket_close($connection);
    }
    

    簡単にするために、適切なエラー処理がなく、どのサイトでもコンピュータ上で何かを実行でき、自己責任で使用できます。

    Access-Control-Allow-Origin: *これは、どのサイトもシェルから応答を受信できることを意味します。このヘッダーがなくても、明らかにコマンドを実行できますが、応答を受信できません。


2.URIスキーム

@mamdroodのアイデアを試してみたところ、HTTPサーバーよりもはるかに簡単で、非常にシンプルであることがわかりました。

  • HTMLから、次のようにバッチファイルを呼び出すことができます。

    <a href="batrunner://somecommand">Wipe all files</a>
    
  • そして、のバッチファイルC:\mybatfile.batがコマンドを解析する方法は次のとおりです。

    @echo off
    SET command=%1
    SET command=%command:batrunner://=%
    echo %command%
    

    私はバッチファイルにあまり精通しておらず、コマンド名の解析コードは脆弱である可能性があります。あなたがもっとよく知っているなら、この答えを更新してください。

  • バッチファイルをbatrunner://プロトコルに関連付けるには、バッチファイルを作成batrunner.regして1回実行します。スクリプトの代わりC:\\mybatfile.batに、パスをエスケープする必要があります。

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\batrunner]
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOT\batrunner\shell]
    
    [HKEY_CLASSES_ROOT\batrunner\shell\open]
    
    [HKEY_CLASSES_ROOT\batrunner\shell\open\command]
    @="C:\\mybatfile.bat %1"
    
于 2012-04-12T15:01:22.187 に答える
2

BitTorrentマグネットやSkypecalltoのように、小さなWindowsアプリケーションを作成し、URIスキームを使用して情報を接続することもできます。

于 2012-04-12T15:02:58.193 に答える
1

私の知る限り、ブラウザで実行されているJavaScriptには、ローカルファイルシステムと通信する方法がありません。Web上のページがシステム上のファイルを読み書きできるとしたら、それは誰にとっても非常に悪いことです。:)

バッチファイルを生成する必要がある場合は、サーバーからファイル出力し、ユーザーにローカルでダウンロードして実行させることができますが、JavaScriptはここでは役に立ちません。

于 2012-04-12T14:46:47.147 に答える
1

javascriptを使用してローカルバッチファイルをトリガーする「すぐに使える」方法を見つけるつもりはないと思います。私がこれを投稿し終えるまでにプラグインアプローチが提唱されていると確信していますが、それには多くの開発オーバーヘッドが伴います。Chromeには、-enable-local-file-accessスイッチを備えたいくつかの凝ったものもありますが、それに付随する多くの警告もあります。(探索するオプションとしてそれらをそこに投げるだけです)。

.batファイルをボックスにダウンロードしてそこから実行するリンクを提供することを検討してください。

編集 私はあまりにも早く話したかもしれません。IEを使用している場合は、js/ActiveXソリューションで必要な処理を実行できるようです。ここから撮影。

于 2012-04-12T14:59:28.237 に答える