批处理文件-无法在子例程中剥离变量

时间:2018-09-17 07:09:07

标签: batch-file cmd

我正在努力处理Windows批处理文件,该文件将在SERVER上定期运行,并将评估网络中的所有计算机,然后提取新文件和更改过的文件以备份NAS设备。我决定让这种方法只有1个脚本来维护150台计算机上的150个备份。

我遇到的问题是我需要提取计算机名称,该计算机名称存储在.txt文件中为:

名称:computername.domain.name 改为纯计算机名称:

计算机名。域名。

我是通过将.txt文件内容拉入VARIABLE来做到这一点的,然后在SUB例程:SUBfound

中删除了前9个字符
 setlocal enabledelayedexpansion
 for /L %%i in (0,1,255) do (call :SUBscan 192.168.79.%%i)

:SUBscan ip
 echo|set /p dummyOutput="Scanning %1 ... "
 ping -n 1 -w 200 -4 %1 >nul
 if %ERRORLEVEL% NEQ 0 (echo not a computer) else (
   if exist "\\%1\d$\DataFolder\" (call :SUBfound %1) else (call :SUBnotfound %1)
 )
 EXIT /B

:SUBfound
 set targetname=<backup_id.txt
 set "targetname=!targetname:~9!"
 ...other code
EXIT /B

但:SUBfound中的目标名称不计算:

 echo !targetname!  -->  echoes me:~9!
 echo %targetname%  -->  echoes !targetname!

我知道子例程中变量的SET求值肯定有问题,但是无法弄清楚。

1 个答案:

答案 0 :(得分:1)

MC ND在他的评论中诊断出了您的问题。

您无法使用简单的SET来读取文件,而必须使用SET /P

set /p "targetname=" <backup_id.txt

但是还有另一种使用FOR / F的方法,允许您一步一步直接读取该值。将DELIMS设置为冒号和空格,并将TOKENS设置为2。

假设您的文件只有一行,那么

for /f "tokens=2 delims=: " %%A in (backup_id.txt) do set "targetname=%%A"

如果有多行,并且该值在第一行中,则

set "targetname="
for /f "tokens=2 delims=: " %%A in (backup_id.txt) do if not defined targetname set "targetname=%%A"

for /f "tokens=2 delims=: " %%A in (backup_id.txt) do set "targetname=%%A" & goto skip
:skip
相关问题