对游戏相当陌生,花了很多时间寻找帮助和示例。我已经有一个可以工作的版本,尽管我想通过使用单个输入文件“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
我正在创建一个与“psexec”一起使用的 *.cmd 文件,因为当我将进程定向到本地计算机时,路径默认为\system32。
任何帮助都会非常有帮助!!
最佳答案
第一个问题是字符串 SET
语句中的空格很重要。变量名和分配的值都将包含空格,因此 set fname = %%T
将设置名为 "fname "
的变量,而不是 "fname"
- 其值将在 %%T
接下来是永久延迟扩展问题。在 block
(括号内的语句序列)内,任何%var%
都将在PARSE时间(在执行循环之前)被其值替换开始。
要访问RUN-TIME值,您需要执行SETLOCAL ENABLEDELAYEDEXPANSION
语句,并且在调用delayedexpansion
时, !var!
访问RUN时间变量值。
但请注意,您不能简单地在循环中调用delayedexpansion
而不受惩罚。任何一次可以打开的数量是有限的,因此您需要使用 ENDLOCAL
命令“关闭括号”(到达逻辑文件结尾相当于 >ENDLOCAL
),缺点是当调用匹配的 SETLOCAL
时,ENDLOCAL
将环境恢复到其值。因此,SETLOCAL ENABLEDELAYEDEXPANSION
通常在批处理开始时执行,通常是在 @echo off
下一期是
ren fname "%fname%" "C:\%fname%:~12%"
重命名命令的语法是ren sourcename newname
- 正好两个参数,将任何包含空格的参数括在“兔子耳朵”
此外,目标名称只是一个NAME -不是路径。
然后是这样的:
%comp_id% = %{comp_id:0:12}
假设您已修复此问题以删除变量名称中的空格,并且 comp_id
已被分配值 fred
并且您已经意识到您正在处理 < strong>RUN-comp_id
的时间值,那么现在将显示为
!comp_id!=%{comp_id:0:12}
哪个批处理将解释为
fred=%{comp_id:0:12}
然后立即放弃。
您可能期望做的是
set comp_id=!comp_id:~0,12!
即将 comp_id
设置为 comp_id 的 RUN 时间值,从第一个字符 (0
) 开始,对于 12
个字符。
关于windows - 批处理文件变量文件名和编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799443/