![获取 CMD 命令的输出并将其设置为批处理变量](https://linux22.com/image/1554529/%E8%8E%B7%E5%8F%96%20CMD%20%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E5%B9%B6%E5%B0%86%E5%85%B6%E8%AE%BE%E7%BD%AE%E4%B8%BA%E6%89%B9%E5%A4%84%E7%90%86%E5%8F%98%E9%87%8F.png)
我运行此命令来获取组的名称:
set "remotegroup="
for /f "skip=1delims=" %%a in (
'"wmic group where sid="S-1-5-32-555" get name"'
) do if not defined remotegroup set "remotegroup=%%a"
但是当我这样做时echo "%rdpgroup%"
输出是这样的:
"Remote Desktop Users "
我不希望在 users 末尾出现这些空格。我只想要这样的输出:"Remote Desktop Users"
答案1
WMIC 的输出是 unicode !
<CR>
可以通过将值传递到另一个 FOR /F 循环来删除尾部。这还会删除幻影“空白”行(实际上是<CR>
)
@echo off
set "remotegroup="
for /f "skip=1 delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name"') do (
for /f "delims=" %%b in ("%%a") do if not defined remotegroup set "remotegroup=%%~nb"
)
echo "%remotegroup%"
pause
答案2
用不同的方法得到相同的结果作者:ThunderJun:
OP1:这里我们使用 setlocal 来激活延迟类型的特殊变量的使用(!var!)而无需在另一个 for 中使用 for。以获得相同的结果。
OP2:在这里,我们将命令分配到一个通用类型变量中,并借助竖线将多个命令组合在一起,始终优先考虑优先级。我们添加过滤器:more +1 以指示忽略第一个输出行,然后添加过滤器:findstr /i "remot" 和另一个竖线,通过这个我们指示,只打印包含引号中的关键字且不区分大小写字母的行。然后我们使用一个通用类型变量来指示它,不显示最后 3 个字符:%var:~0,-3% 这样,我们无需在另一个 for 中使用 for 即可获得相同的结果。
OP3:在这里我们使用 setlocal 来激活延迟类型的特殊变量的使用(!var!)。在 for 中的命令末尾有一个竖线。为此,我们使用命令 findstr /i“remot”指定一个过滤器,表示它只打印引号中带有关键字的行,并且不区分大小写字母。我们使用延迟类型的特殊变量来捕获命令输出,并表示用 2 个空格字符替换为空(!var:=!),以实现相同的结果,而无需在另一个 to 中使用 for。
@echo off
:::::::::::::OP1 START. BY ThunderJun
setlocal enabledelayedexpansion
set remotegroup=
for /f "skip=1 delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name"') do (
set remotegroup=%%a!remotegroup:~0,-4!
set rio=!remotegroup:~0,-1!
set remotegroup=!rio:~0,-1!
)
echo OP1 "%remotegroup%"
:::::::::::::OP1 END
:::::::::::::OP2 START. BY ThunderJun
set a='"wmic group where sid="S-1-5-32-555" get name |more +1 |findstr /i "remot""'
for /f "delims=" %%c in (%a%) do (set remotegroup=%%c)
echo OP2 "%remotegroup:~0,-3%"
:::::::::::::OP2 END
:::::::::::::OP3 START. BY ThunderJun
setlocal enabledelayedexpansion
set remotegroup=
for /f "delims=" %%a in ('"wmic group where sid="S-1-5-32-555" get name |findstr "remot""') do (
set remotegroup=%%~na& set remotegroup=!remotegroup: =!)
echo OP3 "%remotegroup%"
:::::::::::::OP4 END
pause