如何使用批处理文件删除子字符串
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。
我有几千个格式相似但格式不同的文件,即:
[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。