【问题标题】:How do I make this script?我如何制作这个脚本?
【发布时间】:2021-10-20 04:37:50
【问题描述】:

我想要一个在 CMD 中使用这些选项的脚本:

wmic bios get serialnumber 

然后询问供应商,即。惠普或戴尔。
那么输出应该是类似于来自 wmic 的vendor-serialnumber,然后在序列号中添加一个 -,如下所示:

YHT3-1234 

“-”应始终位于序列号的最后 4 位数字之前,
所以最终的输出会是这样的:

HP-YHT3-1234

【问题讨论】:

  • 您在测试WMIC时是否使用过以下命令BIOS Get Manufacturer?肯定会返回Hewlett-Packard 或类似的东西,那么为什么要求最终用户输入供应商呢?不要为脚本的潜在问题敞开大门,头号问题始终是最终用户!
  • 我不想要完整的输出长度。我只想要一个简短的标识符。因此,如果脚本询问诸如“供应商是什么:%input%”之类的问题,那么 %output%-Serialnumber 以及最后 4 位数字/字母前面的 - 会很棒。最终输出应该类似于:%input%-YTHE-1234
  • 如果Manufacturer 字符串包含HPHewlett-Packard,那么您的脚本可以检测到并自动添加前缀HP,而不是要求最终用户确定并正确键入。字符串Dell 也是如此。就像我说的,如果脚本已经可以使用这些信息,并且使用相同的 WMI 查询,那么就没有理由让最终用户参与进来,从而导致潜在的问题。
  • wmic BIOS get Version 是否返回对供应商有用的信息?在我的系统上,它返回类似<short_vendor_name> - <version_number> 的内容。如果这没有帮助,为什么不使用翻译列表:for %%K in ("Dell Inc.=Dell" "Microsoft Corp.=MS" "Hewlett-Packard=HP") do for /F "tokens=1* delims== eol==" %%I in ("%%~K") do if /I "%Manufacturer%"=="%%I" set "Vendor=%%J"

标签: batch-file cmd scripting


【解决方案1】:

这是使用 PowerShell 获取它的另一种方法。除非您的组织禁止它,否则 PowerShell 可在所有受支持的 Windows 系统上使用。

FOR /F "delims=" %A IN ('powershell -NoLogo -NoProfile -Command ^
    "$x=Get-CimInstance CIM_BIOSElement;"
    "'{0}-{1}-{2}' -f"
    "@($x.Manufacturer, $x.SerialNumber.Substring(0,$x.SerialNumber.Length - 4),"
    "$x.SerialNumber.Substring($x.SerialNumber.Length - 4))"') DO (SET "RESULT=%A")
ECHO RESULT is %RESULT%

如果进入 .bat/.cmd 脚本,请记住将 PERCENT SIGN 字符加倍。

FOR /F "delims=" %%A IN ('powershell -NoLogo -NoProfile -Command ^
    "$x=Get-CimInstance CIM_BIOSElement;"
    "'{0}-{1}-{2}' -f"
    "@($x.Manufacturer, $x.SerialNumber.Substring(0,$x.SerialNumber.Length - 4),"
    "$x.SerialNumber.Substring($x.SerialNumber.Length - 4))"') DO (SET "RESULT=%%A")
ECHO RESULT is %RESULT%

【讨论】:

    【解决方案2】:

    这里有一个快速示例,向您展示如何在序列号中引入连字符/破折号,以及一些额外的工作来自动检测制造商,并根据需要缩短为标识符。

    @Echo Off
    SetLocal EnableExtensions
    Set "Vendor="
    Set "Serial="
    For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe BIOS Where "Manufacturer Like '%%Hewlett-Packard%%' Or Manufacturer Like '%%Dell%%' And SerialNumber Is Not NULL" Get Manufacturer^,SerialNumber /Format:MOF 2^>NUL') Do If Not Defined Vendor (Set "Vendor=%%G") Else Set "Serial=%%G"
    If Not Defined Vendor GoTo :EOF
    If "%Vendor:Dell=%" == "%Vendor%" (Set "Serial=HP-%Serial:~,-4%-%Serial:~-4%") Else Set "Serial=Dell-%Serial:~,-4%-%Serial:~-4%"
    Echo %Serial%
    Pause
    

    显然,如果有很多制造商,则需要做额外的工作。


    出于不必要的礼貌,这里是相同的方法,只是这次为最终用户提供了破解代码或破坏结果的机会:

    @Echo Off
    SetLocal EnableExtensions
    Set "Serial="
    For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe BIOS Where "SerialNumber Is Not NULL" Get SerialNumber /Format:MOF 2^>NUL') Do Set "Serial=%%G"
    If Not Defined Serial GoTo :EOF
    Set /P "Vendor=Type the name of the Computer Manufacturer, and press ENTER>"
    Echo %Vendor%-%Serial:~,-4%-%Serial:~-4%
    Pause
    

    基于对一台惠普笔记本和下面 KJ 的 cmets 的非常有限的测试,以下想法也可能有用:

    @Echo Off
    SetLocal EnableExtensions
    Set "Serial="
    Set "Vendor="
    For /F Tokens^=2^,4^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe
     CSProduct Assoc:List 2^>NUL') Do Set "Serial=%%G" & For /F %%I In ('
     %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -NoProfile
     "-Join '%%H'.ToUpper()[0..3]"') Do Set "Vendor=%%I" 
    If Not Defined Serial GoTo :EOF
    Echo %Vendor%-%Serial:~,-4%-%Serial:~-4%
    Pause
    

    这使用 PowerShell 仅从 WMIC 的 CSProduct 别名作为 Name 值返回的字符串中返回最多大写的前四个字符。所以Compaq 将返回COMPDell 作为DELLLenovo 作为LENO Samsung 作为SAMS 等等。然后这将作为序列号的前缀,(拆分为之前),在我的测试中作为 ComputerSystemProduct IdentificationNumber 返回。

    【讨论】:

    • 这会输出制造商的全长。我只是希望它将您自己输入的输入添加到最终输出中。所以它将是 %input%Serialnum-mber。但感谢惊人的脚本 =)
    • 不,它没有,分配给%Vendor%的字符串值包含完整的制造商字符串,但是,%Serial%,使用上面的代码只会以HP-Dell-开头根据要求,它后面将跟随返回的序列号,最后四个字符用连字符/破折号分隔。使用上面提交的代码,%Vendor% 字符串值的唯一可能输出可能是那些包含精确字符序列Hewlett-Packard 的输出,或者那些包含精确字符序列Dell 的输出。然后If 命令会缩短它。
    • 顺便说一句 @SemtexSoup,我在我的答案底部也提供了不健壮和疯狂的代码,所以如果你愿意,你可以继续引入不必要的问题。请注意,正如我已经提到的,最终用户可以直接点击[ENTER],或者可以在Set /P 提示符处输入任何他们想要的内容。这不仅包括完整的制造商字符串、(您不想要的) 或一般输入错误;还有毒字符或恶意字符串,(可能会退出脚本,损坏您的计算机或其数据,或者在不启用延迟扩展的情况下无法echo
    • 巧合的是,我目前正在修理的 PC 是一台 HP,在其内部 Insyde 被称为 CaptionDescriptionName、@ 987654349@ 和BIOSVersion。后者是一个字符串数组,其中包含一些前面提到的与Version 一起使用的字符串HPQOEM - 1。但是Manufacturer 字符串仍然是Hewlett-Packard。像往常一样,许多值取决于制造商正确配置的东西。 @KJ,%SystemRoot%\System32\wbem\WMIC.exe SystemEnclosure Get Manufacturer 返回什么?
    • 另外,我确信%SystemRoot%\System32\wbem\WMIC.exe BaseBoard Get Manufacturer,或者可能更好的%SystemRoot%\System32\wbem\WMIC.exe CSProduct Get Vendor 应该得到我们需要的信息。然而,目前,不管怎样,我已经发布了一个版本,它允许完美工作的最终用户输入所需的字符串。
    猜你喜欢
    • 2013-06-16
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多