我需要重命名很多目录及其子目录。
我有一个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完全失败。
编辑:这是我到目前为止所得到的。这是否接近?:cat .\file.csv | foreach { $oldname = $_.split(",")[2], $newname = $_.split(",")[3], move-item $oldname*, $newname*}
答案 0 :(得分:3)
“ - morestuffhere”是棘手的部分。 Move-Item和Rename-Item上的Path参数(即源位置)不带通配符。但这可以通过另一种方式解决。首先,您可以将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。
答案 1 :(得分:1)
这是另一种选择,因为你应该已经安装了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