大家好,我目前在学校工作,我创建了一个脚本来扫描所有学生文件夹以查找特定文件类型,我想知道是否有办法让它在删除特定文件类型之前对其进行复制?我想不出一种方法来做到这一点,因为 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