我有一个脚本,当我指定c:\script\19\的确切目录时运行,问题是,在c:\脚本中有其他文件夹,如18,17,16。我的脚本在所有文件前面追加19。我如何让它查看它重命名的文件的祖父并追加它?它如何工作的一个例子是这样的文件:
c:\script\18\00000001\Plans.txt
c:\script\19\00001234\Plans.txt
c:\script\17\00005678\App.txt
但我的脚本是这样重命名文件的
c:\script\18\00000001\19-0001 Plans.txt
c:\script\19\00001234\19-1234 Plans.txt
c:\script\17\00005678\19-5678 App.txt
我的剧本是这样的:
$filepath = Get-ChildItem "C:script\" -Recurse |
ForEach-Object {
$parent = $_.Parent
$grandparent = $_.fullname | Split-Path -Parent | Split-Path -Parent | Split-Path -Leaf
}
Get-ChildItem "C:\Script\" –recurse –file |
Where-Object {$_.Name –notmatch ‘[0-9][0-9]-[0-9]’} |
rename-item -NewName {$grandparent + '-' + $_.Directory.Name.SubString($_.Directory.Name.length -4, 4) + ' ' + $_.Name}
3条答案
按热度按时间dzhpxtsq1#
最简单的解决方案是将字符串拆分与
-split
operator和delay-bind脚本块(您已经尝试过使用)结合起来:-WhatIf
* 预览 * 重命名操作;删除它以执行实际的重命名。请注意
-Exclude
是如何直接与Get-ChildItem
一起使用通配符表达式来排除已经具有目标名称格式的文件的。原始路径不起作用的主要原因是,您计算了 * 单个、静态 *
$parent
和$grandparent
值,而不是从每个输入路径派生特定于输入路径的值。此外,您的
$grandparent
计算不必要地复杂;Gert Jan Kraaijeveld's helpful answer显示了一个更简单的方法。baubqpgj2#
要获取$file对象的祖父:
文件的父目录是文件对象的“Directory”成员。
目录的父目录是目录对象的“Parent”成员。
这并不难,但令人困惑的是...
编辑
你问我的解决方案:
我使用Get-ChildItem的-file参数只从文件夹结构中获取文件。
qyyhg6bp3#
在每个文件夹中,您可以运行脚本,将祖父母的姓名添加到该文件夹中的文件名中: