ren不会使用上面一个lina的变量

时间:2014-09-18 21:01:58

标签: cmd

我有一个奇怪的问题。我想重命名文件夹中的多个文件。 到目前为止,理论上很容易。我用这个脚本:

cd C:\Test

for %%i in (*(7*) do (
    set name="%%i"
    ren "%name%" "%name:~0,-15%.txt"
)

pause

奇怪的是,他似乎没有使用我声明的变量“name” 你可以在控制台打印的内容中看到ren命令上方的一行:

C:\试验>( set name =“ttttt(7xAAdoc).txt”  ren“”“~0,-15.txt” )

我在这里缺少什么?我正在运行Windows 7,如果这很重要的话。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,IF (something) else (somethingelse)将在遇到%variables%时使用IF的值执行。

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

在你的情况下,

cd C:\Test
setlocal enabledelayedexpansion
for %%i in (*(7*) do (
    set "name=%%i"
    ren "%name%" "!name:~0,-15!.txt"
)

注意第一个set中引号的位置。 set "var=value"语法确保批处理行上的任何尾随空格不包含在分配给var的值中。如你所知,name将被赋予"quoted"值,而ren命令(如果它有效)将是'ren“”filename“”“”firstpartoffilename“.txt”