Powershell,在解析和切换名称字符串后重命名目录

Powershell, Rename a directory after parsing and switching strings of its name

所以我试图将几个一级子文件夹从 "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-NewName 参数的脚本块的一部分。

因为 -NewName 只需要项目的文件或目录 new name(而不是完整路径),$_.Name 被解析并转换它是(隐式)输出。

这是一个更简洁的公式,灵感来自 LotPings 的提示:

Get-Item $Path | Rename-Item -NewName { -join ($_.Name -split '(_)')[-1, 1, 0] }

这依赖于 PowerShell 通过指定索引的 数组(列表) 对数组进行切片的能力:-1, 1, 0 有效地反转了数组的元素 $_.Name -split '(_)' returns - 注意 _ 周围的 (...),它确保 _ 的实例包含在返回的标记数组中; -join 运算符的一元形式然后连接反向数组的元素。


注意:我假设 $Path 包含一个仅匹配感兴趣目录的通配符表达式。

如果您只需要明确匹配目录,请使用 Get-ChildItem
-Directory 开关:

Get-ChildItem $Path -Directory

使用通配符模式专门匹配您问题中的样本名称:

Get-ChildItem [a-z][a-z]_[0-9][0-9][0-9][0-9] -Directory

我认为应该用 GCI 抓取几个子文件夹
将 "xy_1234" 转换为“1234_xy” 文字:

Get-ChildItem $Path -Dir | Where-Object Name -match '^([a-z]+)_(\d+)$' |
    Rename-Item -NewName {$_.Name.Split('_')[1,0] -join ('_')} -WhatIf