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