C# - 命令从命令提示符而不是从服务运行
C# - Command runs from command prompt but not from service
我在 Windows Server 2012 R2 上有一个 C#(ASP 核心)服务 运行ning,它通过命令行执行 Newman 测试套件。当直接在命令提示符中 运行 时,服务执行的命令完美运行,但在服务中不起作用。雪上加霜的是,我的开发机器 (Windows 10 Pro) 上的本地服务 运行ning 确实可以使用相同的命令。我确定我在所有实例中都使用相同的命令,因为该服务将 CLI 的 StandardOutput 输出到一个文件中,我将其内容直接粘贴到命令提示符中。
编辑:该服务托管在 IIS 上。
我收到的错误:
module.js:471
throw err;
^
Error: Cannot find module 'C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:393:7)
at startup (bootstrap_node.js:150:9)
at bootstrap_node.js:508:3
我正在 运行ning 的命令(所有路径在每个实例中都相同):
"C:\Program Files\NodeJS\node.exe" C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js run https://api.getpostman.com/collections/MyCollectionURI -r cli,junit --reporter-junit-export D:\TestHarnessServiceLogs\XML\{FilenameFromDatetime}.xml -e https://api.getpostman.com/environments/MyEnvironmentURI --disable-unicode
C# 构建和 运行 命令:
//Build over multiple lines to make it vaguely readable, then string replace away the newlines so it runs as one command
string runTestCmd = $@"{_nodeExecutablePath}
{_newmanDotJsFile} run
{collectionPath}
-r cli,junit
--reporter-junit-export {_junitReportPathWithFilename}
-e {environmentPath}
--disable-unicode"
.Replace(Environment.NewLine, " ")
.Replace("\t", "");
File.WriteAllText(@"D:\TestHarnessServiceLogs\Command.txt", runTestCmd);
//Launch hidden CLI
using (Process p = new Process())
{
p.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Arguments = _nodeVarsBatPath;
p.Start();
//Execute commands
using (StreamWriter sw = p.StandardInput)
{
if (sw.BaseStream.CanWrite)
{
sw.WriteLine(runTestCmd);
}
}
//Parse the various outputs
output = p.StandardOutput.ReadToEnd();
error = p.StandardError.ReadToEnd();
exitCode = p.ExitCode.ToString(); //Always returns 0, think this is because it evaluates success of creating the process, not what happens inside it
File.WriteAllText(@"D:\TestHarnessServiceLogs\output.txt", output);
File.WriteAllText(@"D:\TestHarnessServiceLogs\error.txt", error);
File.WriteAllText(@"D:\TestHarnessServiceLogs\exitCode.txt", exitCode);
}
Newman 在这两个环境中全局安装,以及下面一些相关的 AppSettings(为简洁起见略微修改了名称):
"_newmanDotJsFile": "C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js",
"_nodeVarsBatPath": "\"C:\Program Files\NodeJS\nodevars.bat\"",
"_nodeExecutablePath": "\"C:\Program Files\NodeJS\node.exe\"",
相同的命令如何在 CLI 中找到 newman 模块并且 运行 正常,但在服务中却找不到?
EDIT:服务 运行ning 下的用户无法访问文件,完成后我现在得到以下(显然是基于权限的)错误相反,我想我知道这是怎么回事...:[=15=]
fs.js:994
binding.lstat(pathModule._makeLong(path), statValues);
^
Error: EPERM: operation not permitted, lstat 'C:\Users\MyName'
at Error (native)
at Object.fs.lstatSync (fs.js:994:11)
at Object.realpathSync (fs.js:1676:21)
at toRealPath (module.js:133:13)
at Function.Module._findPath (module.js:181:22)
at Function.Module._resolveFilename (module.js:467:25)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:393:7)
at startup (bootstrap_node.js:150:9)
编辑 2:为 运行 下的服务创建了一个新用户,为该用户安装了 newman 并赋予了它正确的权限(看起来并不聪明授予网络服务访问我的个人资料的权限)- 现在一切正常!
听起来该服务不是 运行 您的用户?也许这就是它在您指定的位置找不到文件的原因。
我在 Windows Server 2012 R2 上有一个 C#(ASP 核心)服务 运行ning,它通过命令行执行 Newman 测试套件。当直接在命令提示符中 运行 时,服务执行的命令完美运行,但在服务中不起作用。雪上加霜的是,我的开发机器 (Windows 10 Pro) 上的本地服务 运行ning 确实可以使用相同的命令。我确定我在所有实例中都使用相同的命令,因为该服务将 CLI 的 StandardOutput 输出到一个文件中,我将其内容直接粘贴到命令提示符中。
编辑:该服务托管在 IIS 上。
我收到的错误:
module.js:471
throw err;
^
Error: Cannot find module 'C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:393:7)
at startup (bootstrap_node.js:150:9)
at bootstrap_node.js:508:3
我正在 运行ning 的命令(所有路径在每个实例中都相同):
"C:\Program Files\NodeJS\node.exe" C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js run https://api.getpostman.com/collections/MyCollectionURI -r cli,junit --reporter-junit-export D:\TestHarnessServiceLogs\XML\{FilenameFromDatetime}.xml -e https://api.getpostman.com/environments/MyEnvironmentURI --disable-unicode
C# 构建和 运行 命令:
//Build over multiple lines to make it vaguely readable, then string replace away the newlines so it runs as one command
string runTestCmd = $@"{_nodeExecutablePath}
{_newmanDotJsFile} run
{collectionPath}
-r cli,junit
--reporter-junit-export {_junitReportPathWithFilename}
-e {environmentPath}
--disable-unicode"
.Replace(Environment.NewLine, " ")
.Replace("\t", "");
File.WriteAllText(@"D:\TestHarnessServiceLogs\Command.txt", runTestCmd);
//Launch hidden CLI
using (Process p = new Process())
{
p.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.Arguments = _nodeVarsBatPath;
p.Start();
//Execute commands
using (StreamWriter sw = p.StandardInput)
{
if (sw.BaseStream.CanWrite)
{
sw.WriteLine(runTestCmd);
}
}
//Parse the various outputs
output = p.StandardOutput.ReadToEnd();
error = p.StandardError.ReadToEnd();
exitCode = p.ExitCode.ToString(); //Always returns 0, think this is because it evaluates success of creating the process, not what happens inside it
File.WriteAllText(@"D:\TestHarnessServiceLogs\output.txt", output);
File.WriteAllText(@"D:\TestHarnessServiceLogs\error.txt", error);
File.WriteAllText(@"D:\TestHarnessServiceLogs\exitCode.txt", exitCode);
}
Newman 在这两个环境中全局安装,以及下面一些相关的 AppSettings(为简洁起见略微修改了名称):
"_newmanDotJsFile": "C:\Users\MyName\AppData\Roaming\npm\node_modules\newman\bin\newman.js",
"_nodeVarsBatPath": "\"C:\Program Files\NodeJS\nodevars.bat\"",
"_nodeExecutablePath": "\"C:\Program Files\NodeJS\node.exe\"",
相同的命令如何在 CLI 中找到 newman 模块并且 运行 正常,但在服务中却找不到?
EDIT:服务 运行ning 下的用户无法访问文件,完成后我现在得到以下(显然是基于权限的)错误相反,我想我知道这是怎么回事...:[=15=]
fs.js:994
binding.lstat(pathModule._makeLong(path), statValues);
^
Error: EPERM: operation not permitted, lstat 'C:\Users\MyName'
at Error (native)
at Object.fs.lstatSync (fs.js:994:11)
at Object.realpathSync (fs.js:1676:21)
at toRealPath (module.js:133:13)
at Function.Module._findPath (module.js:181:22)
at Function.Module._resolveFilename (module.js:467:25)
at Function.Module._load (module.js:417:25)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:393:7)
at startup (bootstrap_node.js:150:9)
编辑 2:为 运行 下的服务创建了一个新用户,为该用户安装了 newman 并赋予了它正确的权限(看起来并不聪明授予网络服务访问我的个人资料的权限)- 现在一切正常!
听起来该服务不是 运行 您的用户?也许这就是它在您指定的位置找不到文件的原因。