我在批处理文件中运行 powershell 命令来从文件夹名称中删除括号,但它会重命名路径中的所有文件夹,并且如果文件夹名称不包含括号,它会给我一个错误。
我希望它在特定文件夹上运行,并且我希望它在运行之前检查名称是否包含括号。如果名称中没有括号,它不应该执行任何操作。
希望保持一行命令
我已经在互联网上搜索过,但就是找不到解决方案。
命令:
powershell -command "Dir -Path e:\test | rename-item -NewName { $_ -replace '\[','_' -replace '\]','_'}"
批处理文件使用一些参数自动运行,我从参数中获取了要重命名的目录的确切名称。(即start.bat param1 param2)
我曾尝试执行 IF 语句,但就是搞不懂。
删除括号的原因是“remove-itemsafely”模块无法处理带括号的名称。该模块会将文件放入回收站,而不是永久删除它们。
希望有人能帮助我,谢谢。
答案1
我建议使用这个 PowerShell 命令:
Get-ChildItem -Path e:\test -Filter "*`[*`]*" | Rename-Item -NewName { $_.name -replace '\[','_' -replace '\]','_' }
反引号是作为转义字符使用的。
答案2
您仅要求文件夹名称,因此-Directory
。
如果您还想重命名层次结构中更深的目录(c:\test\anotherFolder\
例如内部),只需添加-Recurse
到Get-ChildItem
命令中。
虽然可以假设,但您并未指定括号将以先开后闭的顺序排列。也没有指定两者在文件夹名称中都必然存在。
此正则表达式模式'\]|\['
保存在$rgx
变量中,将匹配]
OR [
,因此它将捕获所有实例。
是\
转义字符。
是|
OR 字符。
我们可以将该模式用于过滤器 ( Where-Object
) 块和名称替换匹配 ( -replace
) 块。
最后,您似乎希望能够从批处理文件运行它,因此我确保它能够以这种方式工作。
powershell -command "$rgx='\]|\['; Get-ChildItem -Path 'c:\test' -Directory | Where-Object { $_.name -match $rgx } | Rename-Item -NewName { $_.name -replace $rgx,'_' }"
顺便说一下,;
是命令分隔符。首先,$rgx
变量将存储模式字符串,然后执行一行代码。