用用户输入文本替换文本,多行
replace text with userinput text, multiple lines
我在批处理文件中写了一些代码,我已经设置好了,这样你就可以将文本拖放到批处理文件中,它会在 header 的顶部添加一个使用名为“Header.txt”的文档的 .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
专为 运行ning 命令和可执行文件而设计。它不是为修改文本文件而设计的,例如搜索和替换文本文件中的内容。
参见 How can you find and replace text in a file using the Windows command-line environment?
对于已知 header 内容的任务,手动创建带有用户输入日期的 header 文件会更容易,接下来复制刚刚创建的 header 文件和指定的文件(s) 一起复制到临时文件,并用顶部插入 header 的临时文件替换原始文件,最后删除创建的 header 文件。
此任务的批处理文件代码:
@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 文件资源管理器(或任何其他文件管理器),无需或拖放一个或多个文件到批处理文件(或批处理文件的快捷方式 运行)。否则,批处理文件将从命令提示符 window 或使用选项 /K
或 /k
启动,以在批处理文件处理完成后保持命令进程 运行ning。请参阅 debugging a batch file 为什么批处理文件编码专家 运行 从命令提示符 window 开发批处理文件 window。
- 它可以在以多个文件名启动时处理多个文件。也可以 运行 带有通配符模式的批处理文件来处理文件夹中与通配符模式匹配的所有文件。
- 它输出有关在没有参数(或第一个参数只是一个空参数字符串
""
)或 /?
作为第一个参数时启动的用法信息。
- 它以国际日期格式
yyyy-MM-dd
(日期格式可以在代码中轻松更改)以当前日期预定义环境变量InputDate
,以便批处理文件的用户只需点击RETURN 或 ENTER 使用当前日期。有关用于以 yyyy-MM-dd
格式获取当前日期的命令行的说明,请参阅 Time is set incorrectly after midnight. 上的答案
- 可以右键单击批处理文件,左键单击子菜单中打开的上下文菜单 发送到 菜单项 桌面(创建快捷方式),用Ctrl+X剪切在Windows桌面创建的快捷方式文件,用Ctrl+V粘贴快捷方式文件进入文件夹
%APPDATA%\Microsoft\Windows\SendTo
(在 Windows 文件资源管理器的地址栏中输入此字符串,然后点击 RETURN 打开此文件夹)。然后可以在 Windows 文件资源管理器中 select 多个文件,右键单击其中一个 selected 文件打开上下文菜单,然后在子菜单中左键单击 发送to 在快捷方式文件的名称上插入相同的 header 当前 select 在 Windows 中编辑的所有文件 Windows 文件资源管理器上没有太多文件 select ed(命令行长度限制)。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
cls /?
color /?
copy /?
del /?
echo /?
endlocal /?
for /?
goto /?
if /?
move /?
pause /?
rem /?
robocopy /?
set /?
setlocal /?
另请参阅:
我在批处理文件中写了一些代码,我已经设置好了,这样你就可以将文本拖放到批处理文件中,它会在 header 的顶部添加一个使用名为“Header.txt”的文档的 .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
专为 运行ning 命令和可执行文件而设计。它不是为修改文本文件而设计的,例如搜索和替换文本文件中的内容。
参见 How can you find and replace text in a file using the Windows command-line environment?
对于已知 header 内容的任务,手动创建带有用户输入日期的 header 文件会更容易,接下来复制刚刚创建的 header 文件和指定的文件(s) 一起复制到临时文件,并用顶部插入 header 的临时文件替换原始文件,最后删除创建的 header 文件。
此任务的批处理文件代码:
@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 文件资源管理器(或任何其他文件管理器),无需或拖放一个或多个文件到批处理文件(或批处理文件的快捷方式 运行)。否则,批处理文件将从命令提示符 window 或使用选项/K
或/k
启动,以在批处理文件处理完成后保持命令进程 运行ning。请参阅 debugging a batch file 为什么批处理文件编码专家 运行 从命令提示符 window 开发批处理文件 window。 - 它可以在以多个文件名启动时处理多个文件。也可以 运行 带有通配符模式的批处理文件来处理文件夹中与通配符模式匹配的所有文件。
- 它输出有关在没有参数(或第一个参数只是一个空参数字符串
""
)或/?
作为第一个参数时启动的用法信息。 - 它以国际日期格式
yyyy-MM-dd
(日期格式可以在代码中轻松更改)以当前日期预定义环境变量InputDate
,以便批处理文件的用户只需点击RETURN 或 ENTER 使用当前日期。有关用于以yyyy-MM-dd
格式获取当前日期的命令行的说明,请参阅 Time is set incorrectly after midnight. 上的答案
- 可以右键单击批处理文件,左键单击子菜单中打开的上下文菜单 发送到 菜单项 桌面(创建快捷方式),用Ctrl+X剪切在Windows桌面创建的快捷方式文件,用Ctrl+V粘贴快捷方式文件进入文件夹
%APPDATA%\Microsoft\Windows\SendTo
(在 Windows 文件资源管理器的地址栏中输入此字符串,然后点击 RETURN 打开此文件夹)。然后可以在 Windows 文件资源管理器中 select 多个文件,右键单击其中一个 selected 文件打开上下文菜单,然后在子菜单中左键单击 发送to 在快捷方式文件的名称上插入相同的 header 当前 select 在 Windows 中编辑的所有文件 Windows 文件资源管理器上没有太多文件 select ed(命令行长度限制)。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
cls /?
color /?
copy /?
del /?
echo /?
endlocal /?
for /?
goto /?
if /?
move /?
pause /?
rem /?
robocopy /?
set /?
setlocal /?
另请参阅: