需要一个批处理文件将所有 txt 文件复制到一个子文件夹,但如果它已经存在则重命名
Need a Batch file copy all txt files to a sub folder, but rename if it already exists
好的,
我有多个文本文件将进入一个文件夹,我正在将其处理成一个输出文件。该批次将每隔几个小时 运行。
for %%f in (*.txt) do type "%%f" >> ESOComplete\ESOInput.txt
这会将所有文本从文本文件复制到另一个子文件夹中的一个文本文件。
我需要从那里将所有文件(示例 510002.txt)移动到名为 ESOMoved 的子文件夹。将根文件夹留空,以便下次批处理 运行s 它不会将相同的数据添加到 ESOInput.txt
现在,我需要将原始数据从根目录移动到不被覆盖的批处理文件,所以如果文件已经存在,我希望它重命名它(从 510002.txt 到 5100022 .txt)
最后应该是
1. 将所有 .txt 文档中的所有文本移动到一个输出文件中。 (已经完成)
2. 将所有 .txt 文档移动到名为 ESOMoved 的子文件夹,除非该特定文档已经存在,在这种情况下重命名,然后移动。
这样做的诀窍是设计一个重命名方案。下面的代码将“-N”附加到文件基本名称以创建一个唯一文件,它将不断递增 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
编辑
如果附加 2
的文件已经存在,则数字会增加,直到可用为止。
@Echo off
:: Start in base folder
PushD "Q:\Test17"
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
好的,
我有多个文本文件将进入一个文件夹,我正在将其处理成一个输出文件。该批次将每隔几个小时 运行。
for %%f in (*.txt) do type "%%f" >> ESOComplete\ESOInput.txt
这会将所有文本从文本文件复制到另一个子文件夹中的一个文本文件。
我需要从那里将所有文件(示例 510002.txt)移动到名为 ESOMoved 的子文件夹。将根文件夹留空,以便下次批处理 运行s 它不会将相同的数据添加到 ESOInput.txt
现在,我需要将原始数据从根目录移动到不被覆盖的批处理文件,所以如果文件已经存在,我希望它重命名它(从 510002.txt 到 5100022 .txt)
最后应该是 1. 将所有 .txt 文档中的所有文本移动到一个输出文件中。 (已经完成) 2. 将所有 .txt 文档移动到名为 ESOMoved 的子文件夹,除非该特定文档已经存在,在这种情况下重命名,然后移动。
这样做的诀窍是设计一个重命名方案。下面的代码将“-N”附加到文件基本名称以创建一个唯一文件,它将不断递增 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
编辑
如果附加 2
的文件已经存在,则数字会增加,直到可用为止。
@Echo off
:: Start in base folder
PushD "Q:\Test17"
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