Я хочу сохранить абсолютный путь всех файлов, находящихся под папкой, в текстовый файл, скажем, temp.txt
.
Я использую эту команду для выполнения этой задачи:
dir /s/b/a-d > D:\my work\temp.txt
Вышеприведенная команда работает нормально, когда я перенаправляю на имя файла, записанное жестко закодированным в пакетный файл.
Но когда я использую переменную, как показано ниже, я не получаю вывод, перенаправленный в файл temp.txt
.
@echo off
setlocal enabledelayedexpansion
REM I am running this script from D:\my work\
set origDir= %cd%
cd C:\
set temporaryFile="!origDir!\temp.txt"
dir /s/b/a-d > !temporaryFile!
Почему вывод DIR не записывается в D:\my work\temp.txt
?
Ответ на Почему нет строки вывода с “echo% var%” после использования “set var = text” в командной строке? что не так в командной строке:
set origDir= %cd%
Пробел после знака равенства не игнорируется командой SET. Поэтому строковое значение переменной окружения origDir
определяется с помощью символа ведущего пробела.
Затем в командной строке
set temporaryFile="!origDir!\temp.txt"
приводит к вашему случаю в строке " D:\my work\temp.txt"
с двойными кавычками, назначаемыми переменной среды temporaryFile
" D:\my work\temp.txt"
.
Таким образом, имя файла с контуром, заключенным в двойные кавычки, недопустимо из-за начала с символа пробела.
Возможный код для вашей задачи:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"
rem Current directory path usually does not end with a backslash. But on
rem current directory being root of a drive it ends with a backslash which
rem should be removed to correct concatenate it with backslash and file name.
if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile=%origDir%\temp.txt"
cd /D C:\
dir /A-D /B /S >"%temporaryFile%"
endlocal
Здесь не требуется использование расширенного расширения переменных переменных.
Командный компакт-диск изменяет текущий каталог на указанный каталог на другом диске, чем текущий диск, только если параметр /D
также используется, и указанный каталог не находится в сетевом ресурсе, на который ссылается путь UNC.
Команда PUSHD с включенными расширениями команд работает также для UNC-путей и с POPD можно восстановить исходный текущий каталог.
Ну, команда ENDLOCAL восстанавливает в пакетном файле выше также начальный текущий каталог. Это можно увидеть при запуске этого командного файла из окна командной строки с D:\my work
являющейся текущим каталогом. echo %CD%
выполняется после запуска выходов пакетного файла D:\my work
хотя командный файл изменяется в корневую директорию диска C:
Прочтите этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL.
Также возможно, но не рекомендуется:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "origDir=%CD%"
if "%origDir:~-1%" == "\" set "origDir=%origDir:~0,-1%"
set "temporaryFile="%origDir%\temp.txt""
cd /D C:\
dir /A-D /B /S >%temporaryFile%
endlocal
Переменная окружения temporaryFile
содержит имя файла с полным путем уже в двойных кавычках, и поэтому командная строка DIR выполняется после предварительной обработки с помощью командного интерпретатора Windows, как:
dir /A-D /B /S 1>"D:\my work\temp.txt"
В общем случае нецелесообразно назначать имя папки или файла, заключенное в двойные кавычки, в переменную среды, поскольку это может легко привести к неожиданному поведению, если значение переменной будет конкатенировано позже в пакетном коде с другими строками, см., Например, Как установить переменные среды с пробелами?
Но самая короткая версия для этой задачи – единственная командная строка:
@dir C:\* /A-D /B /S >temp.txt
Эта единственная командная строка делает то же самое, что и два командных файла со всеми этими командами выше. Он создает в текущем каталоге D:\my work
файл temp.txt
с именами всех файлов на весь диск C:
с полным путем, для которого у текущей учетной записи пользователя есть разрешения для перечисления записей в каталоге.
Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и тщательно прочитайте все страницы справки, отображаемые для каждой команды.
-
cd/?
-
dir/?
-
echo/?
-
endlocal/?
-
if/?
-
rem/?
-
set/?
-
setlocal/?
Читайте также статью Microsoft об использовании операторов перенаправления команд.
%0
– специальная переменная, которая ссылается на исполняемый скрипт. Если вы хотите ссылаться на местоположение, в котором этот скрипт хранится, вы всегда можете сделать это в любое время, используя его расширенную форму для диска и путь %~dp0
, которая заканчивается обратной косой чертой, D:\my work\
Помня об этом и независимо от вашего текущего каталога, вы должны смело использовать эту строку в своем скрипте:
Dir/B/S/A-D C:\>"%~dp0temp.txt"
Примечания. Я вложил ваше имя выходного файла в двойные кавычки, чтобы защитить включенное пространство. Поскольку вы запускаете команду Dir
на ваш системный диск, также может быть рекомендовано исключить соединения и системные файлы Dir/B/S/ADLS
с выхода.