[英]Batch file variable filenames and editing
这是游戏的新手,并花了许多时间寻找帮助和示例。 尽管我想通过使用单个输入文件'computer_listc.txt'来简化此过程,但我已经有了一个可以正常工作的版本。 我基本上想读取一系列文件夹路径(来自computer_listc.txt),并使用路径的一部分来编写其他cmd表达式。
我的问题是fname和comp_id的设置不正确。 我想使它们等于T(文件名),然后对其进行编辑。
fname必须是已删除前12个字符的文件路径。 当comp_id需要等于文件路径中指定的计算机名时,例如
fname = c_modelling\model\slave1
comp_id = VOSTRO460-1
这是脚本。 你能看到我的错误吗?
for /f "usebackq tokens=*" %%T in ("C:\c_modelling\Model\cal21_cal\Computer_ListC.TXT") do (
set fname = %%T
ren fname "%fname%" "C:\%fname%:~12%"
set comp_id = %%T
%comp_id% = %{comp_id:0:12}
mkdir %%T > NUL 2>&1
echo cd %fname% >\\%%T\beo_insC.cmd
echo beo >>\\%%T\beo_insC.cmd
robocopy c:\c_modelling\model\cal21_cal \\%%T\ /s /e
start cmd.exe /c psexec \\%comp_id% -c c:\c_modelling\model\cal21_cal\beo_insC.cmd
del \\%%T\beo_insC.cmd
)
Computer_ListC.txt包含以下文件名:这最终将具有一长串计算机文件夹路径。
VOSTRO460-1\c_modelling\model\slave1
VOSTRO460-1\c_modelling\model\slave2
我正在创建一个* .cmd文件以与“ psexec”一起使用,因为当我将进程定向到本地计算机时,该路径默认为\\ system32。
任何帮助都将非常有帮助!
第一个问题是字符串SET
语句中的空格很重要。 变量名和分配的值都将包含任何空格,因此set fname = %%T
将设置一个名为"fname "
而不是"fname"
的变量-其值将包含%%T
值之前的前导空格
接下来是永久的延迟扩展问题。 在一个block
(带括号的语句序列)内,任何%var%
都将在PARSE时被其值替换-在循环开始执行之前。
要访问RUN-TIME值,您需要执行SETLOCAL ENABLEDELAYEDEXPANSION
语句,并在调用delayedexpansion
!var!
访问RUN -time变量值。
但是请注意,您不能在有罪不罚的循环内简单地调用delayedexpansion
。 一次可以打开的数量是有限制的,因此您需要使用ENDLOCAL
命令“将括号ENDLOCAL
(达到逻辑End-Of-File等效于ENDLOCAL
),缺点是ENDLOCAL
可以恢复调用匹配的SETLOCAL
时将环境恢复为其值。 因此,通常在批处理开始时(通常在@echo off
之后)执行SETLOCAL ENABLEDELAYEDEXPANSION
下期是
ren fname "%fname%" "C:\%fname%:~12%"
重命名命令的语法为ren sourcename newname
恰好两个参数,将任何包含空格的参数括在"rabbit's ears"
此外,目标名称仅是NAME-而不是路径。
然后是这个:
%comp_id% = %{comp_id:0:12}
假设您已修复此问题以删除变量名中的空格,并且已为comp_id
分配了值fred
并且您已经意识到您正在处理comp_id
的RUN -time值,那么现在将显示为
!comp_id!=%{comp_id:0:12}
批处理将解释为
fred=%{comp_id:0:12}
并及时放弃。
您可能期望做的是
set comp_id=!comp_id:~0,12!
也就是说,从第一个字符( 0
)到12
字符,将comp_id
设置为comp_id
的运行时值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.