powershell - PSExec 和 Powershell 无法运行位于 Program Files (x86) 中的程序

标签 powershell escaping quoting

我正在努力在 PS 脚本中使用 Psexec 来执行交互式程序。 我试过这个:

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell notepad" 2> $null

...它运行得很好。记事本在远程计算机上启动。现在,当我想从 Program Files (x86) 运行 .exe 时,我什么也得不到。 我已经尝试过这种变体来运行位于 ProgramFiles(x86) 中的 1.exe:

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell "${env:ProgramFiles(x86)}\1.exe"" 2> $null

PsExec.exe -i \\192.168.100.95 -u Administrador -p Test1234 cmd /c "echo . | powershell "${env:ProgramFiles(x86)}" + "\1.exe"" 2> $null

但是它们都不起作用。知道哪里出了问题吗?

最佳答案

尝试以下操作:

psexec cmd /c 'echo . | powershell "& \"${env:ProgramFiles(x86)}\1.exe\"' 2>$null

注意:为了更好地关注解决方案的基础知识,我简化了 psexec 命令,但原始命令也应该有效。

  • 传递给 cmd/k 的整个字符串是引号,以防止 PS 预先插入元素,特别是 ${env:ProgramFiles (x86)} 其扩展应该推迟到命令在目标机器上执行。

    • 请注意,当您将命令行传递给 cmd/c 时,您通常需要一个 双引号 字符串 cmd.exe< 调用时 本身。但是,在 PowerShell 中,这不是要求:PowerShell 首先解析字符串(无论最初是单引号还是双引号)进行插值(如果适用),然后传递结果 字符串 双引号 到外部命令。
  • 注意 powershell 参数上下文中的 &\"...\" 构造,它确保正确执行带有嵌入空格的路径.

    • 奇怪的是,PS 要求 " 个字符。当从外部世界 传递参数时,将其转义为 \"(而不是在 PS 领域内转义为 `")。

    • 作为一个整体传递给powershell的命令必须双引号,因为cmd.exe - 在其上下文中 powershellcmd/c 而被调用 - 仅将双引号识别为参数定界符,并且只有双引号可以保护所包含的内容(大部分)不受解释。


为什么您的命令不起作用:

  • 主要问题是您希望 powershell.exe 调用的可执行路径最终包含 空格 (C:\Program Files. ..),导致 PowerShell 无法将整个路径识别为单个参数。这样的路径必须 (a) 引用 和 (b) 使用调用运算符 & 调用。
    (在第二次尝试中,使用 + ...(字符串连接),您还必须使用 &,并将连接包含在 (.. .)).

    • 对于调试,使用 cmd/k 而不是 cmd/c 可以让您更好地了解命令最终是如何执行的(/k 在执行命令后保持控制台窗口打开。
  • 更微妙的一点是,通过整体使用 双引号 字符串,${env:ProgramFiles(x86)} 上进行了扩展源 机器而不是目标 机器,其中环境变量的定义可能相同也可能不同。

关于powershell - PSExec 和 Powershell 无法运行位于 Program Files (x86) 中的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35999059/

相关文章:

.net - 为什么 Get-SPWeb 内引发的错误不会传播到 powershell?

powershell - 防止在停止 VM 之前需要使用 Login-AzureRmVm

templates - 如何在 Jade 模板中转义花括号?

c# - string.format 中的转义大括号丢失。可能的 C# 错误?

javascript - 删除 vscode 中的引号或在引号和无引号之间切换

powershell - 尝试在 Powershell 中登录 Azure

windows - 使用 powershell 删除文件夹上的所有 ACL

java - JDBC MySQL URL 和特殊字符的问题

powershell - 从 cmd 调用 powershell 命令时出错

linux - Bash 在远程上下文中使用之前在本地解析变量