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

时间:2017-06-26 00:28:16

标签: powershell

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

function($target){
   svn merge $target
}

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

  1. 检测命令执行是否需要任何输入才能继续
  2. 提供默认输入(在我的特定情况下为“df”,然后是“p”)
  3. 有没有办法在PowerShell中这样做?非常感谢你提供给我的任何帮助/线索。

    编辑:

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

    Requesting user input

    编辑2:

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

    预期行为 Expected behavior

    实际结果: Actual result

2 个答案:

答案 0 :(得分:0)

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

$var = & svn merge $target
$var

答案 1 :(得分:0)

注意

  • 此答案无法解决OP的问题,因为特定目标实用程序svn显然会在进程“时禁止提示 stdin输入不是来自终端(控制台)。

  • 但是,对于仍然提示的实用程序,下面的解决方案应该在规定的限制范围内工作。

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

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

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

让我们假设以下批处理文件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 上工作所必需的 - { {1}} 工作。

    • 请注意'one', 'two' | ./foo.cmd必须如何表示为<,以确保它被传递到'<',而不是由PowerShell预先解释(cmd.exe isn&#39 ; t支持)。
  • 相比之下,< Unix 平台(PowerShell Core)上工作。