4

Я успешно разделяю %PATH% на несколько строк, как это

set t=%PATH:;=^&echo.%

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

echo %t%

Однако, когда я хочу записать переменную в файл

echo %t% >paths.txt

только последняя строка записывается в файл.

Что я делаю неправильно?

Обновить

Оказывается, set t=%PATH:;=^&echo.% Команда не заменяет ; символы с разрывами строк (как мне сказали) , но это relplces его и командой &echo.‌​ которая позже казнены.

2 ответа2

4

Что я делаю неправильно?

Вы должны окружить последнее echo с ( и )

(echo %t%) > paths.txt

Исправленный пакетный файл (test.cmd):

@echo off
setlocal
set t=%PATH:;=^&echo.%
echo %t%
(echo %t%) > paths.txt
:endendlocal

Пример использования:

> test
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\apps\WSCC\Sysinternals Suite
C:\apps\WSCC\NirSoft Utilities
C:\apps\Calibre\
C:\apps\Git\cmd
C:\apps\Git\mingw64\bin
C:\apps\Git\usr\bin
C:\apps\nodejs\
C:\Users\DavidPostill\AppData\Roaming\npm
> type paths.txt
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\apps\WSCC\Sysinternals Suite
C:\apps\WSCC\NirSoft Utilities
C:\apps\Calibre\
C:\apps\Git\cmd
C:\apps\Git\mingw64\bin
C:\apps\Git\usr\bin
C:\apps\nodejs\
C:\Users\DavidPostill\AppData\Roaming\npm

Более простое решение

Это решение не требует каких-либо скобок на пути, который должен быть экранирован.

test.cmd:

@echo off
setlocal
for %%i in ("%path:;=";"%") do (
  echo %%~i >> paths.txt
)
:endendlocal

И из командной строки:

for %i in ("%path:;=";"%") do echo %~i >> paths.txt

Дальнейшее чтение

0

Ваш t не должен хранить специальные управляющие символы как часть пути, такие как " , & , | , % и так далее. Если это так, то вы можете просто заменить символ конца ) имеющий помехи парсеру:

(echo %t:)=^)%) > a

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .