“Invoke-Sqlcmd”无法识别为cmdlet,函数,脚本文件或可运行程序的名称

时间:2014-02-27 13:48:53

标签: c# windows batch-file powershell cmd

我想自动创建数据库。有三个要创建的数据库,我为每个数据库创建都有一个不同的powershell脚本。现在,在这个powershell脚本上,我还有一个图层批处理文件,这个批处理文件将调用powershell脚本。 说@“D:\ Parent \ Sub \ InstallDB1.cmd”;会像另外两个明智地调用@"D:\Parent\Powerscript1.ps1。 现在我有单个批处理文件说FinalDB.cmd.批处理文件FinalDB.cmd.将一个接一个地调用powershell脚本来调用三个命令脚本。

So now the calls in `FinalDB.cmd`
             call  InstallDB1.cmd  //comment: which internally calls Powerscript1.ps1.
             call  InstallDB2.cmd  //comment: which internally calls Powerscript2.ps1.
             call  InstallDB3.cmd  //comment: which internally calls Powerscript3.ps1.

由于我的应用程序设计,我无法避免上述情况。

如果我通过双击手动运行Final脚本,则数据库创建过程不会发生任何失败。但是当我使用以下C#代码调用FinalDB.cmd时失败。

 public static RunCommand RunCommandInDir(string workingDirectory, string arguments, string executablePath)
    {
        RunCommand runResults = new RunCommand
        {
            Output = new StringBuilder(),
            Error = new StringBuilder(),
            RunException = null
        };
        try
        {
            using (Process proc = new Process())
            {
                proc.StartInfo.FileName = executablePath;
                proc.StartInfo.Arguments = arguments;
                proc.StartInfo.WorkingDirectory = workingDirectory;
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.CreateNoWindow = false;
                proc.OutputDataReceived +=
                    (o, e) => runResults.Output.Append(e.Data).Append(Environment.NewLine);
                proc.ErrorDataReceived +=
                    (o, e) => runResults.Error.Append(e.Data).Append(Environment.NewLine);
                proc.Start();
                proc.BeginOutputReadLine();
                proc.BeginErrorReadLine();
                proc.WaitForExit();
                runResults.ExitCode = proc.ExitCode;
            }

        }
        catch (Exception e)
        {
            runResults.RunException = e;
        }
        return runResults;
    }

当我使用上面的代码调用时,我收到错误“Invoke-Sqlcmd'不被识别为cmdlet,函数,脚本文件或可操作程序的名称”,这在我运行FinalDB时没有发生。手动cmd文件。

我已经完成了我的谷歌搜索,似乎没有任何建议的方法正在发挥作用。

解决问题的任何帮助?为什么我使用C#代码时会出现错误。

感谢

3 个答案:

答案 0 :(得分:1)

Invoke-SQLCmd是由管理单元SqlServerCmdletSnapin100(在SQL Server 2012之前)或模块SQLPS(SQL Server 2012+)提供的cmdlet。在调用cmdlet之前,需要将一个或另一个加载到PowerShell中(例如,在脚本的开头)。

答案 1 :(得分:0)

这是我找到自己的解决方案:

似乎没有安装与sql server相关的一些组件,所以我按照以下步骤操作。

步骤1:

打开Visual Studio命令提示符:

如果您的计算机上安装了Visual Studio:在任务栏上,单击“开始”,单击“所有程序”,单击“Visual Studio”,然后单击

Visual Studio工具,然后单击“Visual Studio命令提示符”。

步骤2:

在我发现的c:驱动器中搜索dll文件Microsoft.SqlServer.Management.PSProvider.dll C:\ Program Files(x86)\ Microsoft SQL Server \ 100 \ Tools \ PowerShell \ Modules \ SQLPS

或者它可能处于不同的路径

复制以下dll并粘贴到visual studio命令窗口所指向的位置。这样你就可以运行

了 Visual Studio命令窗口中的

installUtil命令

Microsoft.SqlServer.Management.PSProvider.dll

Microsoft.SqlServer.Management.PSSnapins.dll

步骤3:

从Visual studio命令提示符

运行以下命令

installutil Microsoft.SqlServer.Management.PSProvider.dll

installutil Microsoft.SqlServer.Management.PSSnapins.dll

答案 2 :(得分:0)

在我的情况下,当我有一台新的开发机器时,我遇到了这个错误。突然,一个运行良好的PowerShell脚本开始失败。这是因为SQL Server 2008 R2的PowerShell Extensions没有安装在新机器上。

简单地说,您可以从此处下载并安装它。 http://www.microsoft.com/en-us/download/details.aspx?id=16978#PowerShell