批处理文件循环字符串替换

时间:2014-12-10 12:22:00

标签: windows batch-file cmd

我在一个目录中有一些mp4文件,该目录由 wget 命名,该实用程序用于从互联网上下载文件。

问题是,它将文件名写成" 1%20-%201%20-%20概述%20%2802%3A09%29.mp4 "(编码百分比字符串" 1 - 1 - 概述(02:09)"),这是一件令人讨厌的事 - 它并不那么简单。所以我决定用batch命令转换它们。

由于这些文件只包含一些特殊字母(空格,冒号和括号),我想我只是在 cmd 中执行一些命令,并在尝试了几个命令之后将%20更改为SPACE,我被卡住了。

在批处理文件中,我使用:

@echo off
setlocal enabledelayedexpansion
for %%i in (*.mp4) do (
set aaa=%%i
rename "%%i" "!aaa:%%20= !"
)

我已经尝试过(进行测试):

SETLOCAL enabledelayedexpansion
FOR %i in (*.mp4) do (
SET aaa="%i"
echo "!aaa:%%20= !"
)

我尝试过更改'!'到了'%',但它没有用。它似乎相当于打印我写的内容(比如几行!aaa:%% 20 =!),或者 aaa 的值没有打印出来变化

有人能帮助我吗?我以为只是在改变' %%'到'%'将批处理文件脚本转换为cmd命令。如果不是,还有什么其他差异?

2 个答案:

答案 0 :(得分:0)

@echo off
setlocal

:: Define simple macros to support JavaScript within batch
set "beginJS=mshta "javascript:close(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write("
set "endJS=));""

SETLOCAL enabledelayedexpansion
FOR %%i in (*.mp4) do (

  for /f %%N in (
  '%beginJS% decodeURIComponent("%%i") %endJS%'
  ) do set "dec=%%N"
  echo !dec!

)

如果您从javascript(使用mshta)尝试decodeURIComponent会怎么样?

答案 1 :(得分:0)

您的问题是SETLOCAL无法在命令行中运行,因此您永远不会激活延迟扩展。

此外,您应该在分配变量之前放置引号,以便引号不包含在值中。

您可以启动一个新的cmd.exe shell,并启用延迟扩展以使其正常工作。

cmd /v:on
FOR %i in (*.mp4) do (SET "aaa=%i"&echo "!aaa:%%20= !")

您需要注意,您无法将%3A更改为:,因为:在文件名中无效。

您可能希望查看使用正则表达式搜索的JREN.BAT utility并替换以重命名文件:

您可以执行以下操作:

jren "%20" " " /fm *.mp4
jren "%3A" "." /fm *.mp4

如果在批处理脚本中使用上述命令,则需要在每个命令前加上CALL并加倍百分比。

请注意,我将%3A转换为.而不是:,因为冒号不能用于文件名。