我有一个批处理文件merge.bat。它用于将特定文件夹中的所有文件合并为一个文件,每个文件的内容之间使用新行。要告诉merge.bat我想在哪个文件夹上应用合并,我首先使用更改目录 (CD)命令,然后使用cmd命令打开merge.bat。我正在寻找一种方法来告诉merge.bat我的文件在哪里,而不使用更改目录 (CD)第一(类似cmd命令1)。
merge.bat
del merged.txt
for %%I in (*.txt) do (
type %%I >> merged.tmp
echo. >> merged.tmp
)
ren merged.tmp merged.txt
cmd命令
cd "My/Files/Directory/"
"My/Batch/File/Directory/merge.bat"
cmd命令1
"My/Batch/File/Directory/merge.bat" "My/Files/Directory/"
@echo off
setlocal enableextensions disabledelayedexpansion
rem Retrieve folder to process from batch file arguments
set "targetFolder=%~f1"
rem If we do not get a folder, use current one
if not defined targetFolder set "targetFolder=%cd%"
rem Change to the indicated folder
pushd "%targetFolder%" && (
rem Clear existing file
2>nul del merged.txt
rem Output all txt files into temporary file
(for %%a in (*.txt) do (
type "%%a"
echo(
)) > merged.tmp
rem Rename temporary file to final name
ren merged.tmp merged.txt
rem Return to the previous active directory
popd
)
首先,在Windows上,目录分隔符是而不是
/
。
第二,传递给批处理文件的参数可以在%0
(批处理文件名)、%1
(第一个参数)、%2
(第二个参数)、…%*
(所有参数不包括批处理文件名).
为了理解参数的用法,打开一个命令提示窗口,在那里执行命令call /?
,并仔细阅读显示的所有帮助页面。
merge.bat
的批处理代码:
@echo off
if not "%~1" == "" pushd "%~1"
del merged.txt 2>nul
for %%I in (*.txt) do (
type %%I >>merged.tmp
echo.>>merged.tmp
)
ren merged.tmp merged.txt
if not "%~1" == "" popd
在命令提示符窗口pushd /?
中运行此命令的详细信息以及popd。
下面的代码可以帮助你:
@echo off
if "%~1" == "" (set path_to="%~dp0") else (set path_to="%~1")
if exist "%path_to%merged.txt" del %path_to%merged.txt
for %%I in (%path_to%*.txt) do (
type %%I >> %path_to%merged.tmp
echo. >> %path_to%merged.tmp
)
ren %path_to%merged.tmp merged.txt
如果参数通过,脚本使用启动