所以我试图将几个 level1 子文件夹从“xy_1234”重命名为“1234_xy”。到目前为止,我已经将字符串拆分为变量,构建新的目录名称并重命名目录,但是当我尝试在 for 循环中自动化该过程时,我完全失败了。请帮忙。
Get-Item $Path | ForEach ( $a, $b = $Path.split('_') | Rename-Item -NewName { $b + ('_') + $a})
所以我试图将几个 level1 子文件夹从“xy_1234”重命名为“1234_xy”。到目前为止,我已经将字符串拆分为变量,构建新的目录名称并重命名目录,但是当我尝试在 for 循环中自动化该过程时,我完全失败了。请帮忙。
Get-Item $Path | ForEach ( $a, $b = $Path.split('_') | Rename-Item -NewName { $b + ('_') + $a})
Get-Item $Path | Rename-Item -NewName {
$tokens = $_.Name -split '_' # split the name into tokens
'{0}_{1}' -f $tokens[1], $tokens[0] # output with tokens swapped
} -WhatIf
-WhatIf
预览操作。
如您所见,您可以将解析作为传递给Rename-Item
's-NewName
参数的脚本块的一部分进行。
由于-NewName
只需要项目的文件或目录的新名称(而不是完整路径),$_.Name
因此会对其进行解析并将其转换为(隐式)输出。
这是一个更简洁的公式,灵感来自LotPings的提示:
Get-Item $Path | Rename-Item -NewName { -join ($_.Name -split '(_)')[-1, 1, 0] }
这依赖于 PowerShell 通过指定索引数组(列表)-1, 1, 0
来对数组进行切片的能力:有效地反转返回数组的元素$_.Name -split '(_)'
- 注意(...)
around _
,它确保 的实例_
包含在返回的标记数组中;运算符的一元形式-join
然后连接反转数组的元素。
注意:我假设它$Path
包含一个只匹配感兴趣的目录的通配符表达式。
如果您只需要明确匹配目录,Get-ChildItem
请与
-Directory
开关一起使用:
Get-ChildItem $Path -Directory
使用通配符模式专门匹配您问题中的示例名称:
Get-ChildItem [a-z][a-z]_[0-9][0-9][0-9][0-9] -Directory
我认为应该使用
将“xy_1234”转换为“1234_xy”文字的 GCI 来捕获几个子文件夹:
Get-ChildItem $Path -Dir | Where-Object Name -match '^([a-z]+)_(\d+)$' |
Rename-Item -NewName {$_.Name.Split('_')[1,0] -join ('_')} -WhatIf