Пакетный сценарий командной строки, SET переменной внутри цикла FOR не работает - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь получить общий размер каталога (_sourceFolder) (включая подкаталоги) в одну переменную (_localvar) с кодом ниже.

Я пытался включить setlocal enabledelayedexpansionно это не помогло.

@echo off
set _sourceFolder="D:\data"
dir/A-D /S %_sourceFolder%|for /F "tokens=*" %%a in ('FIND "bytes"') do set _localvar=%%a
echo %_localvar%

Однако подкоманда set _localvar=%%a не выполняется, вместо этого я вижу в stdout некоторые выходные данные, например:

    C:\>set _localvar=1 File(s)         27.686 bytes
    C:\>set _localvar=1 File(s)         27.686 bytes
    C:\>set _localvar=3272 File(s)  1.812.083.061 bytes
    C:\>set _localvar=1 File(s)         27.686 bytes
    C:\>set _localvar=3275 File(s)  1.812.166.119 bytes
    C:\>set _localvar=0 Dir(s)   7.431.806.976 bytes free

Но %_localvar% все еще пусто / не установлено.Я ожидаю, что %_localvar% заполнено / установлено, как показано в выводе stdout.

Кто-нибудь видит ошибку, которую я сделал здесь?

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Канал (|) инициирует два новых экземпляра cmd для любой из сторон, поэтому любые изменения среды (например, переменные) не передаются в экземпляр cmd хоста.

Переместите командную строку dir в набор for /F, например:

for /F "tokens=*" %%a in ('dir /A-D /S "%_sourceFolder%" ^| find "bytes" ^| find /V "free"') do set _localvar=%%a

Обратите внимание, что канал здесь экранирован (например, ^|), чтобы скрыть его от хостинга.cmd экземпляр, поэтому он выполняется в экземпляре cmd, созданном for /F.Присвоение переменной больше не используется в канале, поэтому назначенное значение, наконец, станет доступным.

Я добавил еще один фильтр (find /V "free"), так как я предполагаю, что вы не хотите захватывать финал ""bytes free", но предыдущая.

0 голосов
/ 10 июля 2019

Если то, что вы ищете, является суммой всех размеров файлов, это немного проще.Он не зависит от анализа вывода текста команды DIR.

FOR /F %%a IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-ChildItem -File -Recurse |" ^
        "Measure-Object -Sum -Property Length).Sum"') DO (SET "_localvar=%%a")
ECHO %_localvar%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...