Batch file 循环浏览文件-使用目录名
TL;DR:我希望能够循环浏览文件夹/子文件夹中的每个文件,并在每个循环中使用文件所在的目录名。 如果我的目录结构如下:Batch file 循环浏览文件-使用目录名,batch-file,Batch File,TL;DR:我希望能够循环浏览文件夹/子文件夹中的每个文件,并在每个循环中使用文件所在的目录名。 如果我的目录结构如下: -- Main ----- Printer 1 ------- File 1 ------- File 2 ----- Printer 2 ------- File 1 理想情况下,我需要做的是遍历“Main”并获取“Printer 1”和“Printer 2”中的文件,但我需要在脚本中使用打印机目录的名称。例如: 目前,我正在使用以下工具: :loop for /f %%
-- Main
----- Printer 1
------- File 1
------- File 2
----- Printer 2
------- File 1
理想情况下,我需要做的是遍历“Main”并获取“Printer 1”和“Printer 2”中的文件,但我需要在脚本中使用打印机目录的名称。例如:
目前,我正在使用以下工具:
:loop
for /f %%f in ('dir /b D:\FireflyWebApps\www\apps\label\resources\labels_to_print\') do (
"C:/Program Files/Java/jre1.8.0_66/bin/java" -jar C:\test\pdfbox.jar PrintPDF -silentPrint D:\FireflyWebApps\www\apps\label\resources\labels_to_print\%%f
del D:\FireflyWebApps\www\apps\label\resources\labels_to_print\%%f
)
ping localhost -n 5 > nul
goto loop
它工作得很好,它在目录中循环并打印PDF,但是我需要它来处理多个打印机。我知道这不是一个理想的解决方案,但我需要将默认打印机更改为“printer X”文件名(因此我将打印机名存储为文件夹,然后使用它运行“更改默认打印机”命令)
如何在批处理脚本中使用文件所在的文件夹名
可能的解决方案 下面的脚本将cd复制到目录中,循环遍历其中的目录,对每个目录执行内部循环。在运行内部循环之前,它获取目录名并设置默认打印机。我必须做一个IF==1,因为它是一台打印机,我不能在文件夹名中使用“\”
cd C:\test
for /D %%d in (*) do (
IF "%%d" == "1" (
RUNDLL32 PRINTUI.DLL,PrintUIEntry /y /n "\\192.168.102.131\lp1"
)
for /f %%f in ('dir /b C:\test\%%d') do (
echo %%f
)
)
pause
以下是我对获取文件的文件夹名问题的解决方案:
@echo off
setlocal EnableDelayedExpansion
:loop
for /F "delims=" %%F in ('dir /A-D /B /S "D:\FireflyWebApps\www\apps\label\resources\labels_to_print\*" 2^>nul') do (
set "FolderPath=%%~dpF"
set "FolderPath=!FolderPath:~0,-1!"
for %%P in ("!FolderPath!") do (
echo Printer name is: %%~nxP
"%ProgramFiles%\Java\jre1.8.0_66\bin\java.exe" -jar C:\test\pdfbox.jar PrintPDF -silentPrint "%%F"
del "%%F"
)
)
ping localhost -n 5 > nul
goto loop
带有选项/A-D/B/S
的命令DIR返回指定目录和所有子目录中具有完整路径且不带双引号的所有文件名的列表
将在末尾带有反斜杠的驱动器和路径指定给环境变量。必须删除末尾的反斜杠,这是通过复制文件夹路径字符串的字符串替换来完成的,最后一个字符除外
现在,此文件夹路径末尾没有反斜杠,用于第二个FOR循环,当然,该循环始终只有一个循环运行,以获取存储当前文件的文件夹的名称,即打印机名称
批处理文件原样只输出打印机名称
此处必须使用延迟变量扩展,因为在块中定义了FolderPath
如果命令DIR在任何目录中找不到任何文件,则输出错误消息。此错误消息从stderr重定向到nul,因为此批处理文件不需要连续运行
不使用命令DIR的另一种方法也适用于Unicode文件名(©):
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
dir/?
echo/?
获取/?
goto/?
ping/?
设置/?
setlocal/?
@echo off
setlocal EnableDelayedExpansion
:loop
for /F "delims=" %%F in ('dir /A-D /B /S "D:\FireflyWebApps\www\apps\label\resources\labels_to_print\*" 2^>nul') do (
set "FolderPath=%%~dpF"
set "FolderPath=!FolderPath:~0,-1!"
for %%P in ("!FolderPath!") do (
echo Printer name is: %%~nxP
"%ProgramFiles%\Java\jre1.8.0_66\bin\java.exe" -jar C:\test\pdfbox.jar PrintPDF -silentPrint "%%F"
del "%%F"
)
)
ping localhost -n 5 > nul
goto loop
带有选项/A-D/B/S
的命令DIR返回指定目录和所有子目录中具有完整路径且不带双引号的所有文件名的列表
将在末尾带有反斜杠的驱动器和路径指定给环境变量。必须删除末尾的反斜杠,这是通过复制文件夹路径字符串的字符串替换来完成的,最后一个字符除外
现在,此文件夹路径末尾没有反斜杠,用于第二个FOR循环,当然,该循环始终只有一个循环运行,以获取存储当前文件的文件夹的名称,即打印机名称
批处理文件原样只输出打印机名称
此处必须使用延迟变量扩展,因为在块中定义了FolderPath
如果命令DIR在任何目录中找不到任何文件,则输出错误消息。此错误消息从stderr重定向到nul,因为此批处理文件不需要连续运行
不使用命令DIR的另一种方法也适用于Unicode文件名(©):
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
dir/?
echo/?
获取/?
goto/?
ping/?
设置/?
setlocal/?
代码>特别是阅读最后一页。我不太熟悉批处理脚本。。。我来看看,试一试。你必须使用批处理文件吗?如果您可以使用powershell,它的语法会更简单,因为循环批处理语法非常麻烦,我考虑过powershell,是的,它肯定是一个选项。我需要学习它,因为我从来没有研究过它。我已经找到了一个可行的方法,请查看上面的。它似乎有效,但在我们的生活环境中尝试之前我不知道代码>特别是阅读最后一页。我不太熟悉批处理脚本。。。我来看看,试一试。你必须使用批处理文件吗?如果您可以使用powershell,它的语法会更简单,因为循环批处理语法非常麻烦,我考虑过powershell,是的,它肯定是一个选项。我需要学习它,因为我从来没有研究过它。我已经找到了一个可行的方法,请查看上面的。这似乎有效,但在我们的生活环境中尝试之前,我不知道。