循环文件 - 使用目录名称

时间:2015-12-14 08:30:44

标签: batch-file

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

1 个答案:

答案 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 /?