[NT Batch] Как получить каталог из введенного пользователем файла? - PullRequest
2 голосов
/ 25 мая 2009

Мне нужно знать, как извлечь информацию каталога из введенного пользователем файла, рассмотрим этот код в качестве примера:


ECHO Drag and drop your .txt file here, after that press Enter:
SET txtfile=
SET /P txtfile=
ECHO.
CD %txtfile%

Конечно, это не сработало, так как я не извлекал путь к файлу из% txtfile% и вот пример вывода я хочу:

<b>C:\></b>Drag and drop your .txt file here, after that press Enter:
C:\somefolder\somesubfolder\somefile.txt
<b>C:\></b>Press Enter to continue...

<b>C:\somefolder\somesubfolder\></b>

обратите внимание, что он изменил свой рабочий каталог

Ответы [ 3 ]

2 голосов
/ 25 мая 2009

Вы можете извлечь полный путь следующим образом:

@echo off
setlocal
echo Drag and drop your .txt file here, after that press Enter:
set txtfile=
set /p txtfile=
echo.
for %%i in (%txtfile%) do set txtdir=%%~dpi
for %%i in (%txtfile%) do set txtfil=%%~nxi
cd /d %txtdir%
dir %txtfil%
endlocal

Первый оператор for получает диск и путь, второй - имя файла и расширение. Я использовал cd /d, чтобы изменить каталог и диска, и просто использовал setlocal/endlocal, чтобы сохранить мой путь вне скрипта (вы можете удалить их, если вам все равно).

Полный набор ~ -модификаторов можно найти, запустив "for /?" в командном окне. Это действительно мощная команда, и эти модификаторы не ограничиваются «for», их также можно использовать в любых аргументах типа% 1 для скриптов.

1 голос
/ 25 мая 2009
ECHO Drag and drop your .txt file here, after that press Enter:
SET txtfile=
SET /P txtfile=
ECHO.
CD %txtfile%\..

Я не знаю почему, но это работает в XP, может работать и в NT.

0 голосов
/ 22 февраля 2012

Ответ на этот вопрос заключается в том, чтобы взять то, что сказал один человек, и изменить его ...

paxdiablo был на правильном пути, однако это не копирование / вставка. Для его правильной работы (и, возможно, это только для меня под управлением Windows7) вам нужно 2 файла.

Первый файл: drag_drop.bat

@echo off
echo Drag and drop your .txt file here, after that press Enter:
set txtfile=
set /p txtfile=
echo.%txtfile%
call c:\temp\process_filename.bat %txtfile%

Второй файл: process_filename.bat

FOR %%i in (%txtfile%) do set txtdir=%~dp1
cmd /K "cd %txtdir%"

Причина, по которой мне пришлось использовать 2 файла, заключается в том, что триггер для% ~ dp1 (синтаксис которого был неверен в paxdiablo - без обид, я знаю, что у вас 187 тыс. Повторений, и я даю вам за это поддержку [у вас было %% ~ dpi , %% используется в echo для отключения специального символа '%', а dp1 - это разделитель, который позволяет убрать кавычки, путь к файлу из имени файла - то же самое относится и к %% ~ nxi])

Так или иначе, вам нужно вызвать командный файл, передав ему другое имя файла. Вот тут и приходит второй. Он убирает необходимую информацию, а затем позволяет вам получить доступ к этому пути, а затем открывает этот каталог в командной строке cmd.

АЛЬТЕРНАТИВА

Вы можете сделать это из того же файла ...

@echo off
setlocal
IF '%process%'=='1' goto processFile
echo Drag and drop your .txt file here, after that press Enter:
set txtfile=
set /p txtfile=
echo.%txtfile%
set process=1
call c:\temp\dragdrop.bat %txtfile%

:processFile
set txtdir=
FOR %%1 in (%txtfile%) do set txtdir=%~dp1
cmd /K "cd %txtdir%"
endlocal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...