【问题标题】:Batch file has an error that when called from a Powershell script does not allow the batch file to finish批处理文件有一个错误,当从 Powershell 脚本调用时不允许批处理文件完成
【发布时间】:2010-09-24 00:59:04
【问题描述】:

在下面的脚本中,我正在调用一个批处理文件来中断一些数据库之间的镜像。批处理文件有一个启动脚本的用户提示,但 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_Remove_Mirroring.bat xssqlk02 ossqlk02 删除 xssqlk02 和 ossqlk02 之间 RCM 数据库的镜像:继续?是/否是

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

\OPFLSK02\SQLBackupsForTape\DBMaintenance\Mirroring\Common\DB_Create_Snapshots.bat \OPFLSK02\SQLBackupsForTape\DBMaintenance\Mirroring\Common\DB_Force_Mirror_To_Principal.bat ………… 已复制 18 个文件

发生错误是因为批处理文件没有检查目录是否已存在。我该如何处理这个来自调用命令块以允许脚本继续?目前我无法更改批处理文件本身。

【问题讨论】:

  • 在与 bat 文件的所有者合作后,我们解决了一些问题,最终我们能够将其从导致双跳问题的远程上下文中移除。然后我可以使用 George 的部分代码:Start-Process -FilePath "C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat" -ArgumentList "xssqlk02", "ossqlk02" -Wait 并使用它。

标签: powershell


【解决方案1】:

如果 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

【讨论】:

    【解决方案2】:

    你可以试试

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

    这个想法是 cmdlet 将等到您完成 bat 文件。

    【讨论】:

    • 这实际上不起作用我在启动和等待项目时收到以下错误:找不到接受参数“ossqlk02”的位置参数。 + CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
    • 尝试将其更改为:Invoke-Command -Session $session -Scriptblock { Start-Process -FilePath "C:\MSSQL\DBMaintenance\Mirroring\SERVER_Remove_Mirroring.bat" -ArgumentList "xssqlk02", "ossqlk02" -Wait } 尽管我不能 100% 确定它会起作用。
    • 这实际上只是导致脚本启动并且只是坐在那里没有任何提示或操作。我刚刚注意到其他事情,所以我要稍微编辑一下这个问题。
    【解决方案3】:

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

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

    【讨论】:

    • 我非常有信心这不是权限问题,因为我是该框的管理员。此外,如果您注意到错误详细信息,问题是我正在调用的批处理文件正在尝试创建一个已经存在的目录。当它作为远程进程的一部分运行时,它会导致错误在用户提示和批处理文件的实际运行中运行。
    猜你喜欢
    • 2014-10-14
    • 2023-03-30
    • 2011-01-03
    • 2013-02-20
    • 2015-11-30
    • 2012-10-20
    • 2018-02-20
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多