Как проверить, существует ли каталог в %PATH %?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

59
задан Govind Parmar 27 January 2017 в 15:19
поделиться

8 ответов

-contains работал на меня

$pathToCheck = "c:\some path\to\a\file.txt"

$env:Path - split ';' -contains $pathToCheck

Для добавления пути, когда он еще не существует, я использую

$pathToCheck = "c:\some path\to\a\file.txt"

if(!($env:Path -split ';' -contains $vboxPath)) {
  $documentsDir = [Environment]::GetFolderPath("MyDocuments")
  $profileFilePath = Join-Path $documentsDir "WindowsPowerShell/profile.ps1"
  Out-File -FilePath $profileFilePath -Append -Force -Encoding ascii -InputObject "`$env:Path += `";$pathToCheck`""
  Invoke-Expression -command $profileFilePath
}
0
ответ дан Günter Zöchbauer 24 November 2019 в 18:02
поделиться

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

, Если Вы хотите добавить (или удалить) каталоги постоянно для СОЕДИНЕНИЯ КАНАЛОМ, смотрите на утилиту Path Manager (pathman.exe) в Windows Resource Kit Tools для задач администрирования, http://support.microsoft.com/kb/927229 . С этим можно добавить или удалить компоненты и системы и пользовательских путей, и она обработает аномалии, такие как дублирующиеся записи.

, Если бы необходимо изменить путь только временно для пакетного файла, я просто добавил бы дополнительный путь перед путем с риском небольшого хита производительности из-за дублирующейся записи в пути.

1
ответ дан ketorin 24 November 2019 в 18:02
поделиться

Основываясь на ответе rcar, необходимо удостовериться, что подстрока цели не найдена.

if a%X%==a%PATH% echo %X% is in PATH
echo %PATH% | find /c /i ";%X%"
if errorlevel 1 echo %X% is in PATH
echo %PATH% | find /c /i "%X%;"
if errorlevel 1 echo %X% is in PATH
1
ответ дан Adam Mitz 24 November 2019 в 18:02
поделиться

Если Ваш вопрос был, "почему не делает этой cmd работы фрагмента сценария?" тогда ответ - то, что for /f выполняет итерации по строкам. delims строки разделения в поля, но Вы только получаете первое поле в %%P. Нет никакого способа получить произвольное число полей с for /f цикл.

2
ответ дан Andriy M 24 November 2019 в 18:02
поделиться

Я взял Вашу реализацию с помощью для цикл и расширил его во что-то, что выполняет итерации через все элементы пути. Каждое повторение для цикла удаляет первый элемент пути (%p) от всего пути (сохраненный в %q и %r).

@echo off
SET MYPATHCOPY=%PATH%

:search
for /f "delims=; tokens=1,2*" %%p in ("%MYPATHCOPY%") do (
   @echo %%~p
   SET MYPATHCOPY=%%~q;%%~r
)

if "%MYPATHCOPY%"==";" goto done;
goto search;

:done

Демонстрационный вывод:

Z:\>path.bat
C:\Program Files\Microsoft DirectX SDK (November 2007)\Utilities\Bin\x86
c:\program files\imagemagick-6.3.4-q16
C:\WINDOWS\system32
C:\WINDOWS
C:\SFU\common\
c:\Program Files\Debugging Tools for Windows
C:\Program Files\Nmap
2
ответ дан indiv 24 November 2019 в 18:02
поделиться

Используя for и delims , Вы не можете получить произвольное число полей (как [1 110], Adam указал также), таким образом, необходимо использовать метод цикличного выполнения вместо этого. Следующий командный сценарий перечислит каждый путь в PATH переменная среды на отдельной строке:

@echo off 
setlocal 
if "%~1"=="" (
    set PATHQ=%PATH%
) else (
    set PATHQ=%~1 ) 
:WHILE
    if "%PATHQ%"=="" goto WEND
    for /F "delims=;" %%i in ("%PATHQ%") do echo %%i
    for /F "delims=; tokens=1,*" %%i in ("%PATHQ%") do set PATHQ=%%j
    goto WHILE 
:WEND

Это моделирует классическое , в то время как †¦ двигаются конструкция, найденная на многих языках программирования. С этим на месте, можно использовать что-то как [1 111] findstr , чтобы впоследствии отфильтровать и искать конкретный путь. Например, если Вы сохранили вышеупомянутый сценарий в файле, названном tidypath.cmd тогда, вот то, как Вы могли передать по каналу к findstr, ища пути в соответствии со стандартным каталогом программ (использующий нечувствительное к регистру соответствие):

> tidypath | findstr /i "%ProgramFiles%"
6
ответ дан Community 24 November 2019 в 18:02
поделиться

Я не выполнил ни в каком пакетном файле, программирующем некоторое время, но:

echo ;%PATH%; | find /C /I ";<string>;"

должен дать Вам 0, если строка не найдена и 1 или больше если это.

РЕДАКТИРОВАНИЕ: Добавленный нечувствительный к регистру флаг, благодаря Panos.

38
ответ дан Jon 24 November 2019 в 18:02
поделиться

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

mvn --help > NUL 2> NUL 
if errorlevel 1 goto mvnNotInPath

Поэтому я пытаюсь запустить mvn --help , игнорируя вывод (don на самом деле не хочу видеть справку, если там есть maven) (> NUL), а также не отображать сообщение об ошибке, если maven не был найден (2> NUL).

21
ответ дан 24 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

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