Как перенаправить вывод команды в файл, имя которого определено в переменной среды?

Вопрос:

Я хочу сохранить абсолютный путь всех файлов, находящихся под папкой, в текстовый файл, скажем, 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 об использовании операторов перенаправления команд.

Ответ №1

%0 — специальная переменная, которая ссылается на исполняемый скрипт. Если вы хотите ссылаться на местоположение, в котором этот скрипт хранится, вы всегда можете сделать это в любое время, используя его расширенную форму для диска и путь %~dp0, которая заканчивается обратной косой чертой, D:\my work\

Помня об этом и независимо от вашего текущего каталога, вы должны смело использовать эту строку в своем скрипте:

Dir/B/S/A-D C:\>"%~dp0temp.txt"

Примечания. Я вложил ваше имя выходного файла в двойные кавычки, чтобы защитить включенное пространство. Поскольку вы запускаете команду Dir на ваш системный диск, также может быть рекомендовано исключить соединения и системные файлы Dir/B/S/ADLS с выхода.

Оцените статью
TechArks.Ru
Добавить комментарий