0

次のスクリプトで問題が発生しました。このスクリプトをログイン スクリプトの一部として使用して、ソフトウェアがインストールされているかどうかを確認し、インストールされていない場合はインストールします。

:STEP1
for /f "delims= " %%a in (C:\software-dist.txt) do (
if "%%a"=="Softwarename1" goto STEP2
)
\\server\share\software1.exe
echo Softwarename1 >> C:\software-dist.txt

:STEP2
for /f "delims= " %%a in (C:\software-dist.txt) do (
if "%%a"=="Software name 2" goto END
)
\\server\share\software2.exe /Q
echo Software name 2 >> C:\software-dist.txt

:END

コードは STEP1 で問題なく動作します。ここでは、ソフトウェアの名前は「Softwarename1」という単語です。ただし、STEP2 のコードは機能しません。ここでは、ソフトウェアの名前が 3 つの単語 " Software name 2 " (各単語間のスペース) として記述されています。スクリプトが実行されるたびに、c:\software-dist.txtが「 Software name 2 」の別の行で更新されます。

私が間違っていることはありますか?

4

1 に答える 1

0

lc は彼のコメントで問題を指摘しましたが、明白な解決策を明示的に提供しませんでした。

トークン区切り文字をスペースに設定しています。を使用して DELIMS オプションを無効にする必要があります "DELIMS="

for /f "delims=" %%a in (C:\software-dist.txt) do ...

また、ECHO ステートメントの末尾に余分なスペースがあるため、後で別の実行でテストしたときに行が一致しません。スペースを削除すると、2 は stderr のハンドルとして扱われます。修正の 1 つは、括弧を追加することです。

(echo Software name 2) >> C:\software-dist.txt

しかし、より簡単で高速な解決策があります。FINDSTR を使用して、ファイル内に特定の行が存在するかどうかを判断できます。

:Step1
>nul findstr /xc:"Softwarename1" "C:\software-dist.txt" || (
  "\\server\share\%%F"
  >>"C:\software-dist.txt%" echo Softwarename1
)

:Step2
>nul findstr /xc:"Software name 2" "C:\software-dist.txt" || (
  "\\server\share\%%F"
  >>"C:\software-dist.txt%" echo Software name 2
)

変数と FOR ループを追加することで、コードが短くなり、保守が容易になります。

set "file=C:\software-dist.txt"
for %%F in ("Softwarename1" "Software name 2") do (
  >nul findstr /xc:%%F "%file%" || (
    "\\server\share\%%~F"
    (echo %%~F)>>"%file%"
  )
)
于 2012-10-29T18:55:01.553 に答える