如何使用批处理文件删除子字符串

How To Remove Substring Using Batch File

我有几千个格式相似但格式不同的文件,即:

[Block 1] Thisfile.txt
[Block 1] Thisfile1.txt
[Block 1] Thisfile2.txt
[Backup001] Thatfile1.doc
[Backup001] Thatfile2.doc
[Backup001] Thatfile3.doc
[Explode] Thisplace.xls
[Explode] Thisplace1.xls
[Explode] Thisplace2.xls

我想删除“[text]”并保持其他所有内容不变。由于该文本各不相同,因此我无法执行严格的字符数,即

set var=%1
@echo %var:~-7%

我尝试涉足 powershell 命令行并尝试过:

dir *.xls | Rename-Item -NewName {$_.Name -replace '[Explode\s\'}

但是报错如下:

Rename-Item : The input to the script block for parameter 'NewName' failed. Invalid regular expression pattern: [Explode\s\.
At line:1 char:33
+ Dir *.xls | Rename-Item -NewName <<<<  {$_.Name -replace '[Explode]\s\'}
    + CategoryInfo          : InvalidArgument: (C:\[Explode... Thisfile1.xls:PSObject) [Rename-Item], ParameterBindingException
    + FullyQualifiedErrorId : ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.RenameItemCommand

我搜索了 StackExchange 和 'batch-rename' 标签,发现(并尝试了)几个我认为可以调整的类似内容,但运气不好。

这是基于另一个 StachExchange 回答的最新消息:

for %%F in (*.xls) do (
    SET string=%%F
    SET modified=!string:Explode=1!
    echo !modified!
)

我只是想让任何替代品正常工作...运气不好。

您的 PowerShell 相当可靠,唯一的问题是方括号是保留字符,必须使用前面的反斜杠进行转义。适合您的 RegEx 应该是:

-replace '\[.*?\]\s*'

你可以在这里看到详细的解释 link:

https://regex101.com/r/yM6sQ9/1

编辑: 抱歉,刚上班看到你的留言。我用测试文件尝试了正则表达式,并且能够毫无问题地重命名它。已创建测试文件:

C:\Temp\[glarb]ThisIsATest.tst

然后我 运行 PowerShell 中的以下行:

Get-ChildItem C:\Temp\*.tst | Rename-Item -NewName {$_.Name -replace "\[.*\]\s*"}

之后我查看并留下了文件:

C:\Temp\ThisIsATest.tst

我不确定您的代码为何无法运行,可能是您的 PowerShell 版本中存在错误。正则表达式和命令在 Win8.1 中的 PS v4 运行 中工作。

我的 RegEx-Foo 不是很强大(它在待办事项列表中),但你应该可以用子字符串来做到这一点。

dir *.xls | Rename-Item -NewName { ($_.Name.Substring($_.Name.IndexOf(']') + 1)).Trim() }

仔细观察实际发生的变化,我们返回 $_.Name 的子字符串,它来自第一个 ']' 字符之后的索引,然后还修剪输出,处理任何额外的空格(即空格)。

这有一个明显的限制,即不适用于以下形式的文件:

this[should]notBeEdited.xls

使用纯批处理:

@echo off
for /f "delims=" %%F in (
  'dir /b /a-d [*]*'
) do for /f "tokens=1* delims=]" %%A in (
  "%%F"
) do for /f "tokens=*" %%C in ("%%B") do ren "%%F" "%%C"

使用我的 JREN.BAT regular expression renaming utility,一个纯脚本实用程序(混合 JScript/batch),可以在任何 Windows XP 以上的机器上本地运行:

call jren "^\[.*?] *" "" /fm "[*]*"

如果直接从命令行使用命令,则可以删除 CALL。