iT邦幫忙

0

bat 迴圈邏輯求助

  • 分享至 

  • xImage

想提取薪資單的人名,依照順序給個編號(頁數),以下是我想破頭沒解決的半成品,請幫幫我看要怎麼修改才能達到希望結果,先謝謝各位了

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a page=1

:loop
	for /f "tokens=1-2 delims=," %%a in (空白薪資單.csv) do (
		if "%%a" equ "110年1月" (
		set Date=%%a
		set Name=%%b
		)
	)
	echo %page%頁!Date!!Name! >> 123.txt
	set /a page+=1
	if %page% LEQ 60 goto loop 

希望結果
1頁110年1月 a001
2頁110年1月 a002
3頁110年1月 a003
........以此類推

**執行結果:**下面頁數增加了,不過裡面page(頁)要等到Name(a001-a060)跑完停在a060他才開始跑

1頁110年1月 a060
2頁110年1月 a060
3頁110年1月 a060
........以下相同

echo 放進if又變成

1頁110年1月 a001
1頁110年1月 a002
1頁110年1月 a003
........以此類推

空白薪資單.csv 大致原文
110年1月 a001
110年1月 a002
110年1月 a003
........以此類推

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
nwm310
iT邦新手 3 級 ‧ 2021-06-16 20:53:20
最佳解答

csv的內容沒有驚嘆號 !
就能正確執行

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a page=1

for /f "tokens=1-2 delims=," %%a in (空白薪資單.csv) do (
    if "%%a" equ "110年1月" (
        if !page! LEQ 60 (
            set Date=%%a
            set Name=%%b
            echo !page!頁!Date!!Name! >> 123.txt
            set /a page+=1
        )

    )
)

如果csv有很多行,想要提早結束

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set /a page=1

call :aaa
::其他要執行的內容
goto :eof

:aaa
for /f "tokens=1-2 delims=," %%a in (空白薪資單.csv) do (
    if "%%a" equ "110年1月" (
        set Date=%%a
        set Name=%%b
        echo !page!頁!Date!!Name! >> 123.txt
        set /a page+=1
        if !page! GTR 60 exit /b
    )
)

看更多先前的回應...收起先前的回應...

真的很感謝您, 成功運行了!

不過我後來發現我加工pdf的順序嚴重影響到速度

後來想要在寫一個備用方案,比先前多了一步要抓現有的檔名%%i,等於我要抓身份證字號,也要抓檔名放進我的程式, 可是不管怎麼改總有一個數字就是不遞增...

pdftk.exe pg_0001.pdf output a001薪資單.pdf user_pw 身份證字號

set count=1
set page=60
for /f "tokens=1-2 delims=," %%a in (身份證字號.txt) do (
	if "%%a" NEQ "" (
        if !count! LEQ !page! (
			for %%i in (pg_*.pdf) do (
				echo %%a薪資單.pdf 密碼是%%b 原檔名是%%i 第幾圈!count!>> 1.txt
				set /a count+=1
			)
		)
    )
)

結果是這樣,我第一個a001是人名,第二個a002是身份證字號,等於說我在對照身份證字號的文件又是每跑完60圈才換a002...

a001薪資單.pdf 密碼是a001 原檔名是pg_0001.pdf 第幾圈1
a001薪資單.pdf 密碼是a001 原檔名是pg_0002.pdf 第幾圈2
a001薪資單.pdf 密碼是a001 原檔名是pg_0003.pdf 第幾圈3
a001薪資單.pdf 密碼是a001 原檔名是pg_0004.pdf 第幾圈4

nwm310 iT邦新手 3 級 ‧ 2021-06-18 11:28:27 檢舉

pdfList.txt (存為ANSI格式)
注意檔名順序是否符合

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

dir /b /on pg_*.pdf > pdfList.txt

set count=1
set page=60
(for /f "tokens=1-2 delims=," %%a in (身份證字號.txt) do (
	if "%%a" NEQ "" (
        if !count! LEQ !page! (
            set /p fileName=
            echo %%a薪資單.pdf 密碼是%%b 原檔名是!fileName! 第幾圈!count!>> 1.txt
            set /a count+=1
		)
    )
))<pdfList.txt

nwm310 iT邦新手 3 級 ‧ 2021-06-18 11:46:25 檢舉

並且注意:pdf檔案數量是否足夠

謝謝大神, 不好意思, 還有個關於errorlevel的問題

假如我要在aaa.txt尋找kkk這個字串
會比對31次,會有30個回傳errorlevel 1
我在if errorlevel 1 後面打echo是有作用的,但為什麼打set !errorcount!+=1 卻沒有效果呢? 如果是它的特性的話, 有什麼替代方法嗎? 我外面還有一層for...

我是要在errorlevel 1積滿30個errorcount就 count+=1來跳過這個count號碼, 下一個是errorlevel 0 的話可以繼續計數count


@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set errorcount=0
set count=0

findstr /c:"kkk" aaa.txt 
if errorlevel 1 (
	set !errorcount!+=1					
	if !errorcount! EQU 30 set /a count+=1
)

echo !errorcount! !count! >> 123.txt
				
pause
nwm310 iT邦新手 3 級 ‧ 2021-06-20 10:45:12 檢舉
set /a errorcount +=1

謝謝, 多虧您的提醒才能完成這個腳本, 我居然會犯這種錯誤... 還被折騰了好幾個小時...

我要發表回答

立即登入回答