我正在尝试在文本文件中列出用户号码;;
e.g.
002
003
004
.
.
.
408
409
etc
...根据此号码创建IP地址,建立与IP地址的连接,然后将文件夹从此位置复制到网络位置;
REM *******************************************************************
REM Get User number from Text File and remove leading zero's if present
REM *******************************************************************
FOR /F "tokens=* delims=0" %%A IN (C:\Users.txt) DO SET host=%%A
pause
REM **************************************
REM Calculate IP Address from User number
REM **************************************
If %host% gtr 250 goto :continue
set userip=18.100.%host%.100
goto :IPAttained
:continue
If %host% gtr 500 goto :continue2
set /a host=%host% - 250
set userip=18.101.%host%.100
goto :IPAttained
:continue2
set /a host=%host% - 500
set userip=18.102.%host%.100
:IPAttained
pause
net use N: \\%userip%\d$ /user:%%Acom\master password
xcopy "\\%userip%\d$\Time Sheet" "\\NetworkLocation\Users\%%Acom\Time Sheet" /E /C /R /I /K /Y
net use N: /delete
)
到目前为止它似乎有效...但是它会遍历整个列表,然后计算出文本文件中最后一行的IP地址!!
我希望它能在每一行中运行,但我不确定我在这里缺少什么。希望这是有道理的。
答案 0 :(得分:1)
你的问题是你的for循环在文件中旋转,除了设置变量之外什么都不做,所以每次迭代都会重置它,有效地在循环结束时将值存储在最后一行。我无法测试这个,但这里有一些示例代码可以解决这个问题。
set line=0
set ohost=000
:top
REM *******************************************************************
REM Get User number from Text File and remove leading zero's if present
REM *******************************************************************
FOR /F "skip=%line% tokens=* delims=0" %%A IN (C:\Users.txt) DO @( SET host=%%A&goto break)
:break
set /a line=line+1
if %host% EQU %ohost% (
goto :EOF
) else (
set ohost=%host%
)
REM **************************************
REM Calculate IP Address from User number
REM **************************************
If %host% gtr 250 goto :continue
set userip=18.100.%host%.100
goto :IPAttained
:continue
If %host% gtr 500 goto :continue2
set /a host=%host% - 250
set userip=18.101.%host%.100
goto :IPAttained
:continue2
set /a host=%host% - 500
set userip=18.102.%host%.100
:IPAttained
pause
net use N: \\%userip%\d$ /user:%%Acom\master password
xcopy "\\%userip%\d$\Time Sheet" "\\NetworkLocation\Users\%%Acom\Time Sheet" /E /C /R /I /K /Y
net use N: /delete
)
goto top
答案 1 :(得分:1)
您的代码的主要问题是所有地址逻辑都不在for
do
子句中,因此,输入文件被重新编译,将每行的值分配给变量,当最后一行被引用时,for
命令完成其工作并继续批处理文件。
另一种方法是将所有地址管理移动到为从输入文件中提取的每个值调用的子例程,并将readed值作为参数传递
FOR /F "delims=" %%A IN (C:\Users.txt) DO call :process %%A
pause
exit /b
:process
rem read passed parameter
set "host=%1"
If %host% gtr 250 goto :continue
set /a host=1%host%-1000
set userip=18.100.%host%.100
goto :IPAttained
:continue
If %host% gtr 500 goto :continue2
set /a host=%host% - 250
set userip=18.101.%host%.100
goto :IPAttained
:continue2
set /a host=%host% - 500
set userip=18.102.%host%.100
:IPAttained
pause
net use N: \\%userip%\d$ /user:%1com\master password
xcopy "\\%userip%\d$\Time Sheet" "\\NetworkLocation\Users\%1com\Time Sheet" /E /C /R /I /K /Y
net use N: /delete
goto :eof
或者您可以将代码置于do
子句(括号括起来)中,但必须重新格式化此工作方式,因为在goto
块内执行的任何for
命令都会自动完成处理for
。它更加清晰和有效,但“需要”延迟扩展才能发挥作用
@echo off
setlocal enableextensions enabledelayedexpansion
for /f "delims=" %%a IN (C:\Users.txt) DO (
if %%a gtr 500 (
set /a "host=%%a-500"
set "userip=18.102.!host!.100"
) else if %%a gtr 250 (
set /a "host=%%a-250"
set "userip=18.101.!host!.100"
) else (
set /a "host=1%%a-1000"
set "userip=18.100.!host!.100"
)
net use N: \\!userip!\d$ /user:%%acom\master password
xcopy "\\!userip!\d$\Time Sheet" "\\NetworkLocation\Users\%%acom\Time Sheet" /E /C /R /I /K /Y
net use N: /delete
)
endlocal
pause
答案 2 :(得分:1)
@ECHO OFF
SETLOCAL
FOR /f %%a IN (q24533225.txt) DO (
CALL :copyts %%a
)
GOTO :EOF
:copyts
SET host=%1
:copytsl
IF DEFINED host IF %host:~0,1%==0 SET host=%host:~1%&GOTO copytsl
SET /a nic=100
:SEThostl
IF %host% gtr 250 set /a nic+=1&SET /a host-=250&GOTO sethostl
SET "userip=18.%nic%.%host%.100"
ECHO(net use N: \\%userip%\d$ /user:%1com\master password
ECHO(xcopy "\\%userip%\d$\Time Sheet" "\\NetworkLocation\Users\%1com\Time Sheet" /E /C /R /I /K /Y
ECHO(net use N: /delete
GOTO :eof
看起来你想要18.100.1-250.100,18.101.1-250.100,18.102.1-250.100等。
上述例程只需ECHO
所需的命令。测试和验证后,删除三个ECHO(
以激活命令。
我使用了一个名为q24533225.txt
的文件,其中包含我的测试数据。当然,文件名不重要 - 但要非常小心地测试正在进行计算的008
,009
和249..251
的任何解决方案。不幸的是,您不必指定这些情况下的结果应该是什么,我们不得不从您的代码中推导出公式并做出假设。