windows - 将输出管道输出到由 [Diagnostics.Process]::Start 启动的 Windows 可执行文件?

标签 windows powershell

当从 [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

上面演示了标准输入 42powershell 进程视为这样 ($Input);它会打开一个新的控制台窗口,显示以下内容:

stdin input: 42
Press any key to continue . . .

关于windows - 将输出管道输出到由 [Diagnostics.Process]::Start 启动的 Windows 可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53695184/

相关文章:

java - 'C :\' in CMD, 文件名、目录名或卷标语法不正确

c# - 有没有办法将 System.IO.Stream 转换为 Windows.Storage.Streams.IRandomAccessStream?

python - python中谷歌语音识别的“音频数据必须是音频数据”错误

mysql - 在 windows starpack 下包含 tdbc::mysql&tdbc::postgres 的 dll 的最佳方法是什么?

json - PowerShell : retrieve JSON object by field value

用于转换一列 CSV 文件的 PowerShell 脚本

html - 通过 PowerShell 从 SharePoint 发送电子邮件 - 神秘的问号

python - 如何删除python中的文件夹? rmtree错误

powershell - 在Powershell中安装NServicebus服务时捕获错误

batch-file - 批处理或 PowerShell 命令获取 Windows 中所有打开的应用程序的名称