Sql 将来自两个不同PowerShell脚本的代码组合到一个脚本中

Sql 将来自两个不同PowerShell脚本的代码组合到一个脚本中,sql,sql-server-2008,powershell,Sql,Sql Server 2008,Powershell,我这里有一个脚本: SQLPS $ppath = Read-Host "Please enter the package database folder path" $client = Read-Host "Enter Client name" $date = Get-Date -Format "yymmdd" $sqlsrvname = Read-Host "Please enter the sql server name" $deploytype = Read-Host "Is ther

我这里有一个脚本:

SQLPS

$ppath = Read-Host "Please enter the package database folder path" 
$client = Read-Host "Enter Client name"
$date = Get-Date -Format "yymmdd"
$sqlsrvname = Read-Host "Please enter the sql server name"
$deploytype = Read-Host "Is there a server instance? (1) Yes (2) No" 

switch($deploytype){

 1 {$Instance = Read-Host "Please Enter instance name" 
 cd -Path $ppath
 .\sqlpatchremote.ps1 -DBServer $sqlsrvname –dbinstance $Instance –client $client –mainline HTFS –datefolder $date –targetenv $sqlsrvname} 

 2 {cd -Path $ppath
 .\sqlpatchremote.ps1 –dbserver $sqlsrvname –client $client –mainline HTFS –datefolder $date –targetenv $sqlsrvname }

 default {"Invalid Selection"}

}
它创建调用另一个脚本来创建SQL数据库的输入。我现在必须将这两个脚本合并成一个脚本。有没有一种简单的方法可以做到这一点,这样我就可以接受这个脚本通常生成的输入并启动另一个脚本

另一个脚本的开头如下所示:

  param
(
    [String] $PatchVersion = "RemoteVersion",
    [String] $DBNameList   = "alldatabases",
    [String] $Client       = "noclient",
    [String] $DBServer     = "localhost",
    [String] $DBInstance   = "",
    [String] $TargetEnv    = $(throw, "Please specify a target environment"),
    [String] $MainLine     = $(throw, "Please specify a mainline"),
    [String] $DateFolder   = $(throw, "Please specify a date folder")
)
这是我的脚本生成的输出,通常会启动第二个脚本:
\sqlpatchremote.ps1-DBServer$sqlsrvname–dbinstance$Instance–client$client–mainline HTFS–datefolder$date–targetenv$sqlsrvname


因此,我想我不确定应该在哪里插入脚本的输出,以便从同一脚本中启动另一个脚本。我主要希望它们像单独的脚本一样运行,即使它们在同一个脚本中。或者把它们混合在一起,我想这会更复杂。此外,我需要它与Windows Server 2008兼容,因此我无法使用更新的PowerShell命令。不幸的是,我们的许多客户端都停留在过去,仍然使用Windows Server 2008。

在调用函数之前,您可以将“其他”脚本的内容包装在函数中,并将您的
Read Host
语句放在末尾:

CombinedScript.ps1
尽管我必须说,我认为这种方法是一种你想要避免的反模式

您可以将“other”脚本的内容包装到函数中,并在调用函数之前将
Read Host
语句放在末尾:

CombinedScript.ps1

尽管我必须说,我认为这种方法是一种你想要避免的反模式

为什么呢?大量的
Read-Host
语句背后的想法是什么,为什么您的用户不能只使用参数名和制表符完成?我是这方面的用户,我喜欢使用
Read-Host
,因为我喜欢拼出脚本的所有部分,以使其简洁易懂。另外,我的老板希望我让用户手动输入路径,这就是为什么他们会在那里。我有点强迫症当涉及到脚本时,我喜欢它以某种方式出现,拼写出我的命令并使其用户友好只是我的偏好。我的老板也希望我将这些脚本合并成1。我以前很高兴单独运行它们。另外,
读取主机
是必要的,因为这些信息总是不同的。Windows Server 2008和SP1可以让您的服务器升级到PowerShell v3.0。很多新的功能也随之而来。如果你能让你的客户安装它,那就值得一试。遗憾的是,客户不会这么做=(我们几乎只与金融客户合作,因此他们对任何事情都非常紧张。但是为什么?大量的
读取主机
语句背后的想法是什么,为什么您的用户不能只使用参数名和制表符完成?我是这方面的用户,我喜欢使用
读取主机
,因为我喜欢详细说明所有内容。)我的脚本的一部分是为了让它变得简洁易懂。另外,我的老板希望我让用户手动输入路径,这就是为什么他们会在那里。我有点强迫症,当涉及到脚本时,我喜欢它看起来有一定的方式,拼写我的命令并使其对用户友好只是我的偏好。我的老板也是希望我结合的人将这些脚本转换为1。我以前很高兴单独运行它们。另外,
读取主机
是必要的,因为这些信息总是不同的。带有SP1的Windows Server 2008可以让您的服务器升级到PowerShell v3.0。这带来了许多新功能。如果您可以让客户端安装它,那么值得一试。遗憾的是,客户端我不会那样做=(我们几乎只与金融客户打交道,所以他们对任何事情都非常紧张。这个脚本非常长,这只是我手动输入我制作的程序的一小部分。你确定这样移动东西不会破坏一切吗?我很抱歉我会试试看。我的问题是我想我不完全理解
参数在这个场景中的作用,这就是为什么我不太知道如何插入它。我会试试你说的,然后再回复你。它可能会破坏东西,因为参数集在脚本之外不再可用(这就是为什么我建议不要做你想做的事情)。所以如果你有其他人(脚本或人员)这取决于调用
\sqlpatchremote.ps1-DBServer mydb01
或类似功能的能力,这将不再有效。我的建议是将它们分开,这样做可以不使用两个单独的脚本?或者我只需要使用两个单独的脚本?lolI尝试了您所说的,并且成功了!它没有破坏一切!我将此标记为answer一旦我在真实环境中测试了它。我得到了它,
函数
基本上将代码放入一个变量中。这基本上就是我试图找到的。谢谢!不,它不起作用,它要求我指定一个web服务器。在那之前没有得到一个错误。这意味着不知何故,我通常键入的手动输入与此关联?即使我永远不必指定web服务器…这个脚本非常长,这只是我手动输入程序的一小部分。你确定这样移动东西不会破坏一切吗?我是说,我会试试。我的问题是,我想我不完全理解你
param
在这种情况下起作用,这就是为什么我不太知道如何插入它。我会试试你说的,然后再给你回复。它可能会破坏东西,因为参数集在脚本之外不再可用(这就是为什么我建议不要做你正在尝试做的事情)。所以如果你有其他人(脚本或人员)这取决于调用
\sqlpatchremote.ps1-DBServer mydb01
或类似功能的能力,这将不再有效
function Patch-RemoteSQL
{
    param
    (
        [String] $WebServer    = $(throw, "Please specify a Web server"),
        [String] $AppServer    = $(throw, "Please specify an App server"),
        [String] $DBServer     = $(throw, "Please specify a database server"),
        [String] $DBInstance   = "", #$(throw, "Please specify a database instance"),
        [String] $PatchVersion = "RemoteVersion"    
    )

    # Script Body in here
}

$client = Read-Host "Enter Client name"
$date = Get-Date -Format "yymmdd"
$sqlsrvname = Read-Host "Please enter the sql server name"
$deploytype = Read-Host "Is there a server instance? (1) Yes (2) No" 

switch($deploytype){

  1 {
    $Instance = Read-Host "Please Enter instance name" 
    Patch-RemoteSQL -DBServer $sqlsrvname –dbinstance $Instance –client $client –mainline HTFS –datefolder $date –targetenv $sqlsrvname
  }

  2 { 
    Patch-RemoteSQL –dbserver $sqlsrvname –client $client –mainline HTFS –datefolder $date –targetenv $sqlsrvname 
  }

  default {"Invalid Selection"}
}