
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 FOR
Befehl mit dem /R
Schalter durchsucht das angegebene Verzeichnis rekursiv (in diesem Fall X:\
nach dem im IN
Abschnitt 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) DO
eingefügt .%%B
Durch die Verwendung (...)
danach DO
ermöglichen wir die Ausführung mehrerer Befehle bei jeder Iteration der Schleife.
%%~fB
ist eine spezielle Methode, den Wert von zu behandeln %%B
. Das ~
steht am Anfang aller dieser speziellen Formatierer und entfernt automatisch Anführungszeichen, falls vorhanden. f
formatiert den Wert als vollständigen Pfadnamen, falls er relativ verwendet wird.
Die Ausführung for /?
über die Befehlszeile bietet einen sehr detaillierten Überblick über FOR
die Fähigkeiten von und die verwendbaren Formatierungsflags.
Notiz
Wir verwenden %%B
anstelle von %B
, wie in der Hilfe angegeben, da es sich um eine Batchdatei handelt. Hier sind einige Beispiele, FOR
die 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
FOR
Schleifen 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