Loops 循环中的值设置/p。在下一步中,它将记住上一步中的变量

Loops 循环中的值设置/p。在下一步中,它将记住上一步中的变量,loops,batch-file,Loops,Batch File,我有一些小代码。问题是,在下一步程序中,尽管我写了一个新值,但仍会从上一个操作中记住一个值。在下一步中,它总是从上一步中获取值。我尝试在任务后或任务前清理该值,但该值始终是干净的 :BEGIN cls VER > NUL echo #-------------------------------------------------# SET /P PROGRAM=# Wybierz interesujacy cie program: echo #---------------------

我有一些小代码。问题是,在下一步程序中,尽管我写了一个新值,但仍会从上一个操作中记住一个值。在下一步中,它总是从上一步中获取值。我尝试在任务后或任务前清理该值,但该值始终是干净的

:BEGIN
cls
VER > NUL
echo #-------------------------------------------------#
SET /P PROGRAM=# Wybierz interesujacy cie program: 
echo #-------------------------------------------------#
2>NUL CALL :CASE_%PROGRAM%
IF ERRORLEVEL 1 CALL :CASE_DEFAULT

:CASE_6
    setlocal enabledelayedexpansion
    for %%I in (`powershell.exe`) do if "%%~$PATH:I" neq "" (
        set chooser=powershell "Add-Type -AssemblyName System.windows.forms|Out-Null;$f=New-Object System.Windows.Forms.OpenFileDialog;$f.InitialDirectory='%windir%\System32\PSTools';$f.Filter='Executable Files (*.exe)|All Files (*.*)|*.*';$f.showHelp=$true;$f.ShowDialog()|Out-Null;$f.FileName"
    ) else (
    rem :: If not, compose and link C# application to open file browser dialog
        set chooser=%temp%\chooser.exe
        >"%temp%\c.cs" echo using System;using System.Windows.Forms;
        >>"%temp%\c.cs" echo class dummy{
        >>"%temp%\c.cs" echo public static void Main^(^){
        >>"%temp%\c.cs" echo OpenFileDialog f=new OpenFileDialog^(^);
        >>"%temp%\c.cs" echo f.InitialDirectory= "c:\\Windows\\System32\\PSTools\\";
        >>"%temp%\c.cs" echo f.Filter="Executable Files (*.exe)|*.exe|All Files (*.*)|*.*";
        >>"%temp%\c.cs" echo f.ShowHelp=true;
        >>"%temp%\c.cs" echo f.ShowDialog^(^);
        >>"%temp%\c.cs" echo Console.Write^(f.FileName^);}}
        for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do (
            if not exist "!chooser!" "%%I" /nologo /out:"!chooser!" "%temp%\c.cs" 2>NUL
        )
        del "%temp%\c.cs"
        if not exist "!chooser!" (
            echo Error: Please install .NET 2.0 or newer, or install PowerShell.
            goto :EOF
        )
    )

    :: capture choice to a variable
    for /f "delims=" %%I in ('%chooser%') do set "filename=%%I"

    :: Clean up the mess
    del "%temp%\chooser.exe" 2>NUL

    IF "%filename%" == "C:\Windows\System32\PSTools\PsExec.exe" (
        SET /P COMPNAME="# Wybierz nazwe komputera: 
        echo # Podales: %COMPNAME%                             #
        echo #-------------------------------------------------#
        pause
        START "" %filename% -s \\%COMPNAME% cmd
    ) ELSE (
        echo # Inne narzedzia nie sa jeszcze obslugiwane.
        echo # Przepraszam
        #-------------------------------------------------#
        pause
    )
    set "COMPNAME="
    REM set "COMPNAME=%COMPNAME*=%"
    VER > NUL # reset ERRORLEVEL
    GOTO BEGIN

您需要使用
!康普name因为您正在代码块内更改
compname
的值。

如果您不想保留变量(只需输入set/p),则必须首先初始化变量
set“Program=“&set/P Program=#Wybierz interest ujacy cie Program:
Hi,谢谢,这是您的帮助。你能解释一下为什么会这样吗?关于这个的一些文章。我需要更多地了解%var%和之间的差异!瓦尔!当解析一个代码块(括号内的命令序列)时,任何
%var%
都会被当时
var
的实际值替换,因此执行时,
var
值的任何更改都不可见。通常,
!瓦尔将准确显示该
!瓦尔,但如果执行了
setlocal enabledelayedexpansion
,则
!瓦尔在块内更改时成为
var
的值。在代码块外部,调用了
delayedexpansion
%var%
=
!瓦尔搜索延迟扩展
——数百个示例可用。
    SET /P COMPNAME="# Wybierz nazwe komputera: 
    echo # Podales: !COMPNAME!                             #
    echo #-------------------------------------------------#
    pause
    START "" %filename% -s \\!COMPNAME! cmd