我有大约数十万个文件位于~40个文件夹中(这些子文件夹位于我打算调用的同一个超级文件夹中' test')。我曾尝试使用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
感谢您的帮助。
最佳
答案 0 :(得分:1)
一个班轮:
$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
块中的Runbook中。这促进了对目标系统的PowerShell版本的执行。它还可以很容易地使用-ComputerName在目标上运行脚本而不是Runbook服务器。
然后,您可以将用户名和密码对存储为Orchestrator变量(使用加密选项)并将其插入上面的get-credential语句中。起初感觉很乱,但你已经习惯了。
为了测试这个,我用-version运行PowerShell 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
它有同样的问题,但它可能不是Orchestrator将要运行的1对1匹配。如果它不起作用,则发布输出,我会尽我所能。