0

我对此感到头疼-已经花了太多时间搜索-显然我不了解CMD变量等的基础知识-它总是让我头疼

为什么这行不通?

for %a in (*) do ( set tmpx=%a & echo %tmpx% )

上面的代码在其他范围内输出 %tmpx% 的值 - 它始终是常量

是的,我运行 setlocal ENABLEDELAYEDEXPANSION

基本上我需要将文件夹中的所有文件从constantstring_somenameXX.tif简单重命名为somenameXX.tif,即constantstring=0000000005

我不得不使用 set 因为其他帖子正确地表明 for 循环中的 %a 具有特殊行为,并且替换不会照原样工作。

我宁愿不使用脚本和/或 powershell - 除非不使用它们是不可能的

谢谢你

4

2 回答 2

3
for %a in (*) do ( set tmpx=%a & echo %tmpx% )

前面代码的问题是扩展延迟。是的,您启用了它,但您没有使用它,并且取决于您启用它的方式,它不会起作用

cmd中,当到达一行或一行行(括号内的代码)时,首先对其进行解析然后执行。在解析阶段,从命令中删除变量读取操作,替换为命令开始执行之前变量中的值。因此,如果您更改行/块内的变量值,则无法在同一行/块内检索更改的值,因为没有变量读取(它们已被替换)

setlocal enabledelayedexpansion允许(在需要时)从 to 替换变量读取语法,%var%!var!解析器指示读取操作将延迟到执行阶段。

因此,就您而言,您的代码应该类似于

setlocal enabledelayedexpansion & for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )

但这不起作用(在默认配置的环境中)。

cmd有两种执行模式:批处理文件和命令行。for在您的情况下,您正在使用命令行(循环中没有转义的百分号)并且在命令行模式下setlocal enabledelayedexpansion将不起作用。它适用于批处理文件(请参阅setlocal /?

如何使其从命令行工作?默认情况下cmd以禁用延迟扩展启动,如果不在批处理文件中,则无法启用它。但是您可以从cmd启用延迟扩展开始并在这个启动的实例中运行您的命令(请参阅 参考资料cmd /?

cmd /v:on /c "for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )"

无论如何,要解决您的重命名问题,不需要延迟扩展

for %a in (*_*.tif) do for /f "tokens=1,* delims=_" %b in ("%~nxa") do echo ren "%a" "%c"

即对于每个tif带下划线的文件,将文件名和扩展名%~nxa%b并将其余文本(下划线右侧)放入%c. 现在,只需将原始文件名(存储在 中%a)重命名为%c(下划线右侧的文本)的内容

在此代码中,重命名操作仅回显到控制台。如果输出正确,请删除该echo命令。

于 2014-11-28T07:55:19.373 回答
-1

!是想要执行时间值时使用的字符而不是 %。% 在读取值时执行。

CMD 是由 IBM 工程师编写的,他们试图让 MSDos 成为一种编程语言,同时确保 Dos 命令运行相同。所以我们得到了一个大杂烩。

&    seperates commands on a line.

&&    executes this command only if previous command's errorlevel is 0.

||    (not used above) executes this command only if previous command's errorlevel is NOT 0

>    output to a file

>>    append output to a file

<    input from a file

|    output of one command into the input of another command

^    escapes any of the above, including itself, if needed to be passed to a program

"    parameters with spaces must be enclosed in quotes

+ used with copy to concatinate files. E.G. copy file1+file2 newfile

, used with copy to indicate missing parameters. This updates the files modified date. E.G. copy /b file1,,

%variablename% a inbuilt or user set environmental variable

!variablename! a user set environmental variable expanded at execution time, turned with SelLocal EnableDelayedExpansion command

%<number> (%1) the nth command line parameter passed to a batch file. %0 is the batchfile's name.

%* (%*) the entire command line.

%<a letter> or %%<a letter> (%A or %%A) the variable in a for loop. Single % sign at command prompt and double % sign in a batch file.
于 2014-11-27T21:02:11.927 回答