TL; DR:我希望能够遍历文件夹/子文件夹中的每个文件,并在每个循环中使用文件所在的目录名。
如果我的目录结构如下:
-- Main
----- Printer 1
------- File 1
------- File 2
----- Printer 2
------- File 1
理想情况下,我需要做的是循环使用' Main'并获取'打印机1'中的文件和'打印机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,但我需要这个才能使用多台打印机。我知道它不是一个理想的解决方案,但我需要将默认打印机更改为打印机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
答案 0 :(得分:0)
以下是我获取文件夹名称问题的解决方案:
@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 循环中使用,当然只有一个循环运行来获取%%~nxP
当前文件夹的名称存储的文件是打印机名称。
批处理文件只是输出打印机名称。
由于在块内定义了FolderPath
,因此必须使用延迟变量扩展。
如果命令 DIR 在任何目录中找不到任何文件,则会输出错误消息。此错误消息从 stderr 重定向到 nul ,因为此批处理文件不断运行。
另一种不使用命令 DIR 的方法也适用于Unicode文件名(©Joey):
@echo off
setlocal EnableDelayedExpansion
:loop
for /R "D:\FireflyWebApps\www\apps\label\resources\labels_to_print" %%F in (*) 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
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
dir /?
echo /?
for /?
goto /?
ping /?
set /?
setlocal /?