任务:
将各种.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脚本。我应该使用其他程序来浏览文件吗?是否有“刷新”我应该执行的列表?
答案 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
}
}
}