例如
考虑:
H:\reports\test\12345\dailynews.pdf
我希望使用PDF
作业(sql server 2008 R2)通过邮件发送此MSSQL
。
但每当另一个作业创建pdf
文件时,位置就会发生变化。
喜欢
H:\reports\test\48596\dailynews.pdf
我需要一个批处理程序来查找测试文件夹后面的文件夹名称。
答案 0 :(得分:1)
关于给定的信息,我建议 将字符串拆分为反斜杠并提取第4个元素:
set p=H:\reports\test\12345\dailynews.pdf
for /F "delims=\ tokens=4" %%a in ("%p%") do echo %%a
请注意双引号("%p%")
,因此它被解释为字符串(而不是文件名或命令)。
如果你想确定第3个元素是test
文件夹,那么我建议:
set p=H:\reports\test\12345\dailynews.pdf
set o=H:\reports\live\55555\dailynews.pdf
for /F "delims=\ tokens=3,4" %%a in ("%p%") do if "%%a"=="test" echo %%b
for /F "delims=\ tokens=3,4" %%a in ("%o%") do if "%%a"=="test" echo %%b
输出12345
但不是55555
文件夹中的live
。
编辑:
我意识到我的答案完全被遗漏了,人们如何能够发现最新的dailynews.pdf
,这正是OP可能正在寻找的。
就像每日新闻例程运行在21.00,并且您想要在22.00发送该报告。 (再次,又一个假设。)
IMO,棘手的部分是解析和比较文件的日期/时间信息。
简单的dir dailynews.txt /S /O:-D
不适用于子目录。
因此...
@echo off
cls
set base=H:\reports\test
set filename=dailynews.pdf
set current_date=19000101
set current_time=0000
set current_file=
::debug output
dir "%filename%" /S /O:-D
:: inspect each entry
for /F "usebackq" %%a in (`dir "%filename%" /S /B /O:-D`) do call :inspect "%%a"
:: all done, quit
goto :quit
:: subroutine for comparing current with actual newest entry
:inspect
echo %1
set _date=
set _time=
:: get comparable date time info
:: change to your regional date/time settings/locale! (german here)
:: maybe check SO for other locales
for /F "usebackq tokens=1,2,3,4,5 delims=.: " %%a in (`dir %1^|findstr "%filename%"`) do echo %%a %%b %%c %%d %%e&set _date=%%c%%b%%a&set _time=%%d%%e
:: we have to split in two components, otherwise it seems too big for comparing
if /I %_date% LSS %current_date% goto :eof
if /I %_time% LSS %current_time% goto :eof
:: this one is newer! set new values
set current_date=%_date%
set current_time=%_time%
set current_file=%1
goto :eof
:quit
set current_
如果你不在某个时间清理基础,性能可能会变差。
答案 1 :(得分:1)
递归检查可能会报告树中其他位置存在的相同命名文件,并且可能需要更长时间。我的建议是改用它:
@Echo Off
Set "MyFile="
For /D %%A In ("H:\reports\test\*"
) Do If Exist "%%A\dailynews.pdf" Set "MyFile=%%~fA\dailynews.pdf"
If Not Defined MyFile Exit/B
Echo %%MyFile%% = %MyFile%