繁体   English   中英

在powershell脚本中管理来自外部命令的输入

[英]Manage inputs from external command in a powershell script

首先,我想道歉,如果标题不够描述,我很难处理这个问题。 我正在尝试使用将为另一个进程执行的powershell脚本为svn合并构建自动化。 我正在使用的功能如下所示:

function($target){
   svn merge $target
}

现在,当合并中存在冲突时,我的问题就出现了。 该命令的默认行为是请求来自用户的输入并相应地继续。 我想使用预定义的值自动化这个过程(显示差异,然后推迟合并),但我还没有找到办法。 总之,我希望完成的工作流程如下:

  1. 检测命令执行是否需要任何输入才能继续
  2. 提供默认输入(在我的特定情况下为“df”,然后是“p”)

有什么方法可以在powershell中做到这一点? 非常感谢您提供给我的任何帮助/线索。

编辑:

澄清我的问题:我想在powershell脚本中执行的命令需要时自动提供一个值,如下例所示:

请求用户输入

编辑2:

这是使用@ mklement0提供的代码段进行的测试。 不幸的是,它没有按预期工作,但我认为添加此版本是为了澄清每个完整的问题

预期行为: 预期的行为

实际结果: 实际结果

您可以将SVN命令行输出存储到变量中,并根据需要对其进行解析和分支。 每行输出都存储到一个新的枚举器中(存储在PS变量中的cli输出是数组格式)

$var = & svn merge $target
$var

注意

  • 这个答案并没有解决OP的问题,因为当进程的stdin输入不是来自终端 (控制台)时,特定的目标实用程序svn显然会抑制提示

  • 但是,对于仍然提示的实用程序,下面的解决方案应该在规定的约束条件下工作。

  • 通常,在尝试模拟用户输入之前,值得研究目标实用程序是否通过其命令行选项提供对行为的编程控制,这种选项既简单又强大。


虽然检测给定的外部命令是否提示输入用户输入是微不足道的:

  • 你可以盲目地发送推定的答复,
  • 假设不需要任何情境变化(除非特定的调用根本不发生提示,在这种情况下输入被忽略)。

让我们假设下面的批处理文件foo.cmd ,它提出2个提示并回显输入:

@echo off
echo begin
set /p "input1=prompt 1: "
echo [%input1%]
set /p "input2=prompt 2: "
echo [%input2%]
echo end

现在让我们将响应onetwo发送到该批处理文件:

C: PS> Set-Content tmp.txt -Value 'one', 'two'; ./foo.cmd '<' tmp.txt; Remove-Item tmp.txt
begin
prompt 1: one
[one]
prompt 2: two
[two]
end

注意:

  • 由于我不知道的原因,这种方法在Windows上工作需要使用中间文件 - 'one', 'two' | ./foo.cmd 'one', 'two' | ./foo.cmd 不起作用

    • 请注意<必须表示为'<'以确保它是如何传递给cmd.exe而不是由PowerShell预先解释(其中<不支持)。
  • 相比之下, 'one', 'two' | ./foo 'one', 'two' | ./foo Unix平台上(PowerShell核心)工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM