2

我有数十万个文件位于约 40 个文件夹中(这些子文件夹位于同一个超级文件夹中,我将称之为“测试”)。我尝试使用 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

1 回答 1

3

一个班轮:

 $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 语句中。一开始感觉很乱,但你习惯了。

为了对此进行测试,我使用 -version 1 运行 PowerShell。这是我的 $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 将要运行的。如果它不起作用,请发布输出,我会尽力而为。

于 2017-07-06T19:04:56.103 回答