【问题标题】:asp.net running scriptsasp.net 运行脚本
【发布时间】:2012-07-09 14:29:49
【问题描述】:

我有以下方法:

 protected void RunWSFScript()
    {
        try
        {
            System.Diagnostics.Process scriptProc = new System.Diagnostics.Process();
            scriptProc.StartInfo.FileName = @"cscript";
            scriptProc.StartInfo.Arguments = "\\\\server\\folder\\script.wsf \\\\server\\folder\\"
                + file + ".xml";
            scriptProc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //prevent console window from popping up 
            scriptProc.Start();
            scriptProc.WaitForExit();
            scriptProc.Close();

            string message = @"Please verify output.";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("<script type = 'text/javascript'>");
            sb.Append("window.onload=function(){");
            sb.Append("alert('");
            sb.Append(message);
            sb.Append("')};");
            sb.Append("</script>");
            ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString());
        }
        catch
        {
            string message = "An error has occured. Please try again.";
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append("<script type = 'text/javascript'>");
            sb.Append("window.onload=function(){");
            sb.Append("alert('");
            sb.Append(message);
            sb.Append("')};");
            sb.Append("</script>");
            ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", sb.ToString());
        }
    }

我遇到的问题是,当我在本地调试时运行该方法时,脚本可以正确执行,但是在我将站点放在 iis 服务器上之后,它不再执行并且我也没有收到任何错误。

可能是什么问题?

【问题讨论】:

    标签: c# asp.net wsh


    【解决方案1】:

    很可能是权限问题 - 服务帐户可能无法写入您指定的目录,或者它没有读取脚本文件本身的权限。

    但是,您更大的问题是您的错误处理不够稳健。具体来说,如果脚本导致错误,您将永远不会检测到(正如您所发现的那样!!)。

    您需要做些什么来解决这个问题取决于您的脚本如何报告它的错误。您通常需要重定向StandardOutputStandardError,并检查exit code

    这里是一种可能的实现的粗略概述。您需要根据您的脚本和环境对其进行定制。

    System.Diagnostics.Process scriptProc = new System.Diagnostics.Process();
    scriptProc.StartInfo.FileName = @"cscript";
    scriptProc.StartInfo.RedirectStandardOutput = true;
    scriptProc.StartInfo.RedirectStandardError = true;
    scriptProc.StartInfo.Arguments = @"\\server\some\folder\script.wsf";
    scriptProc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
    
    scriptProc.Start();
    
    // Read out the output and error streams *before* waiting for exit.
    string output = p.StandardOutput.ReadToEnd();
    string error = p.StandardError.ReadToEnd();
    
    // Specify a timeout to ensure it eventually completes - this is 
    // unattended remember!!
    scriptProc.WaitForExit(10000); 
    scriptProc.Close();
    
    // Check the exit code. The actual value to check here will depend on
    // what your script might return.
    if (script.ExitCode != 0)
    {
        throw new Exception(
            "Oh noes! Exit code was " + script.ExitCode + ". " +
            "Error is " + error + ". " + 
            "Output is " + output);
    }
    

    【讨论】:

    • 谢谢。是的,我知道错误处理还远未完成,我只是想让脚本先执行,然后再继续执行。基本上每个人都通过 NTLM 登录网站,每个人都可以完全控制文件夹/文件,所以我还应该检查什么?
    • 已经尝试了上述方法,当它到达string output = scriptProc.StandardOutput.ReadToEnd();string error = scriptProc.StandardError.ReadToEnd();这一行时,它一直在崩溃
    • 不知道您面临的错误是您在黑暗中拍摄。这就是为什么您需要在尝试修复错误之前修复错误处理。 ReadToEnd() 调用会引发哪些错误?
    • 如果我单步执行它并将鼠标悬停在不同的 Process 方法上,我可以在大多数方法上看到 System.InvalidOperationException
    猜你喜欢
    • 2012-07-13
    • 2010-12-26
    • 2015-04-15
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多