我正在努力在 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
- 在其上下文中powershell
因cmd/c
而被调用 - 仅将双引号识别为参数定界符,并且只有双引号可以保护所包含的内容(大部分)不受解释。
为什么您的命令不起作用:
主要问题是您希望
powershell.exe
调用的可执行路径最终包含 空格 (C:\Program Files. ..
),导致 PowerShell 无法将整个路径识别为单个参数。这样的路径必须 (a) 引用 和 (b) 使用调用运算符&
调用。
(在第二次尝试中,使用+ ...
(字符串连接),您还必须使用&
,并将连接包含在(.. .)
).- 对于调试,使用
cmd/k
而不是cmd/c
可以让您更好地了解命令最终是如何执行的(/k
在执行命令后保持控制台窗口打开。
- 对于调试,使用
更微妙的一点是,通过整体使用 双引号 字符串,
${env:ProgramFiles(x86)}
在 上进行了扩展源 机器而不是目标 机器,其中环境变量的定义可能相同也可能不同。