2017-06-22 2 views
2

I Ordner A mit mehreren PDF-Dateien mit dem Namen haben:Suchordner mit Namen von Dateien und Druckinhalt

FL001.pdf 
FL002.pdf 
FL003.pdf 
etc. 

Und ein Ordner B mit Unterverzeichnisse, die anderen Ordner nach Dateien in Ordner mit dem Namen enthalten eine, die andere PDF-Dateien enthält, wie folgt aus:

FL000-099 
     FL001 
      - 001100.pdf 
      - 001101.pdf 
     FL002 
      - 002100.pdf 
      - 002101.pdf 
     FL003 
      - 003100.pdf 
      - 003101.pdf 
FL100-199 
     FL101 
      - 101100.pdf 
      - 101101.pdf 
     FL102 
      - 102100.pdf 
      - 102101.pdf 
     F3003 
      - 103100.pdf 
      - 103101.pdf 
etc. 

Und ich habe auch einen Netzwerkdrucker.


Was ich versuche zu tun: in Ordner

Indem Sie den Namen der PDF-Dateien A die entsprechenden Unterordner in Ordner B suchen; Wenn vorhanden, dann senden Sie an den Drucker die .pdf-Datei von Ordner A und dann an den Drucker senden alle PDF-Dateien im entsprechenden Unterverzeichnis von Ordner B, dann gehen Sie zur nächsten Datei und wiederholen Sie den Vorgang für alle Namen/Dateien in Ordner A.

Drucken der .pdfs in Ordner A ist in Ordnung, aber ich brauche Hilfe für den zweiten Teil, der nicht funktioniert. Wenn ich die current_directory zu ...\Folder B\FL000-099\ ändere, funktioniert es, aber ich muss in allen Unterverzeichnissen vom ursprünglichen Pfad suchen. (Siehe Code unten)


Was ich

@echo off 
set current_directory=C:\Users\user\Desktop\Folder B\ 
set art_directory=C:\Users\user\Desktop\Folder A\ 

set filename=FL001 
set extension=.pdf 

set tofind=%current_directory%%filename% 
set tofind2=%art_directory%%filename% 

set tofindextension=%tofind2%%extension% 


IF EXIST %tofindextension% ("C:\Program Files\SumatraPDF\SumatraPDF.exe" %tofindextension% -print-to "\\server\printer" 
    ) ELSE (
     echo "No file!" 
    ) 

IF EXIST %tofind%\ (
    FOR /R %tofind% %%F in (*.pdf*) do "C:\Program Files\SumatraPDF\SumatraPDF.exe" %tofind%\%%~nxF -print-to "\\server\printer" 

    ) ELSE (

     echo "No file!" 
    ) 


pause 

Ist es möglich gemacht haben zu suchen, wie oben beschrieben? Kannst du mir mit einer Lösung helfen?

+1

Als erstes müssen Sie Ihren Code wie dieses 'SET "var_name = Variable String Value"' ändern und Ihre Variablen wie dieses ' "% var_name%" Referenz' oder '"% var_name% \ "' ** Es geht nur um die Doppelquoten ** – Compo

+1

'F3003' in Ihrem Beispiel sollte' FL103', rig ht? – aschipfl

Antwort

2

Das folgende Batch-Skript erfüllt genau das, wonach Sie gefragt haben. Sie haben keine Schleifen in Ihrem Skript, aber Sie sollten, siehe here how to loop through files und here how to loop through directories.

Drei Loops werden benötigt, das erste wird benötigt, um Ihre Dateien in Folder A zu durchlaufen. Die zweite Schleife durchläuft alle Unterverzeichnisse in Folder B. Die letzte Schleife ruft alle Dateien in diesem Unterverzeichnis ab, um sie mit der Datei Folder A zu vergleichen.

@echo off 
setlocal enabledelayedexpansion 

rem set directories 
set "current_directory=C:\Users\andre_kampling\Desktop\batTest\Folder B" 
set "art_directory=C:\Users\andre_kampling\Desktop\batTest\Folder A" 
rem set extension 
set "extension=txt" 


rem loop through all files of "Folder A" 
pushd "%art_directory%" 
for /r %%f in ("*.%extension%") do (
    set "curFileA=%%~nf" 
    set "curFileAFull=%%f" 
    rem loop through all directories of "Folder B" 
    for /d %%d in ("%current_directory%\*") do (
     set "curDirB=%%d" 
     rem is in "Folder B\*" a folder with the name of file in "Folder A"? 
     set "curSubDirB=!curDirB!\!curFileA!" 

     if exist "!curSubDirB!\" (
     rem file exists print file of "Folder A" and all files found 
     rem in sub directory 
     echo. 
     echo Subfolder is existent "!curSubDirB!" 
     call :print curFileAFull 

     rem loop through all files in that subdirectory  
     pushd "!curSubDirB!" 
     for /r %%g in ("*.%extension%") do (
      set "file=%%g" 
      call :print file 
     ) 
     popd 
    ) 
    ) 
) 
popd 

pause 
exit /B 

rem function definitions 
:print 
set "arg=!%1!" 
echo File "%arg%" will be printed... 
"C:\Program Files\SumatraPDF\SumatraPDF.exe" %arg% -print-to "\\server\printer" 
+0

Statt 'for/R' in eine Subroutine zu verschieben, können Sie auch' pushd '\ root \ path "' vor und 'popd' hinter' '/ R'' setzen, als Vorgabe auf das aktuelle Verzeichnis ... – aschipfl

+0

@aschipfl: Ja, dein absolutes Recht! Ich werde meine Antwort verbessern, wenn ich Zeit habe. –

+0

@ User552853: Ich habe das Batch-Skript aktualisiert, jetzt sollte es perfekt mit Ihrer Situation funktionieren. Vor meiner Bearbeitung hatte es Probleme mit Leerzeichen in Pfaden, ich habe das geändert und getestet. Es klappt. –

2

Wenn ich die Anforderungen richtig verstehen, tun einige gestapelt Denn sollte ein Wenn ein Anruf ohne alle, die Variablen.

Wenn die Ausgabe richtig aussieht, entfernen Sie das Echo in der letzten Zeile.

2

Ich würde nicht eine rekursive Suche im Verzeichnisbaum Folder B für jede Datei in Folder A tun, da die Zielunterverzeichnisse auf einer festen Hierarchie Tiefe ohnehin befinden.Dies ist eine mögliche Lösung:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_CUR_DIR=C:\Users\user\Desktop\Folder B" 
set "_ART_DIR=C:\Users\user\Desktop\Folder A" 
set "_PATTERN=*.pdf" 
set "_PRN_EXE=%ProgramFiles%\SumatraPDF\SumatraPDF.exe" 
set "_PRN_SWI=-print-to" 
set "_PRINTER=\\server\printer" 

rem // Loop through first directory and enumerate the matching files: 
for %%A in ("%_ART_DIR%\%_PATTERN%") do (
    rem /* Loop through the second directory and only enumerate the 
    rem immediate sub-directories: */ 
    for /D %%B in ("%_CUR_DIR%\*") do (
     rem /* Simply check whether a sub-directory exists having the 
     rem same name as the current file in the first directory: */ 
     if exist "%%~B\%%~nA\" (
      rem /* Print the file from the first directory and all files 
      rem located in the found sub-directory: */ 
      for %%P in ("%%~A" "%%~B\%%~nA\%_PATTERN%") do (
       ECHO "%_PRN_EXE%" "%%~P" %_PRN_SWI% "%_PRINTER%" 
      ) 
     ) 
    ) 
) 

endlocal 
exit /B 

Nach einer erfolgreich verlaufenen Skript getestet hat, die Großbuchstaben entfernen ECHO, um Befehle, um tatsächlich alle Dateien zu drucken!


Wenn Sie wollen, dass die Dateien in Folder B aufsteigend (alphabetisch), um mit ihrem Namen gedruckt werden, die am weitesten innen for Schleife muss durch eine for /F Schleife zusammen mit dir /O:N, ersetzt werden, da sonst der Sortierreihenfolge hängt auf dem Dateisystem:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_CUR_DIR=C:\Users\user\Desktop\Folder B" 
set "_ART_DIR=C:\Users\user\Desktop\Folder A" 
set "_PATTERN=*.pdf" 
set "_PRN_EXE=%ProgramFiles%\SumatraPDF\SumatraPDF.exe" 
set "_PRN_SWI=-print-to" 
set "_PRINTER=\\server\printer" 

rem // Loop through first directory and enumerate the matching files: 
for %%A in ("%_ART_DIR%\%_PATTERN%") do (
    rem /* Loop through the second directory and only enumerate the 
    rem immediate sub-directories: */ 
    for /D %%B in ("%_CUR_DIR%\*") do (
     rem /* Simply check whether a sub-directory exists having the 
     rem same name as the current file in the first directory: */ 
     if exist "%%~B\%%~nA\" (
      rem // Print the file from the first directory: 
      ECHO "%_PRN_EXE%" "%%~A" %_PRN_SWI% "%_PRINTER%" 
      rem /* Print all files located in the found sub-directory, 
      rem sorted alphabetically in ascending order: */ 
      for /F "delims= eol=|" %%P in (' 
       dir /B /A:-D /O:N "%%~B\%%~nA\%_PATTERN%" 
      ') do (
       ECHO "%_PRN_EXE%" "%%~B\%%~nA\%%~P" %_PRN_SWI% "%_PRINTER%" 
      ) 
     ) 
    ) 
) 

endlocal 
exit /B 
Verwandte Themen