AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1512863
Accepted
tar
tar
Asked: 2019-12-28 05:50:06 +0800 CST2019-12-28 05:50:06 +0800 CST 2019-12-28 05:50:06 +0800 CST

Janelas de linha de comando: como posso definir uma variável global em uma chamada?

  • 772

Eu quero mudar uma variável de contador dentro de uma função de chamada.

No meu exemplo eu quero contar todas as subpastas (= count_all) e depois quero incrementar a contagem das subpastas que ela procedeu com sucesso (= count_done).

    @echo off
    cls

    setlocal enableextensions enabledelayedexpansion
    set /a "count_all=0"
    set /a "count_done=0"

    for /d /r %%i in (.\*) do call :process_subfolders "%%i"

    if %count_all% EQU 0 (
        echo No archives found.
    ) else (
        set /a "counted=1"
        for /d /r %%i in (.\*) do call :process_subfolders "%%i"
    )

    pause
    endlocal
    goto :eof

    ::___________________________________________________________________
    :process_subfolders
    set "folder=%~nx1"

    pushd %folder%
    if exist *.rar (
        if !counted! equ 0 (
            set /a "count_all+=1"
        ) else (
            set /a "count_done+=1"
            echo !count_done!: %folder%

            rem ... do something with the rar files in this folder ...
            rem ... for testing: use ping
            ping 127.0.0.1 -n 2 > nul

            set /a "percent=!count_done!*100/!count_all!"
            title !percent!%% [!count_done!/!count_all!]
        )
    )
    popd
    exit /b

O código funciona, mas não entendo o comportamento do setlocal enabledelayedexpansion. Quando coloco na chamada :process_subfoldersnão consigo mais alterar as variáveis ​​e não sei como retorná-las de acordo. De alguma forma, eu poderia defini-los no final da chamada endlocal & set "%2=whatever"(ou algo assim), mas ainda não entendo quais variáveis ​​são locais e quais não são.

Qual é a diferença entre count_all, %count_all%e !count_all!e quando devo usar which?

windows command-line
  • 1 1 respostas
  • 2335 Views

1 respostas

  • Voted
  1. Best Answer
    harrymc
    2019-12-28T11:04:44+08:002019-12-28T11:04:44+08:00

    Eu sugeriria usar o comando FOR /D .

    Um pequeno exemplo de teste:

    setlocal enabledelayedexpansion
    set /a count_all=0
    for /d /r %%i in (.\*) do (
      echo !count_all! : %%i
      set /a count_all+=1
    )  
    echo all: %count_all%
    

    Quanto à diferença entre os vários operadores de substituição de variáveis, você não é o único que está confuso aqui.

    A principal diferença é se o operador de substituição, %ou !, está relacionado ao valor atual ou inicial da variável.

    A opção EnableDelayedExpansion faz com que as variáveis ​​sejam expandidas na execução, e não no tempo de análise. Quando a expansão atrasada está em vigor, as variáveis ​​podem ser lidas imediatamente usando !variable_name!. Using %variable_name%continuará a mostrar o valor inicial que é expandido no início da linha, que pode ser diferente para loops.

    Adicionei ao meu código um echocomando que demonstra a diferença. Ele usa !count_all!, porque usar %count_all%resultaria no valor de quando o forcomando foi iniciado, que é sempre 0. Mas %%inão precisa do !operador, pois está programado como variável do loop.

    Você encontrará uma explicação detalhada no seguinte post (resposta mais votada):
    Como funcionam SETLOCAL e ENABLEDELAYEDEXPANSION?

    Essa inconsistência dos dois operadores de substituição leva a uma confusão que nem sempre é resolvida apenas pela lógica. Às vezes, é necessário tentar e errar antes de acertar.

    • 1

relate perguntas

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

  • Comunique-se com o daemon do Docker no Windows

  • atalho do shell da área de trabalho no painel lateral do explorer

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve