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

533
Mantis Tsai

Привет, я довольно новичок в пакетных файлах, так что извините, если этот вопрос кажется глупым, но мне действительно нужна помощь.

Поэтому мне нужен мой пакетный скрипт, чтобы проверить, находится ли он в указанной папке, скажем, %userprofile%\Desktopнапример. Я не хочу, чтобы он заботился о собственном имени файла. Я понятия не имею, с чего начать. Я знаю, как получить текущий путь / имя файла и т. Д., Но это все, что я знаю. Как заставить программу сравнивать свой текущий путь с путем, который я хочу увидеть, если он находится? Или есть другой, более эффективный метод?

То, что я хочу достичь, это так:

if this file is in Desktop folder( echo It's here )else( echo It's not here ) 

Любая помощь приветствуется, спасибо всем

4
Вы проверяли эхо% cd%? user648026 6 лет назад 0
https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file user648026 6 лет назад 1
@ user648026% cd% не будет показывать путь к пакетному файлу, а только текущий каталог. Текущий путь похож на% ~ p0, но я забыл точный синтаксис. LPChip 6 лет назад 1
см. ссылку: https://stackoverflow.com/questions/4419868/what-is-the-current-directory-in-a-batch-file user648026 6 лет назад 0
Возможный дубликат [Получить имя текущей папки командой DOS?] (Https://superuser.com/questions/160702/get-current-folder-name-by-a-dos-command) LPChip 6 лет назад 0
Моя главная проблема была со сравнением путей, но спасибо, ребята Mantis Tsai 6 лет назад 0

2 ответа на вопрос

2
Vlastimil Ovčáčík

Не нужно извиняться, потому что вопрос, который вы подняли, сложнее, чем вы, вероятно, ожидаете.

Решение

Вот как вы можете проверить, что ваш пакетный файл находится в определенной папке, в вашем случае в папке Desktop:

@echo off  :: Normalize this batch script's path set BATCH_PATH=%~dp0 set BATCH_PATH=%BATCH_PATH:~0,-1%  :: Test for equality if "%BATCH_PATH%"=="%USERPROFILE%\Desktop" ( echo This file is on Desktop. ) else ( echo This file is not on Desktop. ) 

Что стоит отметить

  • Альтернативный способ нормализации пути (и мой любимый) это:

    pushd "%~dp0" set BATCH_PATH=%CD% popd 
    • в любом случае, вы, вероятно, захотите удалить любой трейлинг \, что является одной из вещей, которые нормализация делает для вас
  • используйте %~dp0переменную вместо %cd%, потому что последняя семантика - это папка, в которой работают ваши скрипты, а первая - это папка, в которой находится ваш скрипт (что вы и просили)

    • %0 дает вам местоположение вашего пакетного скрипта
    • добавляя dp(то есть %dp0) вы запрашиваете диск и путь, в котором не указаны имя файла и расширение (что-то вроде этого, example.batи это будет обременительно на следующем шаге - проверка на равенство)
    • добавив, ~вы просите удалить все открытия или закрытия, "если это необходимо (т.е. путь содержит пробел)
  • пути обернуты, "чтобы предотвратить ошибки из-за возможного места в строке пути


Не так просто, как можно было бы подумать, верно?

На самом деле это не так, спасибо за ответ и разъяснения по поводу% dp /% cd%. Я кое-что понял во время игры, хотя это то, что когда я заменяю% USERPROFILE% \ Desktop на C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ StartUp (общая папка автозагрузки), кажется, выполняет код, несмотря ни на что. Я делаю что-то неправильно? Mantis Tsai 6 лет назад 0
Добро пожаловать. Сценарий у меня работает правильно, если я проверяю папку `StartUp`. Мне нужно больше деталей - особенно код, что он делает и что вы ожидаете от него. Vlastimil Ovčáčík 6 лет назад 0
Кстати, теперь есть две папки автозагрузки a) `C: \ ProgramData \ Microsoft \ Windows \ Start Menu \ Programs \ StartUp` и b)` C: \ Users \ Admin \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup`. Vlastimil Ovčáčík 6 лет назад 0
Я использовал код из ответа ниже (я действительно не вижу разницы, кроме того, что его ответ не установил путь в качестве переменной). Он работает на всех папках, которые я тестировал, кроме любой папки автозагрузки. Mantis Tsai 6 лет назад 0
Мой код: `@echo off IF% ~ dp0 ==% USERPROFILE% \ Desktop \ (ECHO это здесь) ELSE (ECHO это не здесь) IF% ~ dp0 ==% USERPROFILE% \ AppData \ Roaming \ Microsoft \ Windows \ Start Меню \ Программы \ Автозагрузка \ (ЭХО это здесь) ЕЩЕ (ЭХО Это не здесь) ЕСЛИ% ~ dp0 == C: \ ProgramData \ Microsoft \ Windows \ Пуск Меню \ Программы \ Автозагрузка \ (ЭХО это здесь) ЕЩЕ (ЭХО Это не так) здесь) пауза` Mantis Tsai 6 лет назад 0
Он возвращает «Это здесь, это здесь, это не здесь, это здесь, это не здесь», когда я помещаю его на рабочий стол Mantis Tsai 6 лет назад 0
Я вижу и получаю тот же результат, что и вы. Причиной этого является то, что тест на равенство в ** последних двух операторах if ** не выполняется, и оба блока ** if ** и ** else ** выполняются. Первый * если * в порядке. Причина в том, что путь к папке `Startup` содержит пространство, и вы / Art не указали путь в двойных кавычках, как я. Vlastimil Ovčáčík 6 лет назад 0
Хорошо, я забыл добавить это. Я добавил кавычки и программа действительно работает! Спасибо за помощь :) Mantis Tsai 6 лет назад 0
0
Art Gertner

Минимальный рабочий пример с использованием %cd%:

IF %cd%==%userprofile%\Desktop ( ECHO It's here ) ELSE ( ECHO It's not here ) 

Используя промежуточную переменную:

FOR /F "tokens=*" %%a in ('cd') do SET CURRENT_DIR=%%a IF %CURRENT_DIR%==%userprofile%\Desktop ( ECHO It's here ) ELSE ( ECHO It's not here ) 

Поскольку вы сказали, что не знаете, с чего начать, вот хороший материал для чтения: https://en.wikibooks.org/wiki/Windows_Batch_Scripting

-1, это не отвечает на вопрос. LPChip 6 лет назад 1
Это решило мою проблему (на данный момент), и спасибо за ссылку! Я буду обязательно читать это. Но некоторые источники говорят, что есть разница между% cd% и% ~ dp0, причем первые иногда представляют другой путь? Я несколько запутался Mantis Tsai 6 лет назад 1
Этот ответ время от времени писали, что неясно, запрашивает ли Mantis решение «% cd%» или «% ~ dp0». В заголовке вопроса указывался путь к файлу сценария, но в теле вопроса дважды указывалось «текущий каталог», и он был помечен как «рабочий каталог». Отсюда и путаница. Vlastimil Ovčáčík 6 лет назад 2

Похожие вопросы