2

所以我试图将几个 level1 子文件夹从“xy_1234”重命名为“1234_xy”。到目前为止,我已经将字符串拆分为变量,构建新的目录名称并重命名目录,但是当我尝试在 for 循环中自动化该过程时,我完全失败了。请帮忙。

Get-Item $Path | ForEach ( $a, $b = $Path.split('_') | Rename-Item -NewName { $b + ('_') + $a})
4

2 回答 2

1
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
于 2018-05-10T22:23:21.513 回答
0

我认为应该使用
将“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
于 2018-05-10T22:27:38.443 回答