谢谢你检查我的问题,我想。
这里有一些背景信息,说明为什么我需要完成这个任务.我的工作政策要求配备网络摄像头的笔记本电脑和平板电脑在BIOS中禁用它们。现在我们是远程办公,我们需要在BIOS中启用网络摄像头。我们有一些工具可以用来在系统运行时启用BIOS功能。我想写一个脚本,让psexec进入一台机器,获取厂商信息并将其存储在一个变量中,一旦psexec退出,就可以在脚本中进行访问。我想我可以顺利地写出剩下的脚本,但是我不知道如何将下面命令的结果存储在一个变量中。
wmic csproduct get vendor /format:list | findstr/c=
例如,在我的机器上,这个命令的输出是:
Vendor=Dell Inc.
我想捕捉输出结果并将其存储在一个变量中 以便以后在我要写的脚本中使用 这样我就可以处理特定厂商的BIOS操作。我已经尝试过 set sysvend=wmic csproduct get vendor /format:list | findstr/c=
但当我回应 %sysvend%
如果它的工作,我得到以下而不是我想要的。wmic csproduct get vendor /format:list | findstr/c=
如果有人知道怎么做,我会非常感谢你的帮助。我对确定供应商的其他选择持开放态度。
比使用 find
或 findstr
而没有问题的 0x0D0D0A
行结束。
@Echo Off & SetLocal EnableExtensions
For /F Tokens^=6Delims^=^" %%G In (
'%__APPDIR__%wbem\WMIC.exe CSProduct Get Vendor /Format:MOF 2^>NUL'
) Do Set "vendor=%%G"
这个解决方案还可以防止不需要的尾部字符 与供应商名称字符串, 这可能是一个常见的情况。
有一个已知的 wmic
错误,所以您需要解析 wmic
使用两个嵌套循环进行输出,例如,如下所示。
FOR /F "tokens=1* delims==" %%s IN ('
wmic csproduct get vendor /value ^| find "="
') DO for /F "tokens=*" %%i in ("%%t") do SET "vendor=%%i"
这里的 for
循环是
%%s
检索到的 vendor
值。%%i
去掉结尾 回车 在返回的值(wmic
行为):每个输出行以 0x0D0D0A
(CR+CR+LF),而不是普通的。0x0D0A
(CR+LF)。参见Dave Benham的 WMIC
和 FOR /F
: 修正尾部的问题 <CR>
问题
发布的答案是为了证明命令可以作为一个变量来分配和执行,与Neko的答案相反,根据OP的问题。
@Echo Off
Set Get.Vendor=^>"%TEMP%\Vendor.log" (wmic csproduct get vendor /value ^|
findstr /c:=) ^&^& (For /F "UsebackQ Tokens=2* Delims==^EOL" %%A In ("%TEMP%\Vendor.log") Do For /F "Delims=" %%T In ("%%A") Do Set "Vendor=%%~T") ^&^& Echo.!Vendor!
Setlocal EnableDelayedExpansion
%Get.Vendor%
pause
使用 for %%i in (wmic csproduct get vendor /format:list ^| findstr/c=) do (set var=%%~I)
这样做的结果是,for循环变量 %%i
成为for循环中命令的输出,允许你设置另一个变量作为for循环变量。你需要在前面的 |
因为如果不这样做,命令就会从for循环中流出,而不会在for循环中执行。你也可以用双引号将命令包围起来 ("
),你就不需要转义管了。由于命令。 %var%
将等于你的wmic命令的输出。
最后的命令将是:
@echo off
for /f "tokens=* delims==" %%i in (' wmic csproduct get vendor /format:list ^| findstr /c:"=" ') do (set var=%%~i)
echo %var%
rem echoing var to make sure the variable is what you wanted
Output for me:
Vendor=Microsoft Corporation
如果你希望输出是 Microsoft Corporation
具体来说,你可以加。
set var=%var:~7%
去掉前7个字符。你也可以将代币改为 2*
而不是 *
. :
for /f "tokens=2* delims==" %%j in (' wmic csproduct get vendor /format:list ^| findstr /c:"=" ') do (set var=%%~j)
注:产出。
Microsoft Corporation
注释:在批处理文件中,与powershell不同的是,你不能将一个变量设置为命令,并使其成为输出。
在批处理文件中,与powershell不同,你不能将一个变量设置为命令,并让它成为输出,这就是为什么传统的将命令的输出设置为变量的方法是使用 for
循环。另外,只是偏好,我建议使用 /value
转而 /format:list
.
经过测试,我的工作