2

对游戏相当陌生,花了很多时间寻找帮助和示例。尽管我想通过使用单个输入文件“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。

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

4

1 回答 1

4

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

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

要访问RUN-TIME值,您需要执行一条SETLOCAL ENABLEDELAYEDEXPANSION语句,并在delayedexpansion调用while 时!var!访问RUN - time 变量值。

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

下一个问题是

ren fname "%fname%" "C:\%fname%:~12%"

rename 命令的语法是ren sourcename newname- 正好是两个参数,将任何包含空格的参数括起来,"rabbit's ears"此外,目标名称只是一个名称 - 不是路径。

然后是这个:

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

假设您已修复此问题以删除变量名中的空格并comp_id已为其分配了值fred,并且您已经意识到您正在处理RUN时间值,comp_id那么现在将显示为

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

哪个批次将解释为

fred=%{comp_id:0:12} 

并及时放弃。

您可能期望做的是

set comp_id=!comp_id:~0,12! 

也就是说,设置为comp_idcomp_idRUN0时间值,从字符的第一个字符 ( )开始12

于 2013-07-23T01:54:24.923 回答