我正在努力处理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求值肯定有问题,但是无法弄清楚。
答案 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