如何在powershell中批量重命名文件使用以下代码:
$nr=1;Get-ChildItem -Filter *.jpg |
Rename-Item -Newname {"PPPPPPP_{0:d3}.jpg" -f $global:nr++}
字符串
其中PPPPPPP是包含这些文件的父文件夹的名称。
预期输出:
PPPPPPP_001.jpg
PPPPPPP_002.jpg
PPPPPPP_003.jpg
型
文件位于C:\USER\MAIN\BLABLABLA\PPPPPPP文件夹中。
3条答案
按热度按时间uz75evzq1#
$_.Directory.Name
获取父目录的名称。Get-Variable
在 *caller的 * 作用域中获取对$nr
序列号变量的引用,这样你就可以直接修改它的值(通过.Value
),这比使用作用域修饰符$global:
更好(-Scope 1
可以被添加以显式地指向 parent 作用域,但它不是绝对必要的,为了简洁起见被省略了):字符串
-WhatIf
* 预览 * 重命名操作;一旦您确信该命令将按预期执行,请删除它。$script:
作用域修饰符来引用该作用域中的变量:型
$nr
变量转换为[ref]
,这样就可以直接在调用者的作用域中修改它的值(通过.Value
)。型
型
下一节将解释这些技术。
可选阅读:在delay-bind脚本块或计算属性中修改调用方变量:
不能在脚本块中直接使用
$nr++
来递增序列号的原因是:Rename-Item -NewName
的)和calculated properties中的脚本块在 * 子 * 作用域**中运行。Where-Object
和ForEach-Object
的脚本块进行对比,这些脚本块直接在调用者的作用域中运行。它是unclear whether that difference in behavior is intentional。
$PSIndex
变量来消除手动维护序列号的需要,该变量反映了当前管道对象的序列号:参见GitHub issue #13772。以计算属性为例:
型
虽然可以使用作用域修饰符(如
$global:
或$script:
)显式引用父作用域中的变量,但这些是 * 绝对 * 作用域引用,可能无法按预期工作:举个例子:如果将代码移动到脚本中,$global:nr
不再引用使用$nr = 1
创建的变量。快速旁白:创建 global 变量通常应该避免,因为它们在当前会话中徘徊,即使在脚本退出后也是如此。
鲁棒的方法是使用
Get-Variable -Scope 1
调用来鲁棒地引用直接父作用域:型
虽然这种技术是健壮的,但小程序调用会引入开销(尽管这在实践中可能并不重要),而且它有点冗长,但是:
-Scope
参数。型
您可以使用**
$script:
作用域修饰符**来引用脚本文件顶级作用域中的变量,这是直接在该作用域中运行的命令的实用快捷方式:型
使用**
[ref]
类型提供了一个更简洁的与作用域无关的替代方案**,尽管这个解决方案有点 * 晦涩 *:型
将变量转换为
[ref]
返回一个对象,该对象的.Value
属性可以访问和修改该变量的值。请注意,由于$nr
在此时没有被 * 赋值给 *,因此实际上引用的是 * 调用者的 *$nr
变量。如果你不介意使用一个aux. hashtable,你可以利用哈希表是一个.NET * 引用类型 * 的事实,这意味着延迟绑定脚本块运行的子作用域看到的是与调用者作用域相同的对象,因此修改这个对象的 * 属性 *(条目)在调用中持续存在:
型
nfg76nw02#
EDIT:由于mklement0的提示而修改。
要获取父名称,请使用
.Directory.Name
作为格式操作符的另一个参数字符串
如果输出看起来正常,则删除-WhatIf
这只会在没有重叠的范围进行重命名时起作用,在这种情况下,您应该使用临时扩展名。
在我的德语区域设置Windows上的示例输出
型
deikduxw3#
另一种稍微不同的方式:
字符串