我是批处理文件和wmic的新手,在研究StackOverflow之后,我发现很少有答案重叠,但在放在一起时却没有产生预期的输出。
问题:
创建批处理文件以更改计算机名称(不在域上):
wmic bios get serialnumber
并将值分配给变量comp_name
,然后显示此变量的值; comp_name
; 所以1:
FOR /F %%F IN ('wmic bios get serialnumber') DO (
SET comp_name=%%F
)
ECHO %comp_name%
接下来是2.:
WMIC computersystem where name="%computername%" rename name=%%comp_name%%
编辑:得到1.部分正确 - 按预期工作 - 获取序列号并显示变量的值。但是第2部分仍然会抛出错误:
O:\>wmic computersystem where name="TOM-PC" rename NAME=
Invalid named parameter list.
Hint: <named param list> ::= <named param> | <named param> <named param list> where <named param> ::= <param name>=<param value>
如果我理解正确 - 最后一个命令的NAME=...
部分不会识别上面初始化的变量。那么如何使用comp_name
作为wmic
命令的参数?
编辑.2
&#34;为什么在name = %% comp_name %%中使用双倍%符号?&#34;通过aschipfl
- 我恢复了我原来的问题 - 使用了双%
,现在得到了不同的错误 - 87这告诉了我更多关于这个问题的信息。使用单个%
会产生上面列出的错误。我不确定问题是单个还是双倍%
或其他地方。
编辑.3
进一步的研究表明,wmic bios get serialnumber
实际上在新行中返回三个值
C:\Windows\system32>wmic bios get serialnumber
SerialNumber
BY3VF02
即 - SerialNumber
字符串,后跟新行中的实际序列号,最后一行只是空行。所以(我希望)最后的问题 - 如何只将第二个值分配给我的变量?
答案 0 :(得分:1)
尝试使用此批处理代码:
@Echo Off
For /F "tokens=2 Delims==" %%A In ('WMIC Bios Get SerialNumber /Value') Do (
For /F "Delims=" %%B In ("%%A") Do (
Call :RenamePC "%%B"
Call :Ask4Reboot
)
)
pause & Exit /B
::**********************************************************************
:RenamePC
WMIC ComputerSystem where Name="%ComputerName%" call Rename Name="%~1"
Exit /B
::***********************************************************************
:Ask4Reboot
(
echo Set Ws = CreateObject("wscript.shell"^)
echo Answ = MsgBox("Did you want to reboot your computer ?"_
echo ,VbYesNo+VbQuestion,"Did you want to reboot your computer ?"^)
echo If Answ = VbYes then
echo Return = Ws.Run("cmd /c shutdown -r -t 60 -c ""You need to reboot in 1 minute."" -f",0,True^)
echo Else
echo wscript.Quit(1^)
echo End If
)>"%tmp%\%~n0.vbs"
Start "" "%tmp%\%~n0.vbs"
答案 1 :(得分:0)
以下,只要您的bios序列是有效的计算机名称,就应该这样做:
@Echo Off
For /F "Skip=1 Delims=" %%A In ('WMIC Bios Get SerialNumber'
) Do For /F "Delims=" %%B In ("%%A") Do Call :RenPC %%B
Exit/B
:RenPC
WMIC ComputerSystem Where Name!="%~1" Call Rename Name="%~1"
在新名称生效之前,必须重新启动电脑。
答案 2 :(得分:0)
曾效力于Win 10 Ent v1803。 如果需要前缀等,只需在变量之前/之后添加名称。
setlocal
wmic bios get serialnumber | find /I /V "SerialNumber" > "%temp%\sn.txt"
set /p comp_name=<"%temp%\sn.txt"
wmic computersystem where name="%computername%" rename name=%comp_name%
del "%temp%\sn.txt"
endlocal