我在想是否存在某种软件可以将一堆 Windows 命令放入队列中。例如,我可以先将某个文件复制到某个地方,然后重命名这些文件,然后删除旧文件,然后编辑其中一个文件等,而无需等待任何段落的有效执行。当复制需要大量时间的大文件时,这可能很有用,而且我不想坐在电脑前一直盯着进度条。
有这样的事存在吗?
答案1
最简单的方法是编写一个批处理文件来执行您想要的操作,例如打开记事本并复制以下内容:
@echo off
echo Starting batch script
copy c:\temp\*.* c:\temp2\*.*
del c:\temp2\test.exe
echo all file operations complete
接下来,将其保存为 .bat 格式,然后双击或进入命令提示符并输入其名称即可运行它。您在其中写入的所有操作都将按顺序处理。
答案2
不久前我写了一个名为的小批处理脚本QSTART
。也许它会有所帮助。
它允许您(理论上)创建和执行任何 BATCH 命令的队列。队列是存储在%TEMP%
目录中的纯文本文件。
这是一个非常简单的脚本,我在备份时用它来排队 zip 命令。
我没有做太多调试,因此请随意纠正任何现有的错误。我不能 100% 确定它是否能正确处理每个 BATCH 命令字符串,但它应该适合简单的任务。
重要。每个排队的命令都按原样执行。脚本不会检查任何错误,但循环ERRORLEVEL
内的简单验证FOR
可以解决该问题。
另外,我不是专业的程序员,并且知道脚本有点混乱(即,我不知道运行排队命令的任何其他方法;内置START
命令有时对我来说不起作用)。
脚本末尾有帮助和一些示例。使用QSTART
不带参数的命令可显示它。
@echo OFF
setlocal
rem qstart root directory
set ROOT=%~dp0
call :DEBUG "qstart root directory: %ROOT%"
rem queue storage directory
set QDIR=%TMP%
call :DEBUG "queue directory: %QDIR%"
rem 1.parameter (mandatory) - queue ID
rem if no queue ID given display help message
set QID=%~1
call :DEBUG "queue ID: %QID%"
if "%QID%"=="" goto :MSG_HELP
set QFILE=%QDIR%\%QID%.Q
call :DEBUG "queue file: %QFILE%"
shift
rem 2. parameter (mandatory) - queue operation
set QOP=%~1
shift
call :DEBUG "queue operator: %QOP%"
if "%QOP%"=="add" goto :QADD
if "%QOP%"=="list" goto :QLIST
if "%QOP%"=="load" goto :QLOAD
if "%QOP%"=="new" goto :QNEW
if "%QOP%"=="remove" goto :QREMOVE
if "%QOP%"=="run" goto :QRUN
if "%QOP%"=="save" goto :QSAVE
goto :ERR_SYNTAX
rem add command to queue
rem create queue if not exists
:QADD
if not exist "%QFILE%" call :QNEW
set QCMD=:
:NEXTPAR
set QCMD=%QCMD% %1
shift
if not "%~1"=="" goto :NEXTPAR
set QCMD=%QCMD:: =%
call :DEBUG "queued command: %QCMD%"
echo %QCMD% >>"%QFILE%"
goto :EOF
rem list queued commands
rem warn if queue not exists
:QLIST
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
type "%QFILE%"
)
goto :EOF
rem import queue from file
rem create queue if not exists
rem warn if file not exists
:QLOAD
if not exist "%QFILE%" call :QNEW
set FILE=%~1
call :DEBUG "load file: %FILE%"
if not exist "%FILE%" (
call :ERR_NOFILE
) else (
copy /B /Y "%QFILE%"+"%FILE%" "%QFILE%" >NUL
)
goto :EOF
rem clear queue
rem create queue if not exists
:QNEW
if exist "%QFILE%" call :QREMOVE
copy /B /Y NUL "%QFILE%" >NUL
goto :EOF
rem remove queue
rem warn if queue not exists
:QREMOVE
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
del /F /Q "%QFILE%" >NUL
)
goto :EOF
rem execute queued commands
rem clear queue after execution
:QRUN
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=* delims=" %%C in (%QFILE%) do (
%%C
rem alt.way of execution: start "" /B /WAIT %%C
call :DEBUG "ERROR LEVEL of last operation: !ERRORLEVEL!"
)
endlocal
rem call :QREMOVE
call :QREMOVE
)
goto :EOF
rem export queue to file
rem warn if queue not exists
rem overwrite file if exists
:QSAVE
set FILE=%~1
call :DEBUG "save file: %FILE%"
if not exist "%QFILE%" (
call :ERR_BADQID
) else (
copy /B /Y "%QFILE%" "%FILE%" >NUL
)
goto :EOF
rem messages ------------------------------------------------------------------
rem bad syntax error
rem show help
:ERR_SYNTAX
echo ERROR: syntax error
call :MSG_HELP
goto :EOF
rem bad queue id error
:ERR_BADQID
echo ERROR: bad queue ID '%QID%'
goto :EOF
rem file not found error
:ERR_BADFILE
echo ERROR: file not found '%FILE%'
goto :EOF
rem usage information
:MSG_HELP
echo qstart v.0.1.5 - by [email protected]
echo Allows to create and execute queues of BATCH commands.
echo.
echo USAGE: qstart {QUEUE_ID} {QUEUE_OPERATOR} {COMMAND or FILE}
echo qstart {-h^|--help^|?^|/?}
echo {QUEUE_ID} queue ID
echo {QUEUE_OPERATOR} queue operator
echo {COMMAND} queued command call
echo {FILE} import/export filename
echo -h --help ? or /? shows ^(this^) help message
echo Allowed operations:
echo add {COMMAND} adds command to the queue
echo list lists all queued commands
echo load {FILE} imports ^(appends^) queued commands from a file
echo new creates new or clears existing queue
echo remove deletes queue
echo run executes all queued command and deletes queue
echo save {FILE} exports queue to a file
echo ALSO:
echo set QDEBUG=1 turns on displaying debug messages
echo EXAMPLES:
echo qstart Hello add echo "Hello world!"
echo qstart Hello add pause
echo qstart Hello list
echo qstart Hello save Hello-copy.txt
echo qstart Hello new
echo qstart Hello load Hello-copy.txt
echo qstart run
pause
goto :EOF
rem display debug message and pause
:DEBUG
if "%QDEBUG%"=="1" (
echo ### DEBUG INFO ### %~1
pause >NUL
)
goto :EOF
答案3
您还可以考虑适用于 Windows 的 GNU Make。它是单一的二进制文件(与典型的脚本语言不同),并且可以从一个 Makefile 运行不同的命令序列,并具有精细的控制以在任何单个命令失败时继续或中止。它还具有比批处理脚本更好的每个目标变量传播和替换机制。
我经常使用它来存储和调用 Windows 上运行不止一次或两次的短命令序列,特别是当我在特定时间创建命令序列并需要稍后运行它时。