批处理文件变量文件名和编辑

时间:2013-07-23 00:06:12

标签: windows batch-file

相当新的游戏,花了很多时间寻找帮助和示例。我有一个版本的工作,虽然我想通过一个输入文件'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。

任何帮助都会非常有用!!

1 个答案:

答案 0 :(得分:4)

第一个问题是字符串SET语句中的SPACES很重要。变量名和赋值的值都包含任何空格,因此set fname = %%T将设置名为"fname "的变量,而不是"fname" - 并且其值将包含值{{{{1}之前的前导空格。 1}}

接下来是永久性延迟扩张问题。在%%T(一系列带括号的语句)中,任何block将被 PARSE 时的值替换 - 在循环开始执行之前。

要访问 RUN-TIME 值,您需要执行%var%语句,并且在调用SETLOCAL ENABLEDELAYEDEXPANSION时,delayedexpansion会访问 RUN - 时间变量值。

但请注意,您不能简单地在循环中调用!var!而不受惩罚。您可以在任何时间打开的数量都有限制,因此您需要使用delayedexpansion命令“关闭括号”(达到逻辑End-Of-File相当于ENDLOCAL并且缺点是ENDLOCAL在调用匹配的ENDLOCAL时将环境恢复为其值。因此,SETLOCAL通常在批处理开始时执行,通常在SETLOCAL ENABLEDELAYEDEXPANSION

之后执行

下一期是

@echo off

重命名命令的语法是ren fname "%fname%" "C:\%fname%:~12%" - 正好是两个参数,在ren sourcename newname中包含任何包含空格的参数。此外,目标名称只是一个名称 - 不是路径。

然后是这个:

"rabbit's ears"

假设您已修复此问题以删除变量名中的空格,并且%comp_id% = %{comp_id:0:12} 已分配值comp_id并且您已意识到您正在处理 RUN - fred的时间值,然后现在显示为

comp_id

批次将解释为

!comp_id!=%{comp_id:0:12} 

并立即放弃。

你可能期望做的是

fred=%{comp_id:0:12} 

即,将set comp_id=!comp_id:~0,12! 设置为comp_id的 RUN -time值,从comp_id个字符的第一个字符(0)开始。