Verwenden vonFORFILES

Verwenden vonFORFILES

Hallo Leute, ich arbeite derzeit in einer Schule und habe ein Skript erstellt, um alle Schülerordner nach bestimmten Dateitypen zu durchsuchen. Ich habe mich gefragt, ob es eine Möglichkeit gibt, eine Kopie des bestimmten Dateityps zu erstellen, bevor ich ihn lösche. Mir ist keine Möglichkeit eingefallen, dies zu tun, da sowohl xcopy als auch robocopy eine Quelladresse innerhalb der Syntax erfordern. Hier ist mein Skript

@echo off
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat files please wait...
del /s *.bat > Z:\DeletedFiles.txt 2>&1
Echo Deleting CMD files please wait...
del /s *.cmd >> Z:\DeletedFiles.txt 2>&1
Echo Deleting VBS files please wait...
del /s *.vbs >> Z:\DeletedFiles.txt 2>&1
Echo Deleting Executable files please wait...
del /s *.exe >> Z:\DeletedFiles.txt 2>&1
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close

Ich nehme an, es ist nicht so einfach (geschweige denn möglich), wie etwas wie das Folgende einzugeben?

xcopy *.bat Y:\

Übrigens stehen mir Powershell-Skripte nicht zur Verfügung, da ich nicht die Berechtigung habe, sie auszuführen (blöde Bildungsabteilung), aber wenn es eine Powershell-Alternative gibt, posten Sie diese bitte auch, da es gut für mich wäre, etwas darüber zu lernen.

Antwort1

Verwenden vonFORFILES

Dieser Weg ist vielleicht noch leichter zu verdauen:

forfiles /P C:\Windows /S /M *.dll /C "cmd /c @echo @path"

Dies ist ein Beispiel, das Sie ohne Schaden von der Befehlszeile aus ausführen können.

So können Sie es in Ihrem Skript verwenden:

forfiles /P X:\ /S /M *.bat /C "cmd /c @copy @path Y:\"

Verwenden vonFOR

FOR /R X:\ %%B IN (*.bat) DO (
    copy "%%~fB" Y:\
    REM you could do the delete in here too, 
    REM but it's probably faster the way you have it
)

Und so funktioniert es:

Der FORBefehl mit dem /RSchalter durchsucht das angegebene Verzeichnis rekursiv (in diesem Fall X:\nach dem im INAbschnitt angegebenen Muster. Hier geben wir ihm das Muster vor) *.bat. Für jede gefundene Datei führt er die Anweisung nach aus . Die gefundene Datei wird in die Variable (der Buchstabe ist frei wählbar) DOeingefügt .%%B

Durch die Verwendung (...)danach DOermöglichen wir die Ausführung mehrerer Befehle bei jeder Iteration der Schleife.

%%~fBist eine spezielle Methode, den Wert von zu behandeln %%B. Das ~steht am Anfang aller dieser speziellen Formatierer und entfernt automatisch Anführungszeichen, falls vorhanden. fformatiert den Wert als vollständigen Pfadnamen, falls er relativ verwendet wird.

Die Ausführung for /?über die Befehlszeile bietet einen sehr detaillierten Überblick über FORdie Fähigkeiten von und die verwendbaren Formatierungsflags.

Notiz

Wir verwenden %%Banstelle von %B, wie in der Hilfe angegeben, da es sich um eine Batchdatei handelt. Hier sind einige Beispiele, FORdie Sie direkt in der Befehlszeile ausführen können:

FOR /R C:\Windows %Q IN (*.ttf) DO @echo I am a font: "%Q"
FOR /R C:\Windows %Q IN (*.dll) DO @echo Full path to DLL: %~fQ

Wenn sich diese in einer Batchdatei befänden, müssten Sie doppelte Prozentzeichen verwenden.

Informationen zu PowerShell

Ich wollte auch darauf hinweisen, dass Sie zum Ausführen von Powershell-Skripten keine besonderen Berechtigungen benötigen.

Wenn Sie einen Fehler bezüglich der Ausführungsrichtlinie erhalten, ist dies nur eine Sicherheitsmaßnahme. In Powershell (nicht im Skript) können Sie Folgendes ausführen:

Set-ExecutionPolicy Bypass

Sie sollten mehr lesenüber die Ausführungsrichtlinieum einen umfassenden Überblick über die möglichen Einstellungen zu erhalten.

Wenn Sie ein Powershell-Skript über eine geplante Aufgabe ausführen, können Sie die Ausführungsrichtlinie beim Aufruf wie folgt ändern:

powershell.exe -ExecutionPolicy Bypass

Ein vollständiger Aufruf einer geplanten Aufgabe könnte folgendermaßen aussehen:

powershell.exe -NoProfile -NonInteractive -NoLogo -ExecutionPolicy Bypass -File C:\Scripts\script.ps1

Antwort2

FORSchleifen verwenden :

SETLOCAL EnableExtensions
For /R "X:\" %%I IN (*.bat) do (
    xcopy /i "%%I" "Y:\%%~nxI"
    del "%%I"
)

Ihr Skript könnte also lauten:

@echo off
SETLOCAL EnableExtensions
net use X: \\LOCATION FOR STUDENT FOLDERS
net use Y: \\LOCATION FOR COPIED FILES
net use Z: \\LOCATION FOR .TXT FILE OF DELETED FILES
X:
cls
Echo Deleting bat, cmd, vbs, and exe files please wait...
For /R "X:\" %%I IN (*.*) do (
    set "isTrue="
    if (%%~xI == ".bat") set isTrue=1
    if (%%~xI == ".cmd") set isTrue=1
    if (%%~xI == ".vbs") set isTrue=1
    if (%%~xI == ".exe") set isTrue=1
    if defined isTrue (
        xcopy "%%I" "Y:\%%~nxI"
        del /s "%%I" > "Z:\DeletedFiles.txt" 2>&1
    )
)
mountvol X:\ /D
mountvol Y:\ /D
mountvol Z:\ /D
cls
Echo Process Completed. Drives Unmounted
set /p=Press Any Key To Close

verwandte Informationen