批处理脚本未使用此代码输出文件

时间:2019-01-29 03:41:53

标签: file batch-file for-loop

此脚本应输出第1行中存储的10个单词的句子中的每个单词(当使用SeparateLine.bat(文件名)1调用时,它不会显示错误,也不会输出或制作文件。

我已经尝试删除(echo %%a > 1.txt)和下面的括号,但无济于事。我还尝试了将输出输出到何处的其他格式,仍然没有用。

@echo off
if not exist "%~1" echo file not found & exit /b 1
if "%~2"=="" echo line not defined & exit /b
if "%~2"=="1" set line=1 & goto start
set /a line=%~2-1
:start
For /f "tokens=1,2,3,4,5,6,7,8,9,10* usebackq skip=%line% delims= " %%A in ("%~1") do (                       
    if not "%%A"=="" (echo %%A > 1.txt)
    if not "%%B"=="" (echo %%B > 2.txt)
    if not "%%C"=="" (echo %%C > 3.txt)
    if not "%%D"=="" (echo %%D > 4.txt)
    if not "%%E"=="" (echo %%E > 5.txt)
    if not "%%F"=="" (echo %%F > 6.txt)
    if not "%%G"=="" (echo %%G > 7.txt)
    if not "%%H"=="" (echo %%H > 8.txt)
    if not "%%I"=="" (echo %%I > 9.txt)
    if not "%%J"=="" (echo %%J > 10.txt)
    GOTO endforloop
)
:endforloop

文件包含一个,两个,三个...十个用空格分隔的文件,它应该输出10个文件(最大字数限制为10),每个文件包含该行的字1-10(我在第二个中指定了第1行)参数,例如单词在第一行),但实际结果是……什么也没有。从字面上看,它的行为就好像它成功完成了一样,但是没有文件,而且没有错误代码。

1 个答案:

答案 0 :(得分:0)

我认为这将是您想要的。请注意,您不能在skip=%line%中使用预定义变量,而需要使用more +%line%,不需要定义每个标记token=1,2,3,4...等,只需使用tokens1-10和最后但并非最不重要的一点是,无需使用delims=,因为空格是默认的分隔符:

@echo off
if not exist "%~1" echo file not found & exit /b 1
if "%~2"=="" echo line not defined & exit /b
if "%~2"=="1" set line=1 & goto start
set /a line=%~2-1
:start
For /f "tokens=1-10" %%A in ('type "%~1" ^| more +%line%') do (              
    if "%%A" NEQ "" echo %%A
    if not "%%B"=="" echo %%B
    if not "%%C"=="" echo %%C
    if not "%%D"=="" echo %%D
    if not "%%E"=="" echo %%E
    if not "%%F"=="" echo %%F
    if not "%%G"=="" echo %%G
    if not "%%H"=="" echo %%H
    if not "%%I"=="" echo %%I
    if not "%%J"=="" echo %%J
    goto :EOF
)

但是您的line变量存在缺陷。

如果用户选择0,它将执行0 - = -1 and then set the lines to skip-1 if a user selects 2 it will set it to skip 1`,这不是用户要求的,所以我建议您用跳过线阐明一下自己的意图,但也许完全摆脱它,例如:

@echo off
if not exist "%~1" echo file not found & exit /b 1
if "%~2"=="" echo line not defined & exit /b
set /a line=%~2
:start
For /f "tokens=1-10" %%A in ('type "%~1" ^| more +%line%') do (              
    if "%%A" NEQ "" echo %%A
    if not "%%B"=="" echo %%B
    if not "%%C"=="" echo %%C
    if not "%%D"=="" echo %%D
    if not "%%E"=="" echo %%E
    if not "%%F"=="" echo %%F
    if not "%%G"=="" echo %%G
    if not "%%H"=="" echo %%H
    if not "%%I"=="" echo %%I
    if not "%%J"=="" echo %%J
    goto :EOF
)