Пакет Как извлечь вторую последнюю папку из нескольких путей, а затем использовать их - PullRequest
0 голосов
/ 24 декабря 2018

Следующий код создает ярлыки к путям, перечисленным в List.txt текстовом файле (например, C:/folder1/folder2/folder3/folder4), и сохраняет все ярлыки к пути, указанному в set SAVETO.Как извлечь каждую Folder3 (второе имя последней папки каждой строки в List.txt, чтобы использовать его затем в %SAVETO% путях)?

<...>
SET "SAVETO=%userprofile%\desktop"
for /f "usebackq delims=" %%G IN ("List.txt") DO (
    call :createLink "%%~nG" "%%G"
)
goto :eof

:createLink
set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"
echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT%
echo sLinkFile = "%SAVETO%\%~1.lnk" >> %SCRIPT%
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT%
echo oLink.TargetPath = "%~2" >> %SCRIPT%
<...>

После получения второй последней папки, ярлык должен бытьсохранено в:

D:/custompath/%Folder3-second last from row in List.txt%/

ОБНОВЛЕНИЕ: Например, этот код - почти то, что мне нужно, он извлекает folder3 имя, но я не могу применить это к своему коду.А также мне не нужно проверять equ "\"

setlocal EnableDelayedExpansion
set "var=C:\folder 1\folder 2\folder 3\folder 4\"
if "%var:~-1%" equ "\" set var=%var:~0,-1%
set var=%var:\=" "%
for %%a in ("%var%") do (
   set lastButOne=!lastFolder!
   set lastFolder=%%~a
)
echo Last but one: %lastButOne%

И когда код вернул имя второй последней папки текущей строки из List.txt Я хочу использовать это имя в пути сохранения C:/path/*Second Last Folder Name*/Shortcut.И мне нужно сделать это для каждой строки отдельно.Таким образом, если в первой строке List.txt указан путь C:/a/bbb/c, ярлык для этого пути должен быть сохранен в c:/custom_path/bbb/shortcut_name, для C:/ab/cd/efff/g он должен быть сохранен в c:/custom_path/efff/shortcut_name.

1 Ответ

0 голосов
/ 24 декабря 2018

ОБНОВЛЕНИЕ Я изменил код, чтобы правильно получить имя родительского каталога.

Это пример вложенного цикла FOR (упоминаемого в комментариях), который выможно использовать для извлечения родительского элемента каталога, который поступает из каждой строки ввода.

@SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "delims=" %%G IN (List.txt) DO (
    SET "PARENT=%%~dpG"
    REM  Strip off the trailing backslash. ~p leaves the backslash at the end.
    SET "PARENT=!PARENT:~0,-1!"
    FOR /F "delims=" %%P IN ("!PARENT!") DO (
        CALL :createLink "%%~nxG" "%%~nxP" "%%~dpP"
    )
)
EXIT /B

:createLink будет вызываться с именем каталога «leaf» в качестве первого параметра, именем (только—Не путь) родительского каталога этого каталога и путь к родительскому каталогу этого каталога в качестве третьего.Я понимаю, что это не совсем то, чего хочет ваш код, но поскольку я не совсем понимаю, чего вы хотите достичь (не то, что это неправильно - то, как вы используете данные, просто кажется мне необычным), по крайней мере, два изтри части информации здесь (хотя я не знаю, какие из двух) выглядят так, как вы просите.

Хотя goto :eof обычно работает (если вы не определили :eof где-то, кроме концафайл), я предпочитаю EXIT /B, поскольку он прост и делает именно то, что вы хотите.

Для тестирования я использовал это как List.txt

C:/folder1/folder2/folder3/folder4
C:/folder1/folder12/folder113/folder1114/folder/folder11115
C:\folderA\folderB\folderC\folderD

Если я добавлю некоторую отладку вкод выше:

@SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
FOR /F "delims=" %%G IN (List.txt) DO (
    @ECHO G: %%~G
    SET "PARENT=%%~dpG"
    SET "PARENT=!PARENT:~0,-1!"
    FOR /F "delims=" %%P IN ("!PARENT!") DO (
        @ECHO P: %%~P
        CALL :createLink "%%~nxG" "%%~nxP" "%%~dpP"
    )
)
EXIT /B

:createLink
@ECHO :createLink
@ECHO   Arg 1: %~1
@ECHO   Arg 2: %~2
@ECHO   Arg 3: %~3
EXIT /B

Тогда вывод, который я получаю при запуске сценария:

G: C:/folder1/folder2/folder3/folder4
P: C:\folder1\folder2\folder3
:createLink
  Arg 1: folder4
  Arg 2: folder3
  Arg 3: C:\folder1\folder2\
G: C:/folder1/folder12/folder113/folder1114/folder/folder11115
P: C:\folder1\folder12\folder113\folder1114\folder
:createLink
  Arg 1: folder11115
  Arg 2: folder
  Arg 3: C:\folder1\folder12\folder113\folder1114\
G: C:\folderA\folderB\folderC\folderD
P: C:\folderA\folderB\folderC
:createLink
  Arg 1: folderD
  Arg 2: folderC
  Arg 3: C:\folderA\folderB\
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...