当从 [Diagnostics.Process]::Start
启动它们时,如何将 echo y
管道发送到 plink
$meProcessID = ([Diagnostics.Process]::Start("echo y | plink.exe", "$($hostName) -l $($uPwd.GetNetworkCredential().Username) -pw $($uPwd.GetNetworkCredential().Password) \`"echo '$($uPwd.GetNetworkCredential().Password)' | sudo -S '/home/someuser/somescript.sh'\`"")).Id
虽然有this它并没有真正回答我的问题,因为它询问的是从 powershell 调用 bash,而我的实际上是关于将一个值从标准输出传递给 Window 命令以绕过 Host-Read
类型的提示。
最佳答案
Ansgar Wiechers' helpful answer包含有效的解决方案和明智的安全警告。
使用 System.Diagnostics.Process
instance 和 .RedirectStandardInput = $true
,并使用 .StandardInput
在流程开始后提供标准输入,为您提供更大的灵 active ,但在您的情况下,唯一需要的修改是将命令行作为参数(第二个参数)传递,通过选项 -c
,编程 cmd.exe
(第一个参数)。
[Diagnostics.Process]::Start()
的第一个参数只是可执行文件名/路径,不是完整的命令行。第二个参数接受包含参数的字符串以传递给可执行文件。
由于您正在使用 shell 功能,即将 多个 命令与管道 连接,您必须使用
cmd .exe
作为可执行文件,并将您的管道作为 参数 传递给cmd.exe
的/c
选项。- 您也可以使用
powershell.exe
,但在这种简单的情况下,使用cmd.exe
就足够了,而且速度更快。
- 您也可以使用
这是一个简化的例子:
$meProcessID = ([Diagnostics.Process]::Start(
# Program to launch
'cmd',
# Arguments to pass
'/c echo 42 | powershell -nop -c "''stdin input: '' + $Input" & pause'
).Id
上面演示了标准输入 42
被 powershell
进程视为这样 ($Input
);它会打开一个新的控制台窗口,显示以下内容:
stdin input: 42
Press any key to continue . . .
关于windows - 将输出管道输出到由 [Diagnostics.Process]::Start 启动的 Windows 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53695184/