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

时间:2014-12-08 16:09:46

标签: 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] sometext

我无法想到轻松编码(不包括变量和/或临时文件)来实现类似的功能。是否有可能以简单的方式(比如在Linux / Unix上使用反引号)?怎么样?

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

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

2 个答案:

答案 0 :(得分: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%

How do I get the result of a command in a variable in windows?

答案 1 :(得分:1)

没有临时文件,没有可见的辅助变量(参见%xyz%子程序中正式使用的:echo变量没有变化。很容易将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
  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

在上一个代码片段中,遵循规则只有一个命令用于同一任务echo.替换为call:echo以添加新行到输出。但是,请echo ONecho OFF分开......