【问题标题】:Batch scripting - Rewrite an output批处理脚本 - 重写输出
【发布时间】:2021-01-11 01:24:42
【问题描述】:

有没有办法使用批处理脚本重写输出?

C:\>icacls c:\amd | find/i "BUILTIN"
c:\amd BUILTIN\Administrators:(I)(OI)(CI)(F)
       BUILTIN\Users:(I)(OI)(CI)(RX)

我怎样才能只获得没有额外内容的用户/组,使其如下所示?

BUILTIN\Administrators
BUILTIN\Users

谢谢。

【问题讨论】:

标签: batch-file scripting url-rewriting output


【解决方案1】:

set 有一种方法可以替换从开始到(包括)定义的字符串的所有内容:set "var=*word=word"
因为这不适用于元变量(“for-variable”),所以我们必须将每一行分配给一个“普通”变量,然后将“从开头到包括 BUILTIN 的所有内容”替换为 BUILTIN,然后只需回显以冒号分隔的其余部分的第一个标记。

显然,icalcs 的输出与语言有关,因此请将 VORDEFINIERT 替换为您的 Windows 语言中的正确单词(英文为 BUILTIN):

@echo off
setlocal enabledelayedexpansion

set "folder=C:\tmp"

for /f "delims=" %%a in ('icacls %folder% ^|find "VORDEFINIERT"') do (
   set "line=%%a"
   for /f "delims=:" %%b in ("!line:*VORDEFINIERT=VORDEFINIERT!") do echo %%b
)

【讨论】:

  • 这是一个非常棘手(智能)的脚本,我试图弄清楚第二个循环在做什么,但我没有得到它。 :)
  • 答案的第二句有说明。在 For 循环集中 - 所有in (SET) 中,它利用Set 命令子字符串修改语法将所有内容替换为提供的值(包括提供的字符串)。阅读 cmd.exe 中Set /? 的输出以了解更多信息。 “技巧”的另一部分是简单地使用分号作为分隔符 -
  • - 如果不使用标记选项,则 delim 字符充当与 for 循环集中的字符串相关的行尾标记。 - 因此,包括分号在内的所有内容都将被忽略。 cmd.exe 中的for /? 会告诉你更多关于For 命令的语法用法
  • 谢谢你的详细解释,这对我帮助很大!
【解决方案2】:

当我在玩可能的修改时。我已经编写了下面的代码(谢谢斯蒂芬),所以我可以同时获取 BUILTIN 和 NT AUTHORITY 条目。 即使代码不干净而且有重复,它也可以工作。 为了 /?尽管我试图在网上其他地方查找它的参考资料和示例,但仍有很多东西要了解。

@echo off
setlocal enabledelayedexpansion

set "folder=C:\amd"

for /f "delims=" %%a in ('icacls %folder% ^| findstr BUILTIN') do (
   set "line=%%a"
   for /f "delims=:" %%b in ("!line:*BUILTIN=BUILTIN!") do echo %%b
)

for /f "delims=" %%a in ('icacls %folder% ^| findstr "NT AUTHORITY"') do (
   set "line=%%a"
   for /f "delims=:" %%b in ("!line:*NT AUTHORITY=NT AUTHORITY!") do echo %%b
)

这是实际的输出。

BUILTIN\Administrators
BUILTIN\Users
NT AUTHORITY\SYSTEM
NT AUTHORITY\Authenticated Users
NT AUTHORITY\Authenticated Users

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多