【问题标题】:How to execute forever command remotely without using full path?如何在不使用完整路径的情况下远程执行永久命令?
【发布时间】:2016-03-08 18:12:13
【问题描述】:

我正在尝试使用 powershell 远程执行“forever”命令,但出现错误

'forever' 未被识别为内部或外部命令

这就是我正在做的事情。我有执行永久命令的节点 js 脚本“MyNodeScript.js”。该脚本位于 WebServer "MyWebServer1" 上。 Node.Js 和 Forever 全局安装在 MyWebServer1 上。

    var exec = require('child_process').exec;
    var _ = require('underscore');
    var winston = require('winston');
    var async = require('async');

    var mycommand = 'forever -p ./logs --sourceDir ../wf_manager --workingDir ../wf_manager start -a --uid "ServiceApp" ServiceApp.js'

    function start(callback) {  
        async.waterfall([
            function (cb) {
                executeCommand(mycommand, false, cb);
            }
        ], function done(err) {
            if (err) {
                winston.error('failed to start all instances by forever:' + err);
            } else {
                winston.info('successfully started all instances by forever');
            }
            callback();
        });
    }

    function executeCommand(command, skip, callback) {
        async.waterfall([
            function (cb) {
                exec(command, cb);
            }
        ], function done(err) {
            if (err) {
                if (skip) {
                    // skip the error
                    callback(null);
                } else {
                    callback(err);
                }
            } else {
                callback(null);
            }
        });
    }

    module.exports = {
        executeCommand: executeCommand,    
        start: start
    }

    start(function(){});

在同一文件夹下的同一 MyWebServer1 上,我有一个调用此节点脚本的 powershell 脚本“MyPowerShellScript.ps1”。 powershell脚本只有一行

node D:\myfolder\maintenance\MyNodeScript.js

我可以在 MyWebServer1 上本地运行这个 powershell 脚本,它工作正常。但是当我尝试如下执行这个powershell脚本时从远程机器

 invoke-command -computername MyWebServer1 -filepath \\MyWebServer1\MyFolder\maintenance\MyPowerShellScript.ps1

我遇到了错误

错误:无法永远启动所有实例:错误:命令失败: C:\Windows\system32\cmd.exe /s /c "永远-p ./logs --sourceDir ../wf_manager --workingDir ../wf_manager start -a --uid "ServiceApp" ServiceApp.js"
+ CategoryInfo : NotSpecified: (error: failed t...ServiceApp.js":String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName : MyWebServer1
'forever' 不被识别为内部或外部命令、可运行程序或 批处理文件。

请注意,如果我更新“MyNodeScript.js”并为永久命令使用完整物理路径,我可以远程执行脚本而不会出现任何错误

 var mycommand = 'C:\\Users\\admin\\AppData\\Roaming\\npm\\forever -p ./logs --sourceDir ../wf_manager --workingDir ../wf_manager start -a --uid "ServiceApp" ServiceApp.js'

但是我想使用 just forever 命令。该路径已作为环境变量添加到 MyWebServer1

【问题讨论】:

    标签: node.js powershell forever


    【解决方案1】:

    尝试像这样调用 ps1 文件:

    Invoke-Command -Scriptblock {powershell.exe -command {d:\blah\MyPowershellscript.ps1 } }
    

    通过 -filepath 指定应该远程执行的本地脚本文件。由于您的脚本存在于目标系统上,因此您可以省略它。

    【讨论】:

    • 我收到错误“powershell.exe:术语“节点”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,或者如果路径已包含,请验证路径是否正确,然后重试。”这是我尝试过的命令“Invoke-Command -Scriptblock {powershell.exe -command {\MyWebServer1\MyFolder\maintenance\MyPowerShellScript.ps1 } }”
    • 注意 MyPowerShellScript.ps1 位于远程机器上(即 MyWebServer1 )和 \\MyWebServer1\MyFolder\ i 共享文件夹,因此其他机器可以访问所有文件
    • 在您上面的建议中,它如何知道 MyPowershellscript.ps1 存在哪台远程机器?我们不必添加 -ComputerName 开关
    • 当您将invoke-Command-scriptblock {CODE} 一起使用时,如果您在远程计算机上本地连接,则您正在执行代码。当然,您仍然需要-computername 参数来指定运行代码的机器,抱歉在上一篇文章中没有提及。我现在看到您的node is not recognized 错误的问题是,通过该字符串的调用不起作用。我对节点一无所知,但是否有可执行文件,您可以调用它来执行 mynodescript.js?像 \programfiles\node\node.exe -script MyNodeScript.js?
    猜你喜欢
    • 2014-12-06
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多