问题描述
我在批处理文件中编写了一些代码,我已经设置了它,以便您将文本拖放到批处理文件中,并使用一个标题将标题添加到 .TXT 文档的顶部名为“Header.txt”的文档如下所示
Date: _DATE_
Time: _TIME_
Job ID: _ID_
Plant: _PLANT_
Code: _CODE_
Program: _PROGRAM_
Hand: _HAND_
Group: _GROUP_
LABEL X-POS Y-POS Z-POS X-CHK Y-CHK Z-CHK I J K +TOL -TOL
===========================================================================================================================================================================================
如何替换文档中的文本?下面是我的尝试:
@if not "%~1" == "" copy /B "C:\Users\dougj\Desktop\New folder\HEADER.TXT"+"%~1" "%~1.tmp" >nul & move /Y "%~1.tmp" "%~1"
GOTO :USERINPUT
CLS
:USERINPUT
COLOR 7C
SET /p _INPUTNAME= Please Input DATE:
FOR /F "delims=" %%G IN (
'FORFILES /P "%~1" /C "cmd /c echo @path"'
) DO (
for /f "delims=" %%H in ('type "%%~G" ^& break ^> "%%~G" ') do (
set "line=%%H"
setlocal enabledelayedexpansion
>>"%%~G" echo(!line:_DATE_=%_INPUTNAME%
endlocal
)
)
pause
cls
GOTO :Finish
:Finish
CLS
COLOR E3
Echo.
Echo.
ECHO FINISHED!
Echo Press any key to exit...
Echo.
Echo.
Pause
CLS
EXIT
解决方法
Windows 命令处理器 cmd.exe
设计用于运行命令和可执行文件。它不是为修改文本文件而设计的,例如搜索和替换文本文件中的某些内容。
见How can you find and replace text in a file using the Windows command-line environment?
对于这个头文件已知的任务,手动创建带有用户输入日期的头文件会更容易,接下来将刚刚创建的头文件和指定的文件一起复制到临时文件并替换原来的将临时文件头插入顶部的文件,最后删除创建的头文件。
此任务的批处理文件代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "AutomaticClose="
setlocal EnableDelayedExpansion
for %%I in (!CMDCMDLINE!) do if /I "%%~I" == "/C" endlocal & set "AutomaticClose=1" & goto CheckArguments
endlocal
:CheckArguments
if "%~1" == "" goto ShowUsageHelp
if "%~1" == "/?" goto ShowUsageHelp
set "TempHeaderFile=%TEMP%\%~n0.tmp"
color 7C
echo/
for /F "tokens=1-3 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do set "DefaultDate=%%I-%%J-%%K" & goto UserPromptDate
:UserPromptDate
set "InputDate=%DefaultDate%"
set /P "InputDate=Please input date (default: %InputDate%): "
rem Remove all double quotes from input string.
set "InputDate=%InputDate:"=%"
rem Has the user not input anything else than double quotes?
if not defined InputDate goto UserPromptDate
color
setlocal EnableDelayedExpansion
(
echo Date: !InputDate!
echo Time: _TIME_
echo Job ID: _JOBID_
echo Plant: _PLANT_
echo Code: _CODE_
echo Program: _PROGRAM_
echo Hand: _HAND_
echo Group: _GROUP_
echo/
echo LABEL X-POS Y-POS Z-POS X-CHK Y-CHK Z-CHK I J K +TOL -TOL
echo ===========================================================================================================================================================================================
)>"%TempHeaderFile%"
endlocal
for %%I in (%*) do (
copy /B "%TempHeaderFile%"+"%%~I" "%%~I.tmp" >nul
if exist "%%~I.tmp" move /Y "%%~I.tmp" "%%~I"
if exist "%%~I.tmp" del "%%~I.tmp"
)
del "%TempHeaderFile%"
if defined AutomaticClose cls & color E3
echo/
echo/
echo FINISHED!
if defined AutomaticClose echo Press any key to exit...
echo/
if defined AutomaticClose pause >nul & color
goto EndBatch
:ShowUsageHelp
if defined AutomaticClose color 7C
echo/
echo Usage: %~n0 "[PATH\]Document File Name 1" ["[PATH\]Document File Name 2"] ...
echo/
if defined AutomaticClose pause
:EndBatch
endlocal
这个批处理文件有一些额外的增强:
- 它通过处理环境变量
CMDCMDLINE
的值来确定 Windows 命令处理器cmd.exe
是否是使用选项/C
或/c
启动的,以便在执行完后自动关闭批处理文件。在这种情况下,定义了环境变量AutomaticClose
,这会导致用户通过从 Windows shell(桌面、开始菜单、任务栏)或 Windows 文件资源管理器(或任何其他文件管理器)双击运行批处理文件使用其他命令) 在批处理文件上拖放一个或多个文件(或运行批处理文件的快捷方式)。否则,批处理文件从命令提示符窗口中启动,或使用选项/K
或/k
启动,以在完成批处理文件处理后保持命令进程运行。了解debugging a batch file为什么批处理文件编码专家在命令提示符窗口中运行批处理文件。 - 它可以在以多个文件名启动时处理多个文件。还可以使用通配符模式运行批处理文件来处理文件夹中与通配符模式匹配的所有文件。
- 输出使用信息,以无参数启动(或第一个参数只是一个空参数字符串
""
)或以/?
作为第一个参数。 - 它预先定义了环境变量
InputDate
与当前日期的国际日期格式yyyy-MM-dd
(日期格式可以在代码中轻松更改),以便批处理文件的用户只需点击 RETURN 或 ENTER 使用当前日期。有关用于以yyyy-MM-dd
格式获取当前日期的命令行的说明,请参阅 Time is set incorrectly after midnight 上的答案。 - 可以右键单击批处理文件,在菜单项桌面(创建快捷方式)的子菜单发送到中打开的上下文菜单中左键单击,剪切快捷方式在 Windows 桌面上使用 Ctrl+X 创建的文件,并使用 Ctrl+V 将快捷方式文件粘贴到文件夹
%APPDATA%\Microsoft\Windows\SendTo
(在 Windows 的地址栏中输入此字符串文件资源管理器并点击 RETURN 以打开此文件夹)。然后可以在 Windows 文件资源管理器中选择多个文件,右键单击所选文件之一以打开上下文菜单,然后在子菜单 发送到 中的快捷方式文件名称上单击鼠标左键以插入Windows 文件资源管理器中当前选择的所有文件的标题相同,但选择的文件不多(命令行长度限制)。
要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
cls /?
color /?
copy /?
del /?
echo /?
endlocal /?
for /?
goto /?
if /?
move /?
pause /?
rem /?
robocopy /?
set /?
setlocal /?
另见: