批处理 - 将命令输出存储到变量中(多行)

9

我知道一种方法,有点像作弊,但下面的代码创建了一个临时文件,然后将其删除。我不希望这种情况发生。那么有没有更好的或者正当的方法来做到这一点?

command 2>> "temp"
set /p OUTPUT=<"temp"
del "temp"
echo %OUTPUT%

我知道有一种使用for循环的解决方案,但对于返回多行结果的命令无效。我想将它们全部存储到我的变量中。(顺便说一下,我尝试过这个code

将输出写入临时文件并使用 set /p 命令将只会将临时文件中的第一行内容存储到变量中。这符合您的需求吗?如果是这样,那么可以通过添加一个 if defined 语句来轻松调整 for 循环以实现该功能。 - SomethingDark
也许值得明确提到:命令的期望输出在 STDERR 上。 - Stephan
如果可能的话,我希望将所有内容都存储起来,而不是仅存储第一行。 - ozcanovunc
基本上,不可能在单个变量中存储多行文本。您可以将它们存储在变量数组中,或者将它们存储在单个变量中,并将换行符替换为字符或字符字符串(例如line1#line2#line3,其中#表示“新行”)- 但在后一种情况下,您可能需要仔细选择字符,并且有大约8180个字符的限制。 - Magoo
1
那会很有用。我们如何将它们存储到变量数组中? - ozcanovunc
2个回答

16
你可以在变量中包含换行符并将其放入单个变量中。
setlocal EnableDelayedExpansion
set LF=^


REM The two empty lines are required here
set "output="
for /F "delims=" %%f in ('dir /b') do (
    if defined output set "output=!output!!LF!"
    set "output=!output!%%f"
)
echo !output!

但是由于嵌入的换行符,稍后处理数据可能会有些棘手。
而且每个变量仍然有8191个字符的限制。

通常使用数组更容易。

setlocal EnableDelayedExpansion
set "output_cnt=0"
for /F "delims=" %%f in ('dir /b') do (
    set /a output_cnt+=1
    set "output[!output_cnt!]=%%f"
)
for /L %%n in (1 1 !output_cnt!) DO echo !output[%%n]!

两种方法都可以,但我更喜欢第二种。谢谢! - ozcanovunc

0

看起来有些丑陋:

for /f "delims=" %%i in ('dir notexistent.xxx  2^>^&1 1^>nul ') do echo %%i

深入解释 这里


1
那个打印一切正常,但我想要存储它们。当我尝试将 %%i 设置为变量,如 do set var=%%i 时,它只会存储最后一行。 - ozcanovunc
1
请查看延迟扩展陷阱。此外,变量的值不能有换行符。set output=!output!%%i将所有行连接成一个单行值(这里不需要/p,因此也不需要<nul)。 - Stephan
1
@jeb:没错,但是创建和使用这样的变量很麻烦。批处理中的变量根本没有设计成具有换行符,尽管有经验可以实现它们。最好使用“数组”。 - Stephan
@Stephan 从这个角度来看,你是正确的。这并不是很容易,而且有点容易出错。 - jeb
1
@Foad,好的,请在聊天室里交流。 - jeb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接