需要批处理文件将所有txt文件复制到子文件夹,但重命名是否已存在

时间:2017-07-22 01:10:27

标签: windows batch-file cmd batch-rename

确定,

我有多个文本文件将进入我正在处理为单个输出文件的文件夹中。批次将每隔几个小时运行一次。

    for %%f in (*.txt) do type "%%f" >> ESOComplete\ESOInput.txt

这会将文本文件中的所有文本复制到另一个子文件夹中的单个文本文件中。

从那里我需要一个将所有文件(例如510002.txt)移动到名为ESOMoved的子文件夹。将根文件夹保留为空,以便下次批处理运行时,不会将相同的数据添加到ESOInput.txt

现在,我需要将root文件中的orignal数据移动到不会覆盖的批处理文件,所以如果文件已经存在我想让它重命名(从510002.txt到510002 2 .txt )

最终它应该是 1.将所有.txt文档中的所有文本移动到一个输出文件。 (已经完成) 2.将所有.txt文档移动到名为ESOMoved的子文件夹,除非该特定文档已存在,在这种情况下重命名,然后移动。

2 个答案:

答案 0 :(得分:1)

修改 如果附加2的文件已经存在,则该数字会增加,直到空闲为止。

@Echo off
:: Start in base folder
PushD "Q:\Test\2017\07\22"

for %%f in (??????.txt) do (
    type "%%f" >> "ESOComplete\ESOInput.txt"
    If Not Exist "ESOMoved\%%f" (
        Move "%%f" "ESOMoved\"
    ) Else (
        Set Num=2
        Call :Move "%%f" 
    )
)
PopD
Goto :Eof
:Move
Set "NewName=ESOMoved\%~n1%Num%%~x1"
If Not Exist "%NewName%" (
Echo Move %1 "%NewName%"
     Move %1 "%NewName%" >Nul 2>&1
     Exit /B 0
)
Set /A Num+=1
Goto :Move

答案 1 :(得分:0)

这方面的诀窍是设计一个重命名方案。以下代码附加" -N"在文件basename中创建一个唯一的文件,它将继续增加N,直到找到一个不存在的文件名。

将此文件另存为esomover.ps1

$files = Get-ChildItem -Path 'C:/src/t/ESO/' -File -Filter 'file*.txt'

$sum_file = 'C:/src/t/ESO/ESOComplete/ESOInput.txt'
$arch_dir = 'C:/src/t/ESO/ESOArchive'

if (-not (Test-Path -Path $sum_file)) { New-Item -Path $sum_file -ItemType File }

foreach ($file in $files) {
    Add-Content -Path $sum_file -Value (Get-Content $file.FullName) -Encoding Ascii
    if (-not (Test-Path "$($arch_dir)/$($file.Name)")) {
        Move-item $file.FullName $arch_dir
    } else {
        $i = 0
        $nfn = ''

        do {
            $nfn = "$($file.BaseName)-$($i.ToString()).txt"
            $i++
        } while (Test-Path -Path "$($arch_dir)/$($nfn)")

        Move-Item $file.FullName "$($arch_dir)/$($nfn)"
    }
}

使用以下命令从cmd.exe shell或.bat文件运行此脚本:

powershell -noprofile -file .\esomover.ps1