读取文件的每一行 - 批处理脚本

read each lines of a file - Batch script

我要写一个批处理脚本。该脚本读取输入文件的行,并为每一行执行一个 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 的帮助下。

好的,在聊天讨论中解决问题后,我们总结一下问题:

  • 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

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

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

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