我正在创建一个脚本,该脚本将获取计算机版本和序列号,将其转换为变量,然后将它们组合在一起以创建新的主机名。
但是,序列号的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”,因为它可能会在任务序列中实现。
答案 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
的最初评论已被实施为一个答案,因此本文将以wmic /Value
格式进行扩展:
CSV