1

多くのディレクトリとそのサブディレクトリの名前を変更する必要があります。

古いディレクトリ名と必要な新しい名前を含む 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*}
4

2 に答える 2

3

「-morestuffhere」はトリッキーな部分です。Move-Item と Rename-Item の Path パラメーター (つまり、ソースの場所) は、ワイルドカードを使用しません。しかし、それは別の方法で解決できます。まず、次のように CSV ファイルに CSV ヘッダーを追加できますか。

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

その場合は、PowerShell の Import-Csv コマンドレットを使用できます。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 を削除します。

于 2009-11-06T18:31:31.907 に答える
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
于 2009-11-06T10:26:06.863 に答える