【问题标题】:Check which current network domain machine is in and run a command based on which domain it resides检查当前网络域机器所在的网络,并根据它所在的域运行命令
【发布时间】:2022-02-17 15:30:13
【问题描述】:

大家早上好..

尝试在 Windows 批处理中编写以下脚本,但结果并非如我所愿。

在我们的网络中,我们有三个主要域,DEV、QA 和 PRD,并且对于每个域,我们在这三个域中都有子域,因此举个例子:

开发人员
dev1.mydevdomain1.net,
dev2.mydevdomain2.net,
dev3.mydevdomain3.net,
dev4.lab.mydevdomain3.net

质量检查
qa1.myqadomain1.net,
qa2.myqadomain2.net,
qa3.test.myqadomain3.net,
qa4.myqadomain4.net

珠三角
prd1.myprddomain1.net,
prd2.test.myprddomain2.net,
prd3.myprddomain3.net,
prd4.myprddomain4.net

我们要做的是首先确定 Windows 批处理脚本当前所在的当前计算机所在的网络域,因此使用 env 变量 %USERDNSDOMAIN% 我得到:

dev1.mydevdomain1.net

所以我想我可以使用通配符执行以下操作,但它没有按预期工作:

IF %USERDNSDOMAIN% == *.mydevdomain1.net (echo "DEV 1 FOUND") ELSE IF %USERDNSDOMAIN% == *.mydevdomain2.net (echo "DEV 2 FOUND") ELSE IF %USERDNSDOMAIN% == *.mydevdomain3.net (echo "DEV 3 FOUND") ELSE (echo "DEV NOT FOUND)

最后我们要检测当前的 DEV、QA 或 PRD 域并复制一个文件。所以就像上面的代码示例,这是我们的最终目标:

如果当前机器位于 *.mydevdomain1.net*.mydevdomain2.net*.mydevdomain3.net*.myqadomain1.net*.myqadomain2.net*.myqadomain3.net THEN copy X file ELSE IF 机器位于 *.myprddomain1.net*.myprddomain2.net、@ 987654333@ THEN copy Y file.

注意它们所在的通配符。这有点重要。

任何帮助将不胜感激。

【问题讨论】:

  • 您不能在IF 命令中使用正则表达式。它只是纯字符串比较。
  • 您的IF 比较也与您的域名示例不匹配。您说它是 environment_domain.net 但您的通配符匹配根本不显示下划线。

标签: windows batch-file networking dns script


【解决方案1】:
for /f "delims=_" %%m in ("%USERDNSDOMAIN%") do (
 if /i "%%m"=="dev" (copy command[s] for dev)
 if /i "%%m"=="qa" (copy command[s] for qa)
 if /i "%%m"=="prd" (copy command[s] for prd)
)

请参阅提示中的for /?,了解它的工作原理。

--- 原始帖子编辑后

if /i "%userdnsdomain:*.=%"=="mydevdomain1.net" ECHO {copy command{s} for dev}
if /i "%userdnsdomain:*.=%"=="mydevdomain2.net" ECHO {copy command{s} for dev}
if /i "%userdnsdomain:*.=%"=="mydevdomain3.net" ECHO {copy command{s} for dev}
if /i "%userdnsdomain:*.=%"=="myqadomain1.net" ECHO {copy command{s} for qa}
if /i "%userdnsdomain:*.=%"=="myqadomain2.net" ECHO {copy command{s} for qa}
if /i "%userdnsdomain:*.=%"=="myqadomain3.net" ECHO {copy command{s} for qa}
if /i "%userdnsdomain:*.=%"=="myprddomain1.net" ECHO {copy command{s} for prd}
if /i "%userdnsdomain:*.=%"=="myprddomain2.net" ECHO {copy command{s} for prd}
if /i "%userdnsdomain:*.=%"=="myprddomain3.net" ECHO {copy command{s} for prd}

复制命令在哪里echoed 用于测试

--- 简化,给出评论并指出实际域极不可能是mydevdomain1.net...

for %%s in (mydevdomain1.net mydevdomain2.net mydevdomain3.net) do if /i "%userdnsdomain:*.=%"=="%%s" goto dev

...跟随弹跳的球。

---- 我的测试设置

@ECHO OFF
SETLOCAL
FOR %%u IN (
 dev1.mydevdomain1.NET dev2.mydevdomain2.NET dev3.mydevdomain3.NET
 dev1.mydevdomain0.NET dev99.mydevdomainmissing.NET dev3.mywrongdomain3.NET
 aq1.myQAdomain1.NET qa2.myqadomain2.NET qa3.myqadomain3.NET
 prd1.myprddomain1.NET prd2.myprddomain2.NET prd3.myprddomain3.NET
) DO SET USERDNSDOMAIN=%%u&CALL :process

GOTO :EOF

:process

for %%s in (mydevdomain1.net mydevdomain2.net mydevdomain3.net) do if /i "%userdnsdomain:*.=%"=="%%s" goto dev
for %%s in (myqadomain1.net myqadomain2.net myqadomain3.net) do if /i "%userdnsdomain:*.=%"=="%%s" goto qa
for %%s in (myprddomain1.net myprddomain2.net myprddomain3.net) do if /i "%userdnsdomain:*.=%"=="%%s" goto prd

ECHO "%userdnsdomain%" --^> "%userdnsdomain:*.=%" NOT found
GOTO :eof

:dev
ECHO "%userdnsdomain%" --^> "%userdnsdomain:*.=%" is dev - DO dev copies
GOTO :eof

:qa
ECHO "%userdnsdomain%" --^> "%userdnsdomain:*.=%" is qa - DO qa copies
GOTO :eof

:prd
ECHO "%userdnsdomain%" --^> "%userdnsdomain:*.=%" is prd - DO prd copies
GOTO :eof

%%u 循环只是将各种字符串分配给userdnsdomain 并在每个字符串上运行:process 例程。

echoed 的报告以类似的形式显示了测试的内容、派生字符串和结果

"dev1.mydevdomain0.NET" --> "mydevdomain0.NET" NOT found

---完全不同的方法

SET "majordomain="
for /f "delims= " %%s in (
 'findstr /i /e /L /c:" %userdnsdomain%" q71068320.txt 2^>nul'
) DO IF DEFINED majordomain (SET "majordomain=ambiguous") ELSE (SET "majordomain=%%s")

ECHO "%userdnsdomain%" --^> majordomain=%majordomain%

这是%%u 循环可以在测试框架中调用的:process 例程。

最初,majordomain 设置为 nothing

接下来的 3 行可以连接起来。为了便于阅读,我只是将它们显示为 3 行单独的行。

findstr 查找文件 q71068320.txt 中的所有行(名称不重要。它由 SO 问题编号组成,因此我可以将各种答案放在一起)/e End /L L迭代 /c:"string to find"/i 使匹配不区分大小写。请注意,要查找的字符串是 Space%USERDNSDOMAIN%。

文件q71068320.txt包含(测试示例)

dev dev1.mydevdomain1.NET
dev dev2.mydevdomain2.NET
dev dev3.mydevdomain3.NET
dev dev4.lab.mydevdomain1.net
qa aq1.myQAdomain1.NET
qa qa2.myqadomain2.NET
qa qa3.myqadomain3.NET
prd prd1.myprddomain1.NET
dev dev2.mydevdomain2.NET

即主域后跟一个空格和实际域名。

2^>nul 抑制来自findstr 的错误消息(“未找到”等) - 2>nul 通常会抑制错误消息,但^ 需要告诉cmd > 属于到findstr,而不是for

findstr 输出随后由for /f 分析,使用 Space 作为分隔符,并将找到的行的第一个“标记”分配给%%s(默认行为)。

如果找到一行,majordomain 将设置为检测到的行上的第一个标记。如果已设置,则文件中匹配的行不止一行,因此我们可能存在重复。

当在文件中找到所有匹配行时,majordomain 设置为文件第 1 列中指定的主域,或者如果匹配多行,则设置为 ambiguous,或者设置为 nothing 意思是“没有找到”。

---小调整---

SET "majordomain="
FOR /f "tokens=1*delims=." %%b IN ("%userdnsdomain%") DO (
 for /f "delims= " %%s in (
  'findstr /e /L /c:" %%c" q71068320e.txt 2^>nul'
 ) DO IF DEFINED majordomain (SET "majordomain=ambiguous") ELSE (SET "majordomain=%%s")
)

ECHO "%userdnsdomain%" --^> majordomain=%majordomain%

ECHO GOTO do%majordomain%copy

文件q71068320e.txt 包含的位置

dev mydevdomain1.NET
dev mydevdomain2.NET
dev mydevdomain3.NET
dev lab.mydevdomain1.net
qa myQAdomain1.NET
qa myqadomain2.NET
qa myqadomain3.NET
prd myprddomain1.NET
dev mydevdomain2.NET

这里, for ... %%b 标记了userdnsdomain', putting that part before the first .(the delimiter) into%%band the remainder of the string (token*) into %%c. Match for <kbd>Space</kbd>%%c in the revised file q71068320e.txt 中的字符串(名称的开头部分已被删除)。

请注意,例如 echoed 的 goto 命令会显示 goto dodevcopy。如果majordomain 为空,则会到达docopydoambiguouscopy 如果 majordomain 设置为 ambiguous

就个人而言,我不喜欢使用关键字作为标签,因此doXXXcopy

...但是当我记录这一点时,我想到了一个更好的方法:

SET "majordomain="
for /f "delims= " %%s in (
 'findstr /e /L /c:" %userdnsdomain:*.=%" q71068320e.txt 2^>nul'
) DO IF DEFINED majordomain (SET "majordomain=ambiguous") ELSE (SET "majordomain=%%s")

ECHO "%userdnsdomain%" --^> majordomain=%majordomain%

ECHO GOTO do%majordomain%copy

这避免了额外的for 循环,并搜索“Space%userdnsdomain:*.=%”,即userdnsdomain,所有字符直到第一个. (*. ) 替换为 nothing

【讨论】:

  • 谢谢 Magoo.. 我更新了第一篇文章,因为“_”是错误的,应该是“。”而 DEV、QA 和 PRD 子域实际上是像 dev1 那样划定的。开发2。开发者3。 qa1.etc.. 另外,我们实际上只是想检查 dev1 之后的内容。或 qa1。这是最重要的。 :) 所以我们需要检查 mydevdomain1.net、mydevdomain2.net 或 myqadomain1.net.. 在它不那么重要之前的任何东西。
  • 这与我们想要做的非常接近,因为现在正在捕获 %userdnsdomain% 的部分,这是 dev1 之后的部分。或 qa1。或prd1。天。现在下一部分是如何使用 OR 命令之类的东西将所有 DEV 项目集中在一起,如下所示:if /i "%userdnsdomain:*.=%"=="mydevdomain1.net" goto DEV if /i "%userdnsdomain:*.=%"=="mydevdomain2.net" goto DEV if /i "%userdnsdomain:*.=%"=="mydevdomain3.net" goto DEV :DEV: Echo "DEV Environment found" 现在必须弄清楚 QA 和 PRD 部分,就好像我添加了额外的 QA 和 PRD 一样。
  • 所以效果更好,但作为测试“dev1.mydevdomain1.net”是我的主要网络域,所以有两个问题:1)如果我故意错误命名我在脚本中所在的域“所以它现在“mydevdomain0.net”所以它不应该找到它并忽略它仍然在 goto 下回显它:DEV echo“DEV Environment found”而它不应该有,因为现在没有任何条目有效(这只是一个测试) (
  • 再次感谢 Magoo! \o/ 这让我更接近但是如果我将行 ) DO SET USERDNSDOMAIN=%%u&CALL :process 更改为 ) DO SET %USERDNSDOMAIN%=%%u&CALL :process 它基本上会在 dev1 之后找到整行。而您发布的内容仅显示了其中的一部分并且没有找到它。此外,另一个更正.. 一些域有更多字符,所以虽然“dev1.mydevdomain1.net”很常见,但我们也有 dev4.lab.mydevdomain1.net。您当前形式的脚本仅找到“mydevdomain1.net”,但还需要找到类似“lab.mydevdomain1.net”的内容。
  • 那是因为SET %USERDNSDOMAIN%=%%u 设置了一个名为(the current contents of the variable "USERDNSDOMAIN") 的变量。 for %%u 循环只是将各种值分配给USERDNSDOMAIN,然后以这些值作为演示执行:process。如果您在%%u 列表中包含dev4.lab.mydevdomain1.net 并在适当的%%s 列表中包含“lab.mydevdomain1.net”,则应该检测到正确的值。显示屏只显示User... 的原始值和%%s 测试的导出值(即删除第一个. 之前的字符串)
猜你喜欢
  • 2023-03-09
  • 2023-03-25
  • 2011-02-07
  • 2021-12-20
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多