消除WMIC的多余空间

时间:2019-05-06 19:59:04

标签: batch-file cmd

我正在创建一个脚本,该脚本将获取计算机版本和序列号,将其转换为变量,然后将它们组合在一起以创建新的主机名。

但是,序列号的WMIC命令返回“ T300”-“ FDHGFJ” 仅运行序列号WMIC(不运行“ wmic csproduct get version”)不会包含多余的空格。

正如其他帖子所建议的那样,我尝试将其循环播放约一遍,但是没有运气。

下面是完整的代码。

@ECHO ON
PUSHD "%~dp0"

setlocal EnableDelayedExpansion
for /f "usebackq skip=1 tokens=*" %%i in (`wmic bios get serialnumber ^| findstr /r /v "^$"`) do set "serialn=%%i"

for /f "usebackq skip=1 tokens=2 delims= " %%a in (`wmic csproduct get version ^| findstr /r /v "^$"`) do set "modeln=%%a"

ECHO "%modeln%"-"%serialn%" >>test.txt
POPD
exit

我希望最终结果是“ T300”-“ FDHGFJ”,因为它可能会在任务序列中实现。

3 个答案:

答案 0 :(得分:0)

仅在未定义变量时设置变量,您可以尝试一点技巧。我删除了"tokens=*""delims=",因为那样可以得到整行。然后,我们只对空白进行替换。

@echo off
set serialn=
set modeln=
for /f "usebackq skip=1" %%i in (`wmic bios get serialnumber`) do if not defined serialn set "serialn=%%i"
for /f "usebackq skip=1" %%a in (`wmic csproduct get version`) do if not defined modeln set "modeln=%%a"

echo "%modeln: =%"-"%serialn: =%">>test.txt

注意,我的设备wmic csproduct get version上第二个字​​符串的输出只有一个值,因此我必须更改该字符串,如果您的确有2个令牌,则应使用原始字符串:

for /f "usebackq skip=1 tokens=2" %%a in (`wmic csproduct get version`) do if not defined modeln set "modeln=%%a"

答案 1 :(得分:0)

带有get动词的wmic command可能会通过尾随 SPACE 来填充返回的数据,我假设您想删除而没有删除 SPACEs 在返回值本身中。

要实现此目的,您需要通过添加VALUE选项来更改输出格式,如下所示:

@echo off
setlocal EnableDelayedExpansion
cd /D "%~dp0."
for /F "tokens=1* delims==" %%I in ('wmic BIOS get SerialNumber /VALUE') do for /F "delims=" %%K in ("%%J") do set "serialn=%%K"
for /F "tokens=1* delims==" %%I in ('wmic CSProduct get Version /VALUE') do for /F "delims=" %%K in ("%%J") do set "modeln=%%K"
>> "test.txt" echo "%modeln%"-"%serialn%"
endlocal
exit /B

此外,我更改了以下内容:

  • 我在解析for /F的循环中放置了另一个wmic循环,以避免for /F进行的Unicode到ASCII / ANSI转换伪像,例如孤立的回车字符;
  • 我将pushd / popd对替换为cd /D,因为setlocal / endlocal已经本地化了环境,包括当前的工作目录;
  • 我添加了一个明确的endlocal来明确结束环境本地化(尽管无论如何在批处理脚本终止时都可以完成);
  • 我用exit代替了exit /B,以便仅退出批处理文件,而不退出父cmd实例;
  • 我将重定向部分>> "test.txt"放在echo命令的前面,以避免最后一个关闭">>之间的尾部空格(在您的代码中)也要退回;

答案 2 :(得分:0)

由于我对使用useShouldRecalculate的最初评论已被实施为一个答案,因此本文将以 /Value格式进行扩展:

CSV