2017-01-12 4 views
0

Ich habe eine Liste von Dateien mit dem Namen zu entfernen:Batch-Skript "Duplikat" Dateien

file.txt 
file (1).txt 
file (2).txt 

usw.

Wo die größer (Zahl) ist die letzte Datei aktualisiert.

Ich möchte ein .bat Skript, das den Inhalt von file (maxnumer).txt zu file.txt erhalten kann.

+4

Was haben Sie als Code versucht? – Hackoo

+0

Ich habe keine Ahnung, wie es geht. ich jetzt, wie for loops zu verwenden, wenn Bedingungen, Variablen festlegen, aber ich habe nicht viel Erfahrung. Meine erste Idee wäre, eine for-Schleife auszuführen und zu testen, ob "file (% i) .tex" existiert. Aber dann bin ich nicht sicher, wie es weitergeht ... –

+1

Ich kann keine Frage in Ihrem Beitrag finden. Der Titel besagt, dass Sie etwas entfernen möchten, aber der "Frage" -Körper beschreibt nicht, was entfernt werden soll, sondern nur etwas über das Kopieren einer Datei auf ein anderes. Also bitte klar! Hat die Datei mit der größten Nummer auch das letzte Erstellungs- oder Änderungsdatum? Dann teile, was du bisher versucht hast und worüber du Probleme hast! Mit StackOverflow können Sie keine Skripte kostenlos anfordern! Lies dies: [Frage] – aschipfl

Antwort

4

dir /B /OD /TW file*.txt listet Dateinamen in der Reihenfolge der letzten geschriebenen Zeit auf (vgl. dir /?).

Weiter kommentierte Batch-Skript die Arbeit für Sie tun können:

@echo OFF 
SETLOCAL EnableExtensions 
rem delete empty `_lastfile` variable 
set "_lastfile=" 
rem store file name of last written time into `_lastfile` variable 
for /F "delims=" %%G in ('dir /B /OD /TW file*.txt 2^>NUL') do set "_lastfile=%%~G" 
rem            ↑↑↑↑↑↑ suppress errors 
rem check the `_lastfile` variable 
rem is defined? 
rem     AND is different from "file.txt"? 
if defined _lastfile if /I "%_lastfile%" NEQ "file.txt" copy /Y "%_lastfile%" "file.txt" 

Ressourcen (erforderlich Lesung):

+0

vielen Dank –

+0

besser als meine Antwort sicher, gut gemacht :) –

1

Hier ist ein bisschen eine hacky Antwort.

Dieses Skript werden alle Dateien von file (1).txt bis zu file (10).txt File.txt bewegen, nur datei.txt verlassen, die nun den Text enthält, in der Datei war (10) .txt

es aufsteigend Dadurch wird sichergestellt die höchste Zahl ist die letzte, die bewegt wird.

@echo off 
set /P name=Enter name of file without extension: 
echo enter extension: 
set /P ext=. 
echo. & echo. 
echo these actions will be performed: & echo. 
FOR /L %%A IN (1,1,10) DO @echo move /y "%name% (%%A).%ext%" "%name%.%ext%" 
echo. & pause & echo. 
FOR /L %%A IN (1,1,10) DO  move /y "%name% (%%A).%ext%" "%name%.%ext%" 
pause 

Sie könnten IF EXIST %name% (%%A).%ext% verwenden das Skript zu stoppen versuchen, Dateien zu verschieben, die nicht existieren, aber sie nicht wirklich Einfluss auf irgendetwas, das zu tun, so dass ich nicht gestört.

Das obige Skript wird es für eine bestimmte benannte Datei tun. Zu tun, wird es für alle Dateien in einem Verzeichnis möglich sein, hier sind einige Hinweise, die Sie

gehend zu erhalten ein dir /b >filenames.txt verwenden, um alle Dateien in einem Verzeichnis in einer Textdatei

aufgelistet zu bekommen, um eine Aktion für jede durchführen Zeile in einer Textdatei do

for /f "usebackq delims= tokens=* %%a in (`filenames.txt`)" DO (
    ::some stuff here 
) 

so wie ich darüber gehen würde, wäre filenames.txt zu erhalten, löschen Sie manuell alle (n) Dateien, so dass Sie nur noch eine Liste der „nicht-Duplikat“ Dateinamen, und benutze das als deine Eingabe. Sie

Es gibt wahrscheinlich mehr elegante Lösungen da draußen, aber mit all den Besonderheiten der Batch würde ich nicht überrascht sein, dass sie Seiten und Seiten lang sind.

Wenn Sie alle Original-Dateien behalten wollen nicht nur mit dem letzten datei.txt ohne Kopien am Ende, dann möchte ich Sie COPY

verwenden Wenn Sie alle Original-Dateien behalten möchten, dann sind Sie möchte COPY nicht MOVE verwenden.

In diesem Fall alle überflüssigen Operationen zu entfernen (dh nur die höchsten nummerierte Datei kopieren, nicht kopieren Sie alle Dateien um) dann so etwas wie IF NOT EXIST %name% (!B!).%ext% wo !B!=%%A+1 in Ihrem (jetzt mehrzeilige) für Schleife und verwenden Setlocal EnableDelayedExpansion auf mache die Arithmetik richtig. Aber es ist nicht wirklich notwendig, Kopieren 1, dann 2, dann 3, dann 4 tut das gleiche, wenn ein wenig langsamer als überspringen 1 2 und 3 und nur 4.

Ich hoffe, das hilft genug, um Sie in der richtige Richtung, zögern Sie nicht, Fragen zu stellen, wenn dies nicht klar ist.