сценарий PowerShell для переименования всех файлов в каталоге

Задача:
Каталог, в который будут загружены различные файлы .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 файлов в каталоге, он переходит, переименовывает первый файл, а затем, возвращаясь по списку файлов, возвращает «false» для «-eq $ True» для $ fileExists. Список файлов просто не обновляется при повторном запуске (IE: создается ли какой-то массив в начале foreach)? На самом деле я никогда не писал скрипт PowerShell. Должен ли я использовать какую-то другую процедуру для просмотра файлов? Есть ли «обновление» списка, которое я должен выполнить?


person Michael Strauss    schedule 16.11.2013    source источник


Ответы (1)


Проверка того, выполняется ли $chkFile один раз перед запуском цикла. Если вы хотите оценить это для каждого файла (например, другой процесс уже выполнил свою работу и переместил "newfilename.csv" во время сна), переместите вызов TestPath внутрь foreach.

Да, 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
        }
    }
}
person chwarr    schedule 16.11.2013
comment
За исключением отсутствующего} (закрытие цикла foreach), который работал отлично! Спасибо! - person Michael Strauss; 17.11.2013
comment
Дох. Починил это. Спасибо. - person chwarr; 17.11.2013