Цикл по строке папки и синтаксическому анализу длится имя папки

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

15
задан Uwe Keim 21 September 2018 в 06:45
поделиться

8 ответов

Вы были достаточно близки к нему :) Это должно работать:

@echo OFF
set mydir="%~p0"
SET mydir=%mydir:\=;%

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i
goto :EOF

:LAST_FOLDER
if "%1"=="" (
    @echo %LAST%
    goto :EOF
)

set LAST=%1
SHIFT

goto :LAST_FOLDER

По некоторым причинам для команды не любит '\' как разделитель, таким образом, я преобразовал все '\' в''; сначала (SET mydir=%mydir:\=;%)

10
ответ дан 1 December 2019 в 00:37
поделиться

Небольшое изменение для того, если какая-либо из папок имеет пробелы на их имена - пространство замены к ':' прежде и после операции:

set mydir="%~p0"
set mydir=%mydir:\=;%
set mydir=%mydir: =:%

for /F "tokens=* delims=;" %%i IN (%mydir%) DO call :LAST_FOLDER %%i
goto :EOF

:LAST_FOLDER
if "%1"=="" (
  set LAST=%LAST::= %
  goto :EOF
)

set LAST=%1
SHIFT

goto :LAST_FOLDER
1
ответ дан 1 December 2019 в 00:37
поделиться

В пакетных файлах в команде FOR необходимо будет предварительно ожидать %whatever с дополнительным % (например, %% безотносительно).

'% эха ~p0' будет печатать в настоящее время каталог пакетного файла.

0
ответ дан 1 December 2019 в 00:37
поделиться

Это - то, что мы имели в конце (немного более сырой, и может только пойти настолько глубоко :)

@echo off
for /f "tokens=1-10 delims=\" %%A in ('echo %~p0') do (
    if NOT .%%A==. set new=%%A
    if NOT .%%B==. set new=%%B
    if NOT .%%C==. set new=%%C
    if NOT .%%D==. set new=%%D
    if NOT .%%E==. set new=%%E
    if NOT .%%F==. set new=%%F
    if NOT .%%G==. set new=%%G
    if NOT .%%H==. set new=%%H
    if NOT .%%I==. set new=%%I
    if NOT .%%J==. set new=%%J
)

@echo %new%
0
ответ дан 1 December 2019 в 00:37
поделиться

Я изменил ответ данный @Jonathan, так как он не работал на меня в пакетном файле, но это ниже действительно работает и также поддерживает папки с пробелами в нем.:

for %%a in ("%CD%") do set LastFolder=%%~nxa
echo %LastFolder%

Это берет текущий каталог и эхо последняя, самая глубокая папка, как в ниже примера, если папка - это:

C:\Users\SuperPDX\OneDrive\Desktop Environment\

пакетный код повторяет это: Настольная среда

1
ответ дан 1 December 2019 в 00:37
поделиться

Я не знаю, в какой версии Windows я использую (win2k3), но цикл FOR не дает мне ничего полезного при попытке перебрать одну строку. Согласно моим наблюдениям (и информации FOR /?) Вы получаете одну итерацию для каждой строки ввода в FOR, и нет способа изменить это для итерации внутри строки. Вы можете разбить на несколько токенов для данной строки, но это только один вызов тела цикла FOR.

Я действительно думаю, что подход CALL: LABEL в этих ответах отлично справляется.Что-то, чего я не знал, пока не посмотрел на это, было это ";" и "," оба распознаются как разделители аргументов. Итак, как только вы замените обратную косую черту точкой с запятой, вы можете вызвать свою метку и выполнить итерацию с помощью SHIFT.

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

@echo off
if "%1"=="" goto :USAGE

set FULLPATH=%~f1
set STOPDIR=%2
set PATHROOT=

:: Replace backslashes with semicolons
set FULLPATH=%FULLPATH:\=;%

:: Iterate through path (the semicolons cause each dir name to be a new argument)
call :LOOP %FULLPATH%
goto :EOF

:LOOP

::Exit loop if reached the end of the path, or the stop dir
if "%1"=="" (goto :EOF)
if "%1"=="%STOPDIR%" (goto :EOF)

::If this is the first segment of the path, set value directly. Else append.
if not defined PATHROOT (set PATHROOT=%1) else (set PATHROOT=%PATHROOT%\%1)

::shift the arguments - the next path segment becomes %i
SHIFT

goto :LOOP

:USAGE
echo Usage:
echo %~0 ^<full path to parse^> ^<dir name to stop at^>
echo E.g. for a command:
echo %~0 c:\root1\child1\child2 child2
echo The value of c:\root1\child1 would be assigned to env variable PATHROOT
0
ответ дан 1 December 2019 в 00:37
поделиться

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

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

Чтобы проверить это, просто скопируйте и вставьте в командный сценарий (.cmd) в любом каталоге, а затем запустите его. Он выплюнет только самую глубокую директорию, в которой вы сейчас находитесь.

Примечания:

  • Замените %~dp0 на любой путь, который вам нравится (как есть, он вернет самую глубокую папку, из которой запущен пакетный файл. Это не то же самое, что %cd%.)
  • При указании переменной 'pathtofind' убедитесь, что нет кавычек, например, c:\some path, а не "c:\some path".
  • Оригинальная идея маскировки папок принадлежит мне
  • Пробелы в пути - не проблема
  • Глубина папки - не проблема
  • Это стало возможным благодаря гениальному совету этого пакетного скрипта http://www.dostips.com/DtCodeBatchFiles.php#Batch.FindAndReplace

Надеюсь, это поможет кому-нибудь еще.

@echo off
set pathtofind=%~dp0
if not exist %pathtofind% echo Path does not exist&pause>nul&goto :eof

cd /d %pathtofind%
set path1=%cd%
cd ..
set path2=%cd%

call set "path3=%%path1:%path2%\=%%"

echo %path3%

pause>nul
4
ответ дан 1 December 2019 в 00:37
поделиться

К сожалению, эта программа отлично работает только при некоторой глубине, но есть проблемы с пребыванием на самой вершине горы ... Помещение этой программы в "C: \ Windows", например приведет к ... "C: \ Windows", а не к "Windows". По-прежнему отличная работа, и все же повреждения можно отремонтировать. Мой подход:

@echo off
set pathtofind=%~dp0
if not exist %pathtofind% echo Path does not exist&pause>nul&goto :eof

cd /d %pathtofind%
set path1=%cd%
cd ..
set path2=%cd%
set path4=%~dp1
call set "path3=%%path1:%path2%\=%%"
call set "path5=%%path3:%path4%*\=%%"
echo %path5%

pause>nul

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

-2
ответ дан 1 December 2019 в 00:37
поделиться