powershell脚本重命名目录中的所有文件

时间:2013-11-16 21:59:17

标签: powershell csv

任务:
将各种.csv文件转储到其中的目录。这些可能类似于file1.csv,file2.csv等 的问题:
迭代文件并将其重命名为标准化的'newfilename.csv'。然后,该文件将由外部程序处理,并重命名并移出目录。 我有一个powershell脚本,可以做到这一点:

ent## Set the file location where the log files are
$file = "C:\logs"   

$new = "newfilename.csv"
$chkFile = "C:\logs\newfilename.csv"
$fileExists = Test-Path $chkFile

## Loop through all the .csv files in the log folder
foreach ($file in gci $file -include *.csv -recurse){       
    if($fileExists -eq $True){
        Write-Host "that file exists!"
        Start-Sleep -s 60
    } else{
    Write-Host "file doesn't exist, renaming..."
    rename-item -path $file -newname ("$new")}
    Start-Sleep -s 10   
}

问题在于,如果目录中有5个文件,它将通过,重命名第一个文件,然后返回文件列表,对于$ fileExists,它在“-eq $ True”上返回'false'。文件列表在重新开始时是不是不刷新(IE:是否在'foreach'的开头创建了某种类型的数组)?我从未真正编写过PowerShell脚本。我应该使用其他程序来浏览文件吗?是否有“刷新”我应该执行的列表?

1 个答案:

答案 0 :(得分:1)

在循环运行之前测试$chkFile是否正在执行一次。如果要为每个文件评估(例如,其他进程已完成其工作并在休眠期间移动“newfilename.csv”),请在foreach内移动TestPath调用。

是的,gci $file -include *.csv -recurse在开始foreach循环之前被评估一次。如果你想每次刷新列表,我会做类似下面的事情,实际上多次调用foreach循环。

while($true) {
    $csvFiles = gci $file -include *.csv -recurse

    if ($csvFiles.Length -eq 0) {
         break
    }

    foreach ($file in gci $file -include *.csv -recurse) {       
        if (Test-Path $chkFile) {
            Write-Host "that file exists!"
            Start-Sleep -s 60
        } else {
            Write-Host "file doesn't exist, renaming..."
            rename-item -path $file -newname ("$new")
            Start-Sleep -s 10
        }
    }
}
相关问题