如何在我的在线 powershell 命令中实现 IF 语句

如何在我的在线 powershell 命令中实现 IF 语句

我在批处理文件中运行 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\例如内部),只需添加-RecurseGet-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变量将存储模式字符串,然后执行一行代码。

相关内容