簡體   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