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

Расположение файла

@echo off Нет беспорядка

cls чистого листа

Echo Searching потому что иногда это занимает некоторое время

dir /b /s myScripts.bat И это выводит полный каталог, включая имя файла.

Поэтому моя первая проблема - избавиться от имени файла. Вот что я попробовал:

set stringOne=dir /b /s myScripts.bat

%stringOne:~0, 60%

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

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

dir c:\users\myUsername\cloudDrive\scripts , или что бы то ни было, и вместо этого cmd вводит dir c:\users\m и ищет ВСЕ из этого рекурсивно.

Опять же, я хотел бы, чтобы он показывал мне измененную версию каталога, в котором он искал, а НЕ изменял команду поиска в каталоге. Позже я буду использовать последнюю строку, созданную для установки моего рабочего каталога, но я пытаюсь сделать это по одному шагу за раз, чтобы понять, что происходит.

РЕДАКТИРОВАТЬ: конечная цель сценария отличается от моей цели его написания. Когда все будет сказано и сделано, я смогу набрать myScripts.bat в cmd, на любом компьютере, к которому я добавлю, это PATH, моя облачная папка, и он получит каталог этой облачной папки с помощью команды dir, и затем измените его рабочий каталог на каталог командного файла.

2 ответа2

1

Чтобы ответить на эту часть:

И это выводит полный каталог, включая имя файла. Поэтому моя первая проблема - избавиться от имени файла.

В пакетном файле вы можете сделать

@echo off

:: locate 'myScripts.bat' and save its directory to 'myDir'
:: in case of multiple matches 'myDir' will be set to the last one
set "myDir="
for /f "delims=" %%x in ('dir /b /s myScripts.bat') do set "myDir=%%~dpx"
if not defined myDir echo not found ?? & exit /b 1

:: ready to use
echo myDir = "%myDir%"

Чтобы лучше ориентироваться в пакетных файлах, я рекомендую прочитать встроенную справку, начиная с set /? , if /? , for /? call /? ,

[EDIT] Добавлен "delims=" для правильной обработки путей с пробелами.

0

Допустим, вы создаете командный файл с именем test.cmd и помещаете в него следующий текст, который будет выглядеть следующим образом:

@echo off
echo %0
echo %cd%

set currentpath=%0

::remove any " if present
set currentpath=%currentpath:"=%

:: remove last 9 characters
set currentpath=%currentpath:~0,-9%

:: add quotes back
set currentpath="%currentpath%"

echo %currentpath%

pause

и вывод будет, если:

                C:\Windows\System32>%appdata%\..\..\desktop\test.cmd
%0:             C:\Users\LPChip\AppData\Roaming\..\..\desktop\test.cmd
%cd%:           C:\Windows\System32
%currentpath%:  "C:\Users\LPChip\AppData\Roaming\..\..\desktop"
                Press any key to continue . . .

Первая команда использует функцию замены. Оператор ~ означает замену подстроки, добавив 0, новая строка начинается с позиции 0, а -9 означает 9 позиций справа.

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

Большой ресурс для получения дополнительной информации о работе со строками - этот сайт: dostips.com

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