批处理文件有一个错误,从Powershell脚本调用时不允许批处理文件完成

批处理文件有一个错误,从Powershell脚本调用时不允许批处理文件完成,powershell,Powershell,在下面的脚本中,我调用一个批处理文件来中断某些数据库之间的镜像。批处理文件有一个启动脚本的用户提示,但PS脚本正好经过它。当我直接从powershell控制台调用批处理文件时,它工作正常。在批处理文件完成之前,如何防止脚本通过调用命令块 $session = New-PSSession -computerName xssqlk02 -credential $cred Invoke-Command -Session $session -Scriptblock {c:\MSSQL\

在下面的脚本中,我调用一个批处理文件来中断某些数据库之间的镜像。批处理文件有一个启动脚本的用户提示,但PS脚本正好经过它。当我直接从powershell控制台调用批处理文件时,它工作正常。在批处理文件完成之前,如何防止脚本通过调用命令块

    $session = New-PSSession -computerName xssqlk02 -credential $cred

    Invoke-Command -Session $session -Scriptblock {c:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat xssqlk02 ossqlk02}

    Remove-PSSession $session
编辑:我只修剪了代码中有问题的部分。当这是从一个ps脚本运行时,我刚刚注意到(这是一个漫长的一天…)我得到了以下错误,并在该点通过用户提示运行

PS C:\Users\dans>C:\Tools\Scripts\test5.ps1 子目录或文件c:\MSSQL\DBMaintenance\Mirroring\Common已存在。 +CategoryInfo:NotSpecified:(子目录…已存在。:String)[],RemoteException +FullyQualifiedErrorId:NativeCommandError


无效的驱动器规格 删除xssqlk02和ossqlk02之间RCM数据库的镜像:是否继续?是否复制了0个文件

以下是我在本地计算机上直接从PS控制台运行批处理文件时的输出。
PS C:\Documents and Settings\DanS>C:\MSSQL\DBMaintenance\Mirroring\SERVER\u Remove\u Mirroring.bat xssqlk02 ossqlk02 删除xssqlk02和ossqlk02之间RCM数据库的镜像:是否继续?是/否

子目录或文件c:\MSSQL\DBMaintenance\Mirroring\Common已经存在。

\OPFLSK02\SQLBackupsForTape\DBMaintenance\Mirroring\Common\DB\u Create\u Snapshots.bat \OPFLSK02\SQLBackupsForTape\DBMaintenance\Mirroring\Common\DB\u Force\u Mirror\u To\u Principal.bat ....... 已复制18个文件

发生此错误是因为批处理文件没有检查目录是否已存在。如何从invoke命令块处理此问题以允许脚本继续?目前我无法更改批处理文件本身

你可以试试看

调用命令-Session$Session-Scriptblock{startc:\MSSQL\DBMaintenance\Mirroring\SERVER\u Remove\u Mirroring.bat xssqlk02 ossqlk02-wait}

其思想是,cmdlet将等待您完成bat文件。

您可以尝试这样做

调用命令-Session$Session-Scriptblock{startc:\MSSQL\DBMaintenance\Mirroring\SERVER\u Remove\u Mirroring.bat xssqlk02 ossqlk02-wait}


我们的想法是,cmdlet将等待您完成bat文件。

如果Alexey的解决方案不起作用,您可以尝试以下方法:

$job = Invoke-Command -Session $session -Scriptblock { Start-Process -FilePath "C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat" -ArgumentList "xssqlk02", "ossqlk02" -Wait } -AsJob
$job | Wait-Job

如果Alexey的解决方案不起作用,您可以尝试以下方法:

$job = Invoke-Command -Session $session -Scriptblock { Start-Process -FilePath "C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat" -ArgumentList "xssqlk02", "ossqlk02" -Wait } -AsJob
$job | Wait-Job
“无效的驱动器规范删除xssqlk02和ossqlk02之间RCM数据库的镜像:”

它可能表示$session无法访问ossqlk02。 尝试在所有计算机上指定自己的管理员,并在admin下运行脚本。如果没有帮助,您可以使用实用程序-PsExec

“无效的驱动器规范删除xssqlk02和ossqlk02之间RCM数据库的镜像:”

它可能表示$session无法访问ossqlk02。
尝试在所有计算机上指定自己的管理员,并在admin下运行脚本。如果没有帮助,您可以使用utility-PsExec

这实际上不起作用。当我和启动和等待项出现以下错误时:找不到接受参数“ossqlk02”的位置参数CategoryInfo:InvalidArgument:(:)[Start Process],ParameterBindingException+FullyQualifiedErrorId:PositionParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommands尝试将其更改为:
Invoke Command-Session$Session-Scriptblock{Start Process-FilePath“C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat”-参数列表“xssqlk02”,“ossqlk02”-Wait}
虽然我不能100%确定它是否会工作。这实际上只是导致脚本启动,只是坐在那里,没有任何提示或操作。我只是注意到了一些其他的东西,所以我要编辑一下这个问题。这实际上不起作用。当我和启动和等待项时,我得到以下错误:位置参数canno找不到接受参数“ossqlk02”。+CategoryInfo:InvalidArgument:(:)[Start Process],ParameterBindingException+FullyQualifiedErrorId:PositionParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommands尝试将其更改为:
Invoke Command-Session$Session-Scriptblock{Start Process-FilePath”C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat“-ArgumentList“xssqlk02”,“ossqlk02”-Wait}
虽然我不能100%确定它是否会工作。这实际上只是导致脚本启动,只是坐在那里,没有任何提示或操作。我只是注意到了一些其他问题,所以我将对问题进行一点编辑。我非常自信,这不是权限问题,因为我是该框的管理员。如果您注意到错误,请tials问题是,我调用的批处理文件正在尝试创建一个已经存在的目录。问题是,当它作为远程进程的一部分运行时,导致它在用户提示和批处理文件的实际运行上运行。我非常确信,这不是权限问题,因为我是一个dmin。另外,如果您注意到错误细节,则问题在于我调用的批处理文件正在尝试创建一个已存在的目录。这是有关作为远程进程的一部分运行时出现的错误的信息,该错误导致该批处理文件在用户提示下运行,并实际运行批处理文件。使用bat文件的所有者我们解决了一些问题,最终我们能够将其从导致双跳问题的远程上下文中删除。然后,我能够参与George的代码:启动进程-文件路径“C:\MSSQL\DBMaintenance\Mirroring