无法让 NET SHARE 使用间隔变量

问题描述 投票:0回答:2

我正在尝试编写一个批处理文件来遍历现有的网络共享并删除所有非管理共享。

这是我的代码:

FOR /F "USEBACKQ SKIP=1 TOKENS=*"  %%j IN (`wmic /node:192.168.0.101 SHARE WHERE "Name like '%%[^$]'" GET NAME ^| findstr /r /v "^$"`) DO NET SHARE %%j /DELETE

SKIP=1
用于跳过 wmic 返回的元列信息

findstr /r /v "^$"
用于从 wmic 返回中删除尾随白线,该白线在
%%j

中被捕获

现在,这仅适用于中间不包含空格的共享名。

为了补救,我已经尝试过(效果也不好):

FOR /F "USEBACKQ SKIP=1 TOKENS=*"  %%j IN (`wmic /node:192.168.0.101 SHARE WHERE "Name like '%%[^$]'" GET NAME ^| findstr /r /v "^$"`) DO NET SHARE "%%j" /DELETE

此外,尝试在引号中回显

%%j
变量会导致以下结果:

FOR /F "USEBACKQ SKIP=1 TOKENS=*"  %%j IN (`wmic /node:192.168.0.101 SHARE WHERE "Name like '%%[^$]'" GET NAME ^| findstr /r /v "^$"`) DO @ECHO "%%j"

只打印单引号的地方

请帮忙!

batch-file share wmic
2个回答
0
投票

wmic
出于某种疯狂的原因输出行尾带有twoCR:CR CR LF。包括 FINDSTR 和 CMD 在内的 Windows 仅将 CR LF 作为行尾,而将其他 CR 作为数据的一部分,因此
echo "somestuff     <CR>"
仅在最左边的列中生成带有
"
的显示。在 W10(我假设是 11)中,如果您重定向到一个文件并在记事本中打开它,您将看到它将这些解释为“Macintosh (CR)”换行符。

Windows 工具在处理意外控制字符方面通常不灵活。我在 CMD/批处理文件中找到的唯一方法是延迟扩展技巧:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "USEBACKQ SKIP=1 TOKENS=*"  %%j IN (`wmic ...`) DO @(SET "X=%%j" & ECHO {!X:~0,-1!})

但是,您很快就会看到这会留下一堆由

wmic
输出的尾随空格,这会导致例如
net share "blah blah      " /delete
失败,我不知道有什么方法可以删除尾随空格,同时保留您想要的嵌入空格。

如果您使用 powershell 的

(get-smbshare).name
,则不会有任何问题(没有额外的 CR 和多余的空格,也没有标题行和空行)。但如果您使用 powershell,您也可以使用它的过滤并通过一个命令完成整个工作:

remove-smbshare ((get-smbshare).name -notmatch "\$") -force

这不再是你问的问题。


0
投票

您可以使用单个

WMIC
命令完成所有这些操作,无需
For
循环,也无需涉及
FindStr
Share
net.exe
选项:

@%SystemRoot%\System32\wbem\WMIC.exe Share Where "Type < 2147483648" Call Delete
© www.soinside.com 2019 - 2024. All rights reserved.