使用Powershell使用查找文件recursion地重命名目录

我需要重命名很多目录和他们的子目录。

我有一个csv文件,其中包含旧的目录名称和所需的新名称。

1,blah,old_name1,new_name2,wibble 2,foo,old_name2,new_name2,bar 3,john,old_name3,new_name3,paul 4,george,old_name4,new_name4,ringo 

请注意,一些目录名称是

 old_name1-morestuffhere 

需要重新命名

  new_name1-morestuffhere 

我广泛地知道我将如何在bash中做到这一点:

 mv -r `cat file.csv | awk -F, '{print $3* $4*}'` 

..但我必然会完全失去PowerShell。

编辑:这是我到目前为止。 这是closures吗?

 cat .\file.csv | foreach { $oldname = $_.split(",")[2], $newname = $_.split(",")[3], move-item $oldname*, $newname*} 

Solutions Collecting From Web of "使用Powershell使用查找文件recursion地重命名目录"

“更多”是棘手的部分。 移动项目和重命名项目上的路径参数(即源位置)不采用通配符。 但是这可以通过另一种方式来解决。 首先,您可以像这样添加一个CSV标头到您的CSV文件:

 Index,F2,OldName,NewName,F5 1,blah,old_name1,new_name2,wibble ... 

如果是这样,我们可以使用PowerShell的Import-Csv cmdlet。 现在下面看起来有些复杂,但它处理多个OldName-<differentstuffhere>NewName-<sameasoldnamestuffhere>重命名的情况。

 $names = Import-Csv names.csv | Foreach { $oldDirs=@(Get-ChildItem . -r -filter "$($_.OldName)*" | ?{$_.PSIsContainer} | %{$_.FullName}) Add-Member -in $_ NoteProperty OldDirs $oldDirs -PassThru } foreach ($name in $names) { foreach ($oldDir in $name.oldDirs) { $dir = Split-Path $oldDir -Parent $suffix = (Split-Path $oldDir -Leaf).Substring($name.OldName.Length) $newPath = Join-Path $dir ($name.NewName + $suffix) Rename-Item $oldDir ($name.NewName + $suffix) -WhatIf -ea 0 } } 

这是手解释,所以可能有错误。 当你对结果感到满意时,去掉-Whatif。

这是一个替代方案,因为你应该已经安装了VBScript

 Set objFS = CreateObject("Scripting.FileSystemObject") strFile= "C:\test\file.csv" Set objFile = objFS.OpenTextFile(strFile,1) Do Until objFile.AtEndOfStream strLine = objFile.ReadLine s = Split(strLine,",") oldname = s(2) newname = s(3) WScript.Echo oldname, newname Set objFile=objFS.GetFile(oldname) objFile.Name = newname Set objFile=Nothing Loop