批处理脚本解析文本与for循环



我遇到了一个用for循环解析文本的问题。

我有一个文件夹,其中包含以客户命名的Excel文件,需要从CSV文件(pass.csv)中归档/加密密码,结构为PASSWORD;CUSTOMER_NAME.

想法是生成一个Excel文件列表(dir.txt),与pass.csv中的客户名称匹配,提取密码并使用它对文件夹(dir.txt)中的所有Excel文件进行加密7zip归档。如果客户不在列表中,则生成一个新的随机密码。

我认为在for循环中使用GOTO(子程序)存在问题。它不是进入dir.txt中的下一个条目,而是结束循环。

你能帮我正确地写这段代码吗?谢谢你! !

setlocal EnableDelayedExpansion
dir /b *.xlsx > dir.txt
for /f "tokens=*" %%a in (dir.txt) do (
for /f "tokens=*" %%w in (pass.csv) do (
for /f "tokens=2 delims=;" %%z in ("%%w") do (
IF "%%z"=="%%a" (
for /f "tokens=1 delims=;" %%y in ("%%w") do (
set pass=%%y
GoTo NEXTSTEP
)
) ELSE (set pass=!random!)
)
)
:NEXTSTEP
CLS
ECHO  #  WORKING ON FILE: %%a
ECHO  #  ENCRYPTED WITH PASSWORD: !pass!
"C:Program Files7-Zip7z" a -t7z -mhe=on -p!pass! "%%a".7z "%%a"
PING loopback -n 2 > NUL
)

这是未经测试的,只是基于你所发布的假设,但这是你想要实现的吗?

If Not Exist "pass.csv" GoTo :EOF
SetLocal EnableDelayedExpansion
For /F "EOL=? Tokens=*" %%G In ('Dir "*.xlsx" /B /A:-D 2^>NUL') Do (
%SystemRoot%System32findstr.exe /IL ";%%G" "pass.csv" 1>NUL && (
For /F "Tokens=1-2 Delims=;" %%H In (
'%SystemRoot%System32findstr.exe /IL ";%%G" "pass.csv"'
) Do If /I "%%I" == "%%G" Set "pass=%%H"
) || Set "pass=!RANDOM!"
ClS
Echo  #  WORKING ON FILE: %%G
Echo  #  ENCRYPTED WITH PASSWORD: !pass!
"%ProgramFiles%7-Zip7z.exe" a -t7z -mhe=on -p"!pass!" "%%~nG.7z" "%%G"
%SystemRoot%System32PING.EXE loopback -n 2 1>NUL
)

我设法覆盖"语法error"通过将随机密码作为第一个循环的一部分- as "default"。真正的开发者可能会翻白眼,但它确实有效。: D

for /f "tokens=*" %%a in (dir.txt) do (
set pass=!random!
for /f "tokens=*" %%w in (pass.csv) do (
for /f "tokens=2 delims=;" %%z in ("%%w") do (
if "%%z"=="%%a" (
for /f "tokens=1 delims=;" %%y in ("%%w") do (
set pass=%%y
)
)
)
)

最新更新