从CSV脚本重命名重命名文件但尝试重复进程

时间:2011-09-12 18:00:26

标签: file powershell csv

我有一个脚本可以重命名从CSV中获取的文件但是在它已经执行成功的程序后尝试重新重命名文件时会引发错误

CSV文件就像:

old      new
AC100    DC100
AC101    DC102

代码尝试了:

$sourceDir = read-host "Please enter source Dir:"
$csvL = $sourceDir + "\files.csv"
$csv = import-csv $csvL
$files = get-childitem $sourceDir
$csv | % {
            ForEach( $file in $files){
            if($file = $_.old){

            $old = $sourceDir + "\" + $_.old

            Rename-Item $old $_.new
                    }       
                }
            }

我相信它与循环和csv有关但我不确定我哪里出错了,我之前遇到过类似的问题。

以下是错误示例。

+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
Rename-Item : Cannot rename because item at 'C:\scripts\2039X.67438.TXT' does not exist.
At C:\scripts\renamerTim.ps1:18 char:15
+             Rename-Item  <<<< $old $_.new
提前谢谢, 克雷格

2 个答案:

答案 0 :(得分:1)

我认为ForEach( $file in $files)是多余的,因为您已经使用$csv | % {命令遍历每个“文件”。我会尝试类似的事情:

$csv | Foreach-Object { //I prefer to print the full commands in scripts
    $oldfile = $sourcedir + "\" + $_.old
    if (Test-Path $oldfile)
    {
        Rename-Item $oldfile ($sourcedir + "\" + $_.new)
    }
}

答案 1 :(得分:1)

你有一个冗余的嵌套循环。 $csv | %{ ... }已遍历csv中的文件,然后foreach循环遍历文件夹中的每个文件。

试试这个:

  $sourceDir = read-host "Please enter source Dir:"
  $csvL = $sourceDir + "\files.csv"
  $csv = import-csv $csvL
  $files = get-childitem $sourceDir
  $csv | % {
     $oldpath = join-path $sourcedir $_.old
     $newpath = join-path $sourcedir $_.new

     rename-item $oldpath $newpath
  }