批处理文件& Windows Powershell中的文件夹重命名

时间:2017-07-06 18:18:43

标签: windows powershell replace rename-item-cmdlet

我有大约数十万个文件位于~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

感谢您的帮助。

最佳

1 个答案:

答案 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版本的执行。它还可以很容易地使用-Co​​mputerName在目标上运行脚本而不是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匹配。如果它不起作用,则发布输出,我会尽我所能。