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 为空,则会到达docopy; doambiguouscopy 如果 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