Batch file 将findstr设置为要引用的变量

Batch file 将findstr设置为要引用的变量,batch-file,Batch File,所以本质上,我想将findstr的输出设置为一个变量,并在if语句中对此进行测试,看看它是否拾取了它。我尝试过直接读取输出和读取文本文件,但我觉得这不是问题所在。 这是批处理文件 cd C:\ cd "Program Files\Microsoft Office\Office16" @Echo on cscript ospp.vbs /dstatus @Echo off cscript ospp.vbs /dstatus > C:\ospp.txt Echo ========Output

所以本质上,我想将findstr的输出设置为一个变量,并在if语句中对此进行测试,看看它是否拾取了它。我尝试过直接读取输出和读取文本文件,但我觉得这不是问题所在。 这是批处理文件

cd C:\
cd "Program Files\Microsoft Office\Office16"
@Echo on
cscript ospp.vbs /dstatus
@Echo off
cscript ospp.vbs /dstatus > C:\ospp.txt
Echo ========Output Saved to C:\ospp.txt=========
PAUSE
SETLOCAL ENABLEEXTENSIONS
REM set /p input="Please type the 5 digit office key: "
CALL for /F "delims=" %%a in ('dir ^| findstr /c:12345 ') do set input=%%a
IF [%input%] == [] GOTO EXIT
IF [%input%] == [12345] GOTO 12345
IF [%input%] == [54321] GOTO 54321
REM cscript ospp.vbs /unpkey:%input%
echo Key would be removed.
PAUSE
GOTO:eof
:EXIT
    Echo Insufficiant parameters.
    PAUSE
    GOTO:eof
:12345
    echo Key ending in "12345" already active
    PAUSE
    GOTO:eof
:54321
    echo Key ending in "54321" already active
    PAUSE
    GOTO:eof
我将12345和54321设置为测试变量。这个批处理文件应该删除不应该存在的office密钥,所以为了问这个问题,我删除了实际的密钥字符。 我不知道在没有安装office的情况下这是否可以工作。 我不想要的输出是

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

---Processing--------------------------
---------------------------------------
PRODUCT ID: 00339-23800-39315-AA300
SKU ID: c47456e3-265d-47b6-8ca0-c30abbd0ca36
LICENSE NAME: Office 16, Office16ProPlusVL_MAK edition
LICENSE DESCRIPTION: Office 16, RETAIL(MAK) channel
LICENSE STATUS:  ---LICENSED---
Last 5 characters of installed product key: 12345
---------------------------------------
---------------------------------------
---Exiting-----------------------------
========Output Saved to C:\ospp.txt=========
Press any key to continue . . .
Key would be removed.
Press any key to continue . . .

如果您坚持为此使用批处理文件,下面是我建议您如何执行任务的示例:

@For/F“Tokens=1*Delims=:”%%G In(“^”“%\uuuuu AppDir\uuuuuuu%cscript.exe”^
%ProgramFiles%\Microsoft Office\Office16\OSPP.VBS”/DStatus 2^>NUL^
^|“%\uuuu AppDir\uuuu%find.exe”“Last 5”^”Do@For%%I In(%%H
)Do@If/I非“XXXXX”==“%%I”“%\uuuuu AppDir\uuuuuu%cscript.exe”^
%ProgramFiles%\Microsoft Office\Office16\OSPP.VBS”/UnPKey:%%I
您只需更改第四行的
XXXXX
,以匹配实际有效的最后五个产品关键字符

实际上是一行,为了便于阅读,分为五行:

@For/F“Tokens=1*Delims=:“%%G In('^”“%%uuuu-AppDir\uuuu%cscript.exe”“%ProgramFiles%\Microsoft Office\Office16\OSPP.VBS”/DStatus 2^>NUL^ |“%%uu-AppDir\uuuuu%find.exe”“Last 5”^“)Do@For%%I In(%%H)Do@If/I Not“XXXXX=”%%I”“%%I”“%%uu-AppDir

呼叫…
无法工作,只能
呼叫…
。而且
findstr/c:12345
将永远找不到
54321
我知道它不会检查54321,我现在只检查一个,一旦它起作用,我会检查另一个。我正在使用call,这样当线路出现故障时,它不会立即关闭窗口。编辑:删除调用后,它不再关闭,但始终会导致“密钥将被删除”,即使在我的实时构建中,实际密钥替换为12345。如果findstr找不到任何内容,则部分
set input=%%a
将永远不会执行,
input
仍然具有开始批处理之前的内容。最好在循环之前使用
set“input=“
”,因此在实时构建开始时将其设置为nothing,它仍然会被删除,因此它被设置为非关键的内容。你知道那会是什么吗?
'dir^ findstr/c:12345'
看起来不对劲。系统驱动器根目录下的
dir
的输出实际上可能包含该序列,您看过了吗?为什么
dir
?您不应该读取文件吗?请注意,上面的代码将卸载您的Microsoft Office产品密钥(如果存在),并且其最后五个字符与不区分大小写的字符串
XXXXX
不匹配。在没有从一开始就确定后果的情况下,不要运行它!这是不是假设只有一把钥匙?很抱歉在OP中没有说得更清楚,但问题是以前安装的Office的不同版本中有多个密钥处于活动状态。目标是卸载不起作用的旧密钥,同时保留好的密钥。至少有一个键,最多4个。是的,它假定有一个键。但是,可以对其进行更新/修改,以允许多个允许的五字符组合。你试过做那些修改吗?如果是这样,你尝试了什么?若否,原因为何?(20个小时是很长的时间)。因为我还有其他事情要做,这个批量项目只是我要做的一件事。老实说,我对上述代码的作用只有一个模糊的概念。@Thomas,我在回答下面的评论告诉你它的确切作用。