【问题标题】:read each lines of a file - Batch script读取文件的每一行 - 批处理脚本
【发布时间】:2015-10-27 10:38:33
【问题描述】:

我要写一个批处理脚本。该脚本读取输入文件的行并为每一行执行一个 sqlcmd。 但是当我执行我的脚本时,它并没有像我想要的那样工作,事实上它并没有完成这项工作......

我的批处理脚本:

    @echo off

SETLOCAL EnableDelayedExpansion

set Chemin=C:\users\documents\Communication\Test\MSG_IN

 set NomFichierU=UHMSO_1
 set user=admin
 set pwd=admin
 set db=DTBASE_001

cd /d %Chemin%
set nomfic=%NomFichierU%
set HHMMSS=A
set HHMMSS=%LTIME:~0,2%%LTIME:~3,2%%LTIME:~6,2%
for %%f IN (%NomFichierU%*.txt) DO (
    for /f tokens^=*^ delims^=^ eol^= %%l IN (%%f) DO (
      echo test
      REM echo %%l
      ECHO %%G
      set nomficr=%%a 
      set nomfic=!nomficr:~0,-1!.tmp
      REN %%a !nomfic!
      rem executer sript MHUHMS.sql avec sqlplus
      sqlcmd -S MILCS02 -U %user% -P %pwd% -d %db% -i c:\users\documents\SQL\MHUHMS.sql
      move !nomfic! SLD_SLDHI\SAVE
    )
)

而 MHUHMS.SQL 只是在数据库中进行更新。 我的问题是当我执行批处理脚本时,它只是将我放入文件夹'Chemin',但我希望它读取 UHMSO_1_XXXXX.txt 之类的文件。之后,对于我文件的每一行,它都会运行我的 sql 脚本。

此时我的错误: 系统找不到UHMSO_1*.txt文件。

我被放在文件夹中...

如果有人有任何想法,因为我在批处理脚本方面并不是很擅长......而且我也不知道我的 sqlcmd 是否正确......

感谢您的帮助!

编辑:在 wOxxOm 和 MichaelS 的帮助下。

【问题讨论】:

    标签: windows batch-file sqlcmd


    【解决方案1】:

    我不确定代码中是否还有更多错误,但肯定是您缺少SETLOCAL EnableDelayedExpansion。您正在使用延迟扩展(例如 !nomfic!),但如果在脚本开头没有 SETLOCAL EnableDelayedExpansion!...! 将毫无用处。

    【讨论】:

    • 感谢您的贡献,我补充一下!
    • 能否请您更新问题中的代码?我猜代码仍然不起作用?
    • 是的......它不起作用......但现在它与以前不同了。在我被放置在“Chemin”目录之前。现在我在开始的目录中,我在其中执行我的 .bat。所以我觉得这是一件好事......我正在更新我的代码
    【解决方案2】:

    好的,在聊天讨论中排除故障后,我们总结一下问题:

    • for /f 不能与通配符一起使用。在额外的外部for 循环中枚举文件并使用for /f 中的循环变量
    • 文本文件采用 UTF-16 编码,使用for ... ('type "filename"') ...
    • sqlcmd 只能看到普通的批处理变量,不能看到像%%l 这样的循环变量所以pass it with -v
    • 不需要所有带有nomfic%%a%%G 的行
    • 使用cd /d c:\some\path 实际更改工作驱动器和路径。
      或者更好的是 pushd c:\some\path + popd 来保存和恢复之前的工作文件夹。
    • move 仅在处理完所有行后的文件
    • 发布的代码片段不需要SETLOCAL EnableDelayedExpansion

    set Chemin=C:\users\documents\Communication\Test\MSG_IN
    set NomFichierU=UHMSO_1
    set HHMMSS=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    
    pushd %Chemin%
    for /f "delims=" %%f IN ('dir /b "%NomFichierU%*.txt"') DO (
        for /f tokens^=*^ delims^=^ eol^= %%l IN ('type "%%f"') DO (
            sqlcmd -S MILCS02 -U %user% -P %pwd% -d %db% ^
                   -i c:\users\documents\SQL\MHUHMS.sql -v l ="%%l"
        )
        move "%%f" "SLD_SLDHI\SAVE\%%f.%HHMMSS%"
    )
    popd
    pause
    

    附:如果文件名可以包含空格,请使用 usebackq 并引用变量:

    for /f usebackq^ tokens^=*^ delims^=^ eol^= %%l IN ("%%f") DO (
    

    【讨论】:

    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多