尝试使用运行方式管理员使用PowerShell运行.bat文件时出错

尝试使用运行方式管理员使用PowerShell运行.bat文件时出错,powershell,batch-file,Powershell,Batch File,我可以右键单击DEC16.bat文件,它将运行。我无法将其包含在从闪存驱动器运行的脚本中。 PowerShell脚本实质上是将一堆安装文件复制到客户端计算机上 Windows PowerShell Copyright (C) 2013 Microsoft Corporation. All rights reserved. PS H:\> $script = "\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat" PS H:\> P

我可以右键单击DEC16.bat文件,它将运行。我无法将其包含在从闪存驱动器运行的脚本中。 PowerShell脚本实质上是将一堆安装文件复制到客户端计算机上

Windows PowerShell
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

PS H:\> $script = "\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat"
PS H:\>
PS H:\> Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprofile -command &{Start-Process $script -verb runas}'
Start-Process : This command cannot be run due to the error: The directory name is invalid.
At line:1 char:1
+ Start-Process powershell -Credential “xxx\xxxvis_desktop” -ArgumentList '-noprof ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

PS H:\> $script
\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat
PS H:\>
(我插入了“xxx”以保护无辜)

尝试以下方法:

Start-Process powershell `
   -WorkingDirectory (Split-Path $script) `
   -Credential xxx\xxxvis_desktop `
   -ArgumentList '-noprofile', '-command', "
     & { start-process powershell -ArgumentList '-File', '$script' -Verb RunAs }
     "
  • 您的主要问题很可能是目标用户--
    xxx\xxxvis\u desktop
    --在调用时没有访问当前目录的权限

    • 将工作目录显式设置为允许目标用户访问的目录应该可以解决该问题-
      -工作目录(拆分路径$script)
      设置工作目录。给局长。目标脚本所在的位置
  • 您的第二个问题—正如在对问题的评论中所指出的—是传递给
    启动进程
    命令字符串括在
    “…”
    (单引号)中,导致嵌入的
    $script
    变量引用未展开(内插)

    • 使用
      “…”
      (双引号)修复了该问题
      但是,请注意,要传递给
      powershell
      可执行文件的命令行被拆分为通过
      -ArgumentList
      -the(literal,single-quoted)选项传递的单个参数,然后是(interpolated,double-quoted)命令字符串,这是传递参数的首选方式,因为它更健壮

    • 请注意,命令字符串中的
      $string
      引用如何包含在嵌入式
      '…'
      中,以确保调用的
      powershell
      实例解析命令字符串时,
      $string
      的值被识别为单个参数(虽然这对于手头的值不是必需的,
      \\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat

      • 如果
        $script
        的值可能嵌入了
        '
        实例,则必须使用以下实例(将
        '
        实例加倍以转义它们):
        $($script-replace“,”)
  • 最后一个问题是,您不能直接在脚本上使用
    启动进程
    ——就像在外部调用中一样,您需要调用
    powershell
    ,并将脚本文件名作为参数传递给它


补充说明:

  • 在命令字符串中围绕
    启动进程
    调用的
    &{…}
    包装器应该是不必要的

  • 通常,您可以使用带有
    -Verb RunAs
    的单个
    启动进程调用来提升
    $script
    的运行,但不幸的是,
    -Verb RunAs
    -Credential
    不能组合,这意味着:

    • 如果当前用户是一个管理帐户,则提升的会话将始终以该用户的身份运行-您只会得到一个确认提升的是/否提示
    • 否则,将提示输入凭据,但您不能在该对话框中预先填充用户名

    • Start进程-动词RunAs powershell-ArgumentList'-noprofile','-File',$script

尝试以下操作:

Start-Process powershell `
   -WorkingDirectory (Split-Path $script) `
   -Credential xxx\xxxvis_desktop `
   -ArgumentList '-noprofile', '-command', "
     & { start-process powershell -ArgumentList '-File', '$script' -Verb RunAs }
     "
  • 您的主要问题很可能是目标用户--
    xxx\xxxvis\u desktop
    --在调用时没有访问当前目录的权限

    • 将工作目录显式设置为允许目标用户访问的目录应该可以解决该问题-
      -工作目录(拆分路径$script)
      将工作目录设置为目标脚本所在的目录
  • 您的第二个问题—正如在对问题的评论中所指出的—是传递给
    启动进程
    命令字符串括在
    “…”
    (单引号)中,导致嵌入的
    $script
    变量引用未展开(内插)

    • 使用
      “…”
      (双引号)修复了该问题;
      但是,请注意,要传递到
      powershell
      可执行文件的命令行被拆分为通过
      -ArgumentList
      -传递的单个参数(文本,单引号)选项,然后是(插值,双引号)命令字符串,这是传递参数的首选方式,因为它更健壮

    • 请注意,命令字符串中的
      $string
      引用如何包含在嵌入式
      '…'
      中,以确保调用的
      powershell
      实例解析命令字符串时,
      $string
      的值被识别为单个参数(虽然这对于手头的值不是必需的,
      \\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat

      • 如果
        $script
        的值可能嵌入了
        '
        实例,则必须使用以下实例(将
        '
        实例加倍以转义它们):
        $($script-replace“,”)
  • 最后一个问题是,您不能直接在脚本上使用
    启动进程
    ——就像在外部调用中一样,您需要调用
    powershell
    ,并将脚本文件名作为参数传递给它


补充说明:

  • 在命令字符串中围绕
    启动进程
    调用的
    &{…}
    包装器应该是不必要的

  • 通常,您可以使用带有
    -动词RunAs
    的单个
    启动进程
    调用来提升
    $script
    的运行,但不幸的是