Для цикла с вложенными Forfiles работает только если пакет находится в той же папке - PullRequest
1 голос
/ 19 июня 2019

Мой код работает нормально, когда у меня есть .bat в папке "% USERPROFILE% \ Downloads ", где я хочу, чтобы он искал .zip файлов. Я просто не могу понять, как указать здесь, если .bat живет в другом месте. Если я переместу .bat в другое место, где нет вывода, файл, похоже, ничего не сделает.

Я пытался добавить следующее перед командой [FOR], но, похоже, это не помогает. Любой совет будет принята с благодарностью.

CD %USERPROFILE%\Downloads

Вот мой код ...

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%F in (EPSG*.zip) do (
 for /F "tokens=1,* delims=|" %%K in ('
  forfiles /p "%USERPROFILE%\Downloads" /m "%%~F" /c "cmd /c echo @FDATE^|@FTIME"
    ') do (
   setlocal EnableDelayedExpansion  
     set "name=%%~F"
     set "timestamp=%%~K %%L"
     set "timestamp=!timestamp:/=-!"
     set "timestamp=!timestamp::=.!"
     set "destpath=%USERPROFILE%\Downloads\Nearmap Downloads\!timestamp!"
     powershell -command "Expand-Archive -Force -Path '!name!' -DestinationPath '!destpath!'"
     endlocal
    )
)
pause

Ответы [ 3 ]

1 голос
/ 19 июня 2019
@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "rootdir=%USERPROFILE%\Downloads"

for %%F in ("%rootdir%\EPSG*.zip") do (
    for /F "tokens=1,* delims=|" %%K in ('
     forfiles /p "%rootdir%" /m "%%~nxF" /c "cmd /c echo @FDATE^|@FTIME"
    ') do (
        set "name=%%~F"
        set "timestamp=%%~K %%L"

        setlocal EnableDelayedExpansion
        set "timestamp=!timestamp:/=-!"
        set "timestamp=!timestamp::=.!"
        set "destpath=!rootdir!\Nearmap Downloads\!timestamp!"
        powershell -command "Expand-Archive -Force -Path '!name!' -DestinationPath '!destpath!'"
        endlocal
    )
)
  • Базовый цикл for изменен для использования полного пути.
  • forfiles использует поисковую маску текущего zip имя файла с помощью for модификаторов nx.
  • Установить rootdir для хранения корневого каталога в избежать дублирования, чтобы смена рута каталог может быть изменен на значение 1 set.
  • setlocal EnableDelayedExpansion перемещено туда, где нужно и не раньше.
0 голосов
/ 19 июня 2019

Я не уверен, почему вы добавили вложенный цикл for, содержащий ресурсоемкую команду forfiles, вы должны быть в состоянии сделать это примерно так:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "sourcepath=%UserProfile%\Downloads"
Set "destpath=%sourcepath%\Nearmap Downloads"
For %%A In ("%sourcepath%\EPSG*.zip")Do (Set "timestamp=%%~tA"
    SetLocal EnableDelayedExpansion
    Set "timestamp=!timestamp:/=-!"
    Powershell -NoProfile -Command "Expand-Archive -Force -Path '%%A' -DestinationPath '%destpath%\!timestamp::=.!'"
    EndLocal)

В любом случае, когда вы запускаете сценарий , я немного озадачен, почему вы не сделали все это в одном и том же сценарии .ps1!

0 голосов
/ 19 июня 2019
@echo off
setlocal EnableExtensions DisableDelayedExpansion
PUSHD "%USERPROFILE%\Downloads"
...
)
POPD
pause

После выполнения инструкции PUSHD аргумент становится текущим каталогом (поэтому вам не нужно включать его в строку forfiles ...) до тех пор, пока не будет выполнен соответствующий POPD, восстанавливая исходный текущий каталог .

И затем, если yourbatch.bat находится в любом каталоге на PATH , вы сможете выполнить его, просто набрав yourbatch в командной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...