2017-03-02 2 views
-1

私は小さなコードを持っています。問題は、次のステッププログラムで、私が新しい価値を書くにもかかわらず、最後のアクションからの価値を覚えているように見える。次のステップでは、前のステップから常に価値が得られます。私は、タスクの前またはタスクの前にこれをきれいにしようとしますが、その後は値が常に清潔です。ループ内の値セット/ p。次のステップでは、最後のステップからの変数を覚えています

: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 
+0

変数を保持したくない場合(set/pに入力するだけです)、varを最初に初期化する必要があります。プログラムを設定します。&SET/Pプログラム=#Wybierzインテグレーションプログラム: – LotPings

答えて

0
SET /P COMPNAME="# Wybierz nazwe komputera: 
    echo # Podales: !COMPNAME!        # 
    echo #-------------------------------------------------# 
    pause 
    START "" %filename% -s \\!COMPNAME! cmd 

あなたは、コードブロック内compnameの値を変化させているので、!compname!を使用する必要があります。

+0

こんにちは、ありがとう、このヘルプ。なぜこのように見えますか?それについてのいくつかの記事。私は、%var%と!varの違いについてより詳しく知る必要があります。 –

+0

コードのブロック(コマンドのカッコで囲まれたシーケンス)が解析されると、 '%var%'はその時の** var **の実際の値で**置換**されます。 'var'の値の変更は見えません。通常、 '!var!'は '!var!'と正確に表示されますが、 'setlocal enabledelayedexpansion'が実行された場合、'!var! 'はブロック内で変更されると' var'の値になります。 ** 'delayedexpansion'が呼び出されたコードブロックの外側**、'%var% '='!var! '遅延拡張のためにSOを検索してください - 数百の例があります。 – Magoo

関連する問題