2017-02-11 178 views
1

我可以右键单击DEC16.bat文件并运行。我无法将其包含在脚本中以便从闪存驱动器运行。 PowerShell脚本实质上是将一堆安装文件复制到客户机的计算机上。尝试使用runas运行.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” 的保护无辜者)

+1

参数列表是引用单引号。因此$ script不会展开。使用双引号 – Matt

+1

如果你从[这里]得到这段代码(http://stackoverflow.com/questions/15305696/running-a-bat-file-as-admin-from-powershell)我明白了。我看你昨天在那里留言。我还留下了一个指出错误。 – Matt

回答

0

尝试以下操作:

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

    • 明确设置工作目录到目录目标用户允许访问应该解决这个问题 - -WorkingDirectory (Split-Path $script)设置工作目录。到dir。目标脚本所在的位置。由Matt在关于这个问题的评论中指出 - -
  • 你的第二个问题是,你传递给Start-Process命令字符串被封闭在'...'引号),导致嵌入式$script可变参考而不是待扩展(内插)。

    • 使用"..."引号)修复的问题;请注意,要传递给powershell可执行文件的命令行被拆分为个别参数通过-ArgumentList传递 - (文字,单引号)选项,后跟(插入的,双引号)命令字符串,其中是传递参数的首选方式,因为它更强大。

    • 注意,该命令串内的$string参考是如何封闭在嵌入'...'以便确保当调用powershell实例解析命令串,的$string值被识别为单个参数(尽管这对于手头的价值来说不是必要的,但是\\xxxhsfmsl03\adap\Database\Install\AugKA\DEC16.bat)。

      • 如果有一个机会的$script值已嵌入'的情况下,你必须使用以下(双'情况下逃脱他们):
        $($script -replace "'", "''")
  • 最后问题在于你不能直接在脚本上使用Start-Process - 如在外部呼叫中,您需要呼叫powershell并将脚本传递给它文件名作为参数。


其他注意事项:

  • 周围的命令字符串的start-process调用的& { ... }包装不应该是必要的。

  • 一般情况下,你可以使用一个Start-Process调用与-Verb RunAs提升的$script运行,但不幸的是,-Verb RunAs-Credential不能合并,这样就意味着:

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

    • Start-Process -Verb RunAs powershell -ArgumentList '-noprofile', '-File', $script

+1

它的工作原理。而且你是正确的,我不能通过放置“-Credential myUserNameHere”:::来预先填充用户名,并且非常感谢你! – JustJohn

相关问题