Cmd 在一行上获取不同命令的输出

Cmd 在一行上获取不同命令的输出,cmd,Cmd,下面的脚本使用一个小CMD文件在屏幕上显示一些数据: @echo off set description=%1 ver date /t time /t echo %description% 这将提供输出,类似于: Microsoft Windows [Version 6.1.7601] ma 08/12/2014 17:00 sometext 但是,我希望得到以下输出: Microsoft Windows [Version 6.1.7601] [ma 08/12/2014 17:00]

下面的脚本使用一个小CMD文件在屏幕上显示一些数据:

@echo off

set description=%1

ver
date /t
time /t
echo %description%
这将提供输出,类似于:

Microsoft Windows [Version 6.1.7601]
ma 08/12/2014
17:00
sometext
但是,我希望得到以下输出:

Microsoft Windows [Version 6.1.7601] [ma 08/12/2014 17:00] sometext
我想不出简单的编码(不包括变量和/或临时文件)就能实现这样的功能。是否可以用一种简单的方式(比如在Linux/Unix上使用backticks)?怎么做

作为奖励,如果这一行不以返回字符结尾就更好了。这样,我就可以添加额外的文本(也是一行格式)到文件中,只需使用ECHO。知道ECHO本身最终会增加回报。我知道我可以这样做,使用Cygwin的PRINTF,但如果可能的话,我希望避免使用Cygwin,并使用标准CMD

编辑:将问题更改为包含“ver”命令,使其与标题匹配:要转换为1行的实际命令的输出

@echo off
set myVar=
set description=%1
for /F "delims=" %%I in ('ver') do (set myVar=%%I)
for /F "delims=" %%I in ('date /t') do (set myVar=%myVar% %%I)
for /F "delims=" %%I in ('time /t') do (set myVar=[%myVar% %%I])
set myVar=%myVar% %description%
echo %myVar%

没有临时文件,没有可见的辅助变量(参见:没有更改
%xyz%
子例程中正式使用的变量)。将
echo anything
更改为
call:echo anything

  @ECHO OFF >NUL
  :: unrem next line to see no change
  :: set "xyz=XYZ"

  Call :echo %time%

  Call :echo after 5 secs
  ping 1.1.1.1 -n 1 -w 5000 > nul
  Call :echo %time%

  Call :echo another 5 secs
  ping 1.1.1.1 -n 1 -w 5000 > nul
  Call :echo %time%

  :: add new line in next ECHO. command 
  echo.

  :: ensure variable xyz is not defined / changed
  set xyz
  :: and STDOUT command output
  for /F "tokens=* delims=" %%G in ('ver /?') do call :echo %%G
  for /F "tokens=* delims=" %%G in ('ver') do call :echo %%G
  goto :eof

:echo
  <nul (set/p xyz=%* )
goto :eof
@ECHO OFF>NUL
::取消选中下一行,看不到任何更改
::设置“xyz=xyz”
呼叫:回显%时间%
呼叫:5秒后回音
ping 1.1.1.1-N1-W5000>nul
呼叫:回显%时间%
呼叫:再回音5秒
ping 1.1.1.1-N1-W5000>nul
呼叫:回显%时间%
::在下一个回显中添加新行。命令
回声。
::确保未定义/更改变量xyz
设置xyz
::和STDOUT命令输出
对于/F“令牌=*delims=“%%G in('ver/?”)请调用:echo%%G
对于/F“tokens=*delims=“%%G in('ver')do call:echo%%G
后藤:eof
:回声
努尔
对于/F“tokens=*delims=“%%G in('ver')do call:echo%%G
对于/F“tokens=*delims=“%%G in('date/t'),请拨打:echo%%G
对于/F“tokens=*delims=“%%G in('time/t'),请调用:echo%%G
呼叫:回显sometext
电话:echo
后藤:eof
:回声
如果“%*”==”回显。&转到:eof
努尔
后藤:eof

在上一个代码片段中,对于同一个任务,只有一个命令符合规则:
echo。
替换为call:echo,以向输出添加新行。但是,让
echo ON
echo OFF
分开…

Windows cmd:
echo[%date%%time%]%description%
或者类似于
echo[%date%%time:~0,5%]%description%
的东西,实际上,但我真的很想知道如何转换输出,而不是碰巧已经在变量中了。这本身是好的,但对我来说是个坏例子。我添加了一些东西使它变得更难。不管是好是坏,我都不在乎:
%date%
%time%
是内置变量。。。而且,正如您所说,
ECHO
本身最终将添加一个返回。。。对不起,我不知道该怎么做。下面是我今天学到的技巧;这将在同一行上显示所有内容:@echo off set/p=这是第1行set-p不显示任何换行,因为它正在等待用户输入以提供准确的换行。如果强制反向重定向
nul
,则可以避免换行。
  @ECHO OFF >NUL
  for /F "tokens=* delims=" %%G in ('ver') do call :echo %%G
  for /F "tokens=* delims=" %%G in ('date /t') do call :echo %%G
  for /F "tokens=* delims=" %%G in ('time /t') do call :echo %%G
  call :echo sometext
  call :echo
  goto :eof

:echo
  if "%*"=="" echo.&goto :eof
  <nul (set/p xyz=%* ) 2>NUL
goto :eof