告诉批处理文件工作目录,而不使用change directory (cd)命令



我有一个批处理文件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

如果参数通过,脚本使用启动

的文件夹

最新更新