Windows批处理文件和文件夹重命名Powershell

问题描述:

我有几十万个文件位于〜40个文件夹中(这些子文件夹位于同一个超文件夹中,我将称之为'测试')。我试图使用PowerShell来替换文件夹名称中找到的语法,但也使用文件名。Windows批处理文件和文件夹重命名Powershell

基本上我的文件夹和文件中包含的字符“PXXXX_0”相同的字符串,我想批量重命名“PXXXX_”

这里是我以前首先映射文件的兴趣&文件夹中的代码

cd C:\test 

Get-ChildItem -Filter "*PXXXX_0*" -Recurse | Rename-Item -NewName {$_.name -replace 'PXXXX_0', 'PXXXX_'} -whatif 

这给了我正确的文件和预览的动作(例如

What if: Performing operation "Rename File" on Target "Item: C:\test\PXXXX_053\PXXXX_053_558.jpg Destination C:\test\PXXXX_053\PXXXX_53_558.jpg 

所以这似乎工作,但只有上的文件在我也想重命名的文件夹中。

现在,如果我启动代码,而不-whatif似乎只有文件夹名称命名,而不是文件...

我敢肯定,我错过了一些东西,但因为我没有真正熟悉的语言,我正在努力寻找解决方案。我正在使用Powershell v1.0

感谢您的任何帮助。

最佳

+4

假定文件夹重命名后,文件夹内的文件路径是错误的,因为该文件夹不再存在该名称下。先尝试重命名文件,方法是过滤'.. -Recurse | where-object {-not $ _。PsIsContainer} |重命名 - 项目..'然后重做它来重命名文件夹,也许? – TessellatingHeckler

+0

谢谢,它像一个魅力工作! – Rhiz

一个内胆:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; foreach ($item in $items) { $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; rename-item $item.fullname -NewName $newName; } 

容易的眼球:

$items = get-childitem -filter "*PXXXX_0*" -Recurse; 
foreach ($item in $items) { 
    $newName = $item.fullname -replace 'PXXXX_0', 'PXXXX_'; 
    rename-item $item.fullname -NewName $newName; 
} 

总之,PowerShell中1试图将该文件与歌曲名称,而不是重命名完整路径。基本上,它们在子文件夹中时无法找到您的文件。

我在v5中测试了您的逻辑,它的工作原理与您预期的相似。

我打算在这里假设并假设您正在尝试通过System Center Orchestrator运行此脚本,因为您正在使用PowerShell v1。我感到很痛苦。我建议将所有PS脚本包装到invoke-command -scriptblock {} -Credential $myCreds块中。这将促进执行到目标系统的PowerShell版本。它还使得在-ComputerName上运行脚本而非Runbook服务器非常容易。

然后,您可以将用户名和密码对存储为Orchestrator变量(使用加密选项)并将它们插入上述get-credential语句中。起初感觉非常混乱,但你已经习惯了。

测试这个,我跑PowerShell和-version 1.这是我的$ PSVersionTable:

Name       Value 
----       ----- 
CLRVersion      2.0.50727.8689 
BuildVersion     6.1.7600.16385 
PSVersion      2.0 
WSManStackVersion    2.0 
PSCompatibleVersions   {1.0, 2.0} 
SerializationVersion   1.1.0.1 
PSRemotingProtocolVersion  2.1 

它有同样的问题,但它可能不是1对1的比赛什么Orchestrator是要运行。发布输出,如果它不工作,我会尽我所能。