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
所以我试图将几个一级子文件夹从 "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