使用FORFILES

使用FORFILES

大家好,我目前在学校工作,我创建了一个脚本来扫描所有学生文件夹以查找特定文件类型,我想知道是否有办法让它在删除特定文件类型之前对其进行复制?我想不出一种方法来做到这一点,因为 xcopy 和 robocopy 都需要语法中的源地址。这是我的脚本

@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

我认为它并不像输入下面的内容那么简单(更不用说可能了)?

xcopy *.bat Y:\

顺便说一下,我无法使用 powershell 脚本,因为我没有权限运行它们(愚蠢的教育部门),但如果有 powershell 替代品,也请发布,因为这对我的学习有好处。

答案1

使用FORFILES

这种方式可能更容易理解:

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

这是一个您可以从命令行运行而不会损害任何东西的示例。

您可以在脚本中这样使用它:

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

使用FOR

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
)

工作原理:

FOR带有开关的命令会/R以递归方式查看提供的目录(在本例中X:\为部分中定义的模式)IN。这里我们给它模式*.bat。对于找到的每个文件,它都会运行之后的语句DO。找到的文件将被放入%%B变量中(您可以选择任何字母)。

(...)通过使用DO,我们允许在循环的每次迭代中运行多个命令。

%%~fB是处理 值的一种特殊方式%%B。 以~开始所有此类特殊格式化程序,并自行删除引号(如果存在)。f将值格式化为完整路径名(如果用作相对路径)。

在命令行运行for /?可以非常详细地说明FOR其功能以及可使用的格式标志。

笔记

我们使用%%B而不是%B帮助中显示的,因为它位于批处理文件中。以下是一些FOR可以在命令行中直接运行的示例:

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

如果这些在批处理文件中,则需要使用双百分号。

关于 PowerShell

我还想指出,您不需要任何特殊权限来运行 powershell 脚本。

如果您收到有关执行策略的错误,这只是一种安全措施,您可以在 powershell 中(而不是在脚本中)运行:

Set-ExecutionPolicy Bypass

你应该多读书关于执行政策以全面了解可能的设置。

如果您通过计划任务运行 powershell 脚本,则可以在调用它时更改执行策略,如下所示:

powershell.exe -ExecutionPolicy Bypass

计划任务的完整调用可能如下所示:

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

答案2

使用FOR循环:

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

因此你的脚本可能是:

@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

相关内容