Почему FOR LOOP только вывод Echo включен в текстовый файл? - PullRequest
1 голос
/ 22 июня 2019

Мой командный файл cmd всегда выводит:

ECHO is on.
ECHO is on.
ECHO is on.

Сценарий:

SET "InputFile=abc.txt"
IF EXIST "%InputFile%" (DEL /f /q "%InputFile%")
SETLOCAL EnableExtensions EnableDelayedExpansion
FOR /F Tokens^=* %%G IN ('
    "WMIC PATH Win32_DiskPartition WHERE ^(DeviceID^="Disk #0, Partition #1"^) Assoc:list /AssocClass:Win32_LogicalDiskToPartition 2>NUL"

') DO (CALL ECHO %%G>> "%InputFile%")

ENDLOCAL

Как исправить?.

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Ваша проблема связана со строкой DeviceID, содержащей запятую, которую можно легко решить, используя переменную для ее хранения.Чтобы не возвращать Echo сообщения о состоянии, вам необходимо добавить непустой символ после Echo, для этого лучше всего использовать (, = и /.

.this!

@Echo Off
Set "InputFile=abc.txt"
Set "SearchStr=Disk #0, Partition #1"

If Exist "%InputFile%" Del /F "%InputFile%"
For /F Tokens^=* %%A In ('
    "WMIC Partition Where (DeviceID="%%SearchStr%%") Assoc:List /AssocClass:Win32_LogicalDiskToPartition 2>NUL"
')Do >>"%InputFile%" Echo(%%A

Если вы не хотите, чтобы в выводе файла были пустые строки, используйте другой вложенный цикл For:

@Echo Off
Set "InputFile=abc.txt"
Set "SearchStr=Disk #0, Partition #1"

If Exist "%InputFile%" Del /F "%InputFile%"
For /F Tokens^=* %%A In ('
    "WMIC Partition Where (DeviceID="%%SearchStr%%") Assoc:List /AssocClass:Win32_LogicalDiskToPartition 2>NUL"
')Do For /F Tokens^=* %%B In ("%%A")Do >>"%InputFile%" Echo(%%B

Однако, поскольку вы выводите всенет необходимости в цикле For:

@Set "InputFile=abc.txt"
@Set "SearchStr=Disk #0, Partition #1"
@If Exist "%InputFile%" Del /F "%InputFile%"
@WMIC /Output:"%InputFile%" Partition Where (DeviceID="%SearchStr%") Assoc:List /AssocClass:Win32_LogicalDiskToPartition 2>NUL

[Edit /]

Поскольку это один из многих вопросов, которые, по-видимому, основаны ната же задача, если вы только пытаетесь определить букву диска, связанную с Disk #0, Partition #1, вы можете сделать это аналогично:

@Set "SearchStr=Disk #0, Partition #1"
@For /F Skip^=2Tokens^=2Delims^=^" %%A In ('"WMIC Partition Where (DeviceID="%%SearchStr%%") Assoc /AssocClass:Win32_LogicalDiskToPartition 2>NUL"')Do @Echo %SearchStr% = %%A
2 голосов
/ 22 июня 2019

1. Предложение WHERE в WQL завершается ошибкой, если содержит запятую.Используйте

"… WHERE ^(DeviceID^ like^ "Disk #0_ Partition #1"^) …

2. Существует известная ошибка wmic, см. Статью Дейва Бенхама WMIC и FOR /F: Исправлена ​​проблема с <CR> .Исправьте это, например, следующим образом:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "InputFile=abc56715419.txt"
IF EXIST "%InputFile%" (DEL /f /q "%InputFile%")
REM SETLOCAL EnableExtensions EnableDelayedExpansion
(
FOR /F Tokens^=* %%G IN ('
    "WMIC PATH Win32_DiskPartition WHERE ^(DeviceID^ like^ "Disk #0_ Partition #1"^) Assoc:list /AssocClass:Win32_LogicalDiskToPartition 2>NUL"
') DO ( for /F "delims=" %%g in ("%%G") do (CALL ECHO(%%g))
)>>"%InputFile%"
REM debugging output
type "%InputFile%"
ENDLOCAL

Здесь петли for равны

  • %%G для получения вывода WMIC;
  • %%g удалить окончание возврат каретки в возвращаемых значениях: wmic поведение: каждая строка вывода заканчивается 0x0D0D0A (<CR><CR><LF>) вместо общего 0x0D0A (<CR><LF>).
...