Как я получаю результат команды в переменной в окнах?

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

120
задан Community 23 May 2017 в 12:26
поделиться

8 ответов

Если необходимо получить всю команду, производит Вас, может использовать пакет как это:

@ECHO OFF
IF NOT "%1"=="" GOTO ADDV
SET VAR=
FOR /F %%I IN ('DIR *.TXT /B /O:D') DO CALL %0 %%I
SET VAR
GOTO END

:ADDV
SET VAR=%VAR%!%1

:END

Все выходные строки хранятся в VAR, разделенном с"!".

@John: есть ли какое-либо практическое применение для этого? Я думаю, что необходимо наблюдать за PowerShell или любым другим языком программирования, способным для выполнения задач сценариев легко (Python, Perl, PHP, Ruby)

32
ответ дан 24 November 2019 в 01:41
поделиться

Скромное для команда накопило некоторые интересные возможности за эти годы:

D:\> FOR /F "delims=" %i IN ('date /t') DO set today=%i
D:\> echo %today%
Sat 20/09/2008

Примечание, что "delims=" перезаписи пространство по умолчанию и разграничители табуляции так, чтобы вывод команды даты был пожран внезапно.

Для получения многострочного вывода это может все еще по существу быть острота (использующий переменную lf как разделитель в получающейся переменной):

REM NB:in a batch file, need to use %%i not %i
setlocal EnableDelayedExpansion
SET lf=-
FOR /F "delims=" %%i IN ('dir \ /b') DO if ("!out!"=="") (set out=%%i) else (set out=!out!%lf%%%i)
ECHO %out%

Для получения переданного по каналу выражения используйте ^|:

FOR /F "delims=" %%i IN ('svn info . ^| findstr "Root:"') DO set "URL=%%i"
78
ответ дан 24 November 2019 в 01:41
поделиться

Для получения текущего каталога можно использовать это:

CD > tmpFile
SET /p myvar= < tmpFile
DEL tmpFile
echo test: %myvar%

Это использует временный файл, хотя, таким образом, это не является самым симпатичным, но это, конечно, работает! 'CD' помещает текущий каталог в 'tmpFile', 'НАБОР' загружает содержание tmpFile.

Вот решение для нескольких строк с "массивом":

@echo off

rem ---------
rem Obtain line numbers from the file
rem ---------

rem This is the file that is being read: You can replace this with %1 for dynamic behaviour or replace it with some command like the first example i gave with the 'CD' command.
set _readfile=test.txt

for /f "usebackq tokens=2 delims=:" %%a in (`find /c /v "" %_readfile%`) do set _max=%%a
set /a _max+=1
set _i=0
set _filename=temp.dat

rem ---------
rem Make the list
rem ---------

:makeList
find /n /v "" %_readfile% >%_filename%

rem ---------
rem Read the list
rem ---------

:readList
if %_i%==%_max% goto printList

rem ---------
rem Read the lines into the array
rem ---------
for /f "usebackq delims=] tokens=2" %%a in (`findstr /r "\[%_i%]" %_filename%`) do set _data%_i%=%%a
set /a _i+=1
goto readList

:printList
del %_filename%
set _i=1
:printMore
if %_i%==%_max% goto finished
set _data%_i%
set /a _i+=1
goto printMore

:finished

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

23
ответ дан 24 November 2019 в 01:41
поделиться

необходимо использовать эти SET команда с параметром /P и направить вывод к нему. Например, см. http://www.ss64.com/nt/set.html . Будет работать на CMD, не уверенный в.BAT файлах

От комментария до этого сообщения:

, Что ссылка имеет команду "112", которая говорит, это установит _MyVar на первую строку от MyFilename.txt. Это могло использоваться в качестве" myCmd > tmp.txt" с" set /P myVar=<tmp.txt". Но это только получит первую строку вывода, не всего вывода

8
ответ дан 24 November 2019 в 01:41
поделиться

Пример для установки в "V" переменная среды новый файл

FOR /F %I IN ('DIR *.* /O:D /B') DO SET V=%I

в пакетном файле необходимо использовать двойной префикс в переменной цикла:

FOR /F %%I IN ('DIR *.* /O:D /B') DO SET V=%%I
5
ответ дан 24 November 2019 в 01:41
поделиться

Если Вы ищете решение, предоставленное в Используя результат команды как аргумент в ударе?

затем вот код:

@echo off
if not "%1"=="" goto get_basename_pwd
for /f "delims=X" %%i in ('cd') do call %0 %%i
for /f "delims=X" %%i in ('dir /o:d /b') do echo %%i>>%filename%.txt
goto end

:get_basename_pwd
set filename=%~n1

:end
  • Это назовет себя с результатом команды CD, то же как pwd.
  • Строковое извлечение на параметрах возвратит имя файла/папку.
  • Получают содержание этой папки и добавляют к filename.txt

[Кредиты] : Благодаря всем другим ответам и некоторому рытью на команды Windows XP страница.

2
ответ дан 24 November 2019 в 01:41
поделиться

Можно получить весь вывод в одной переменной, но строки будут разделены символом по Вашему выбору (# в примере ниже) вместо фактического CR-LF.

@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /b') do (
    if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i)
)
echo directory contains:
echo %DIR%

Вторая версия, если необходимо распечатать содержание линию за линией. Это берет advanted того, что не будет дублирующихся строк вывода от "dir/b", таким образом, он не сможет работать в общем случае.

@echo off
setlocal EnableDelayedExpansion
set count=0
for /f "delims=" %%i in ('dir /b') do (
    if "!DIR!"=="" (set DIR=%%i) else (set DIR=!DIR!#%%i)
    set /a count = !count! + 1
)

echo directory contains:
echo %DIR%

for /l %%c in (1,1,%count%) do (
    for /f "delims=#" %%i in ("!DIR!") do (
        echo %%i
        set DIR=!DIR:%%i=!
    )
)
1
ответ дан 24 November 2019 в 01:41
поделиться

См. этот http://technet.microsoft.com/en-us/library/bb490982.aspx , который объясняет, что можно сделать с выводом команды.

-1
ответ дан 24 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

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