2
@echo off
echo processing please wait...
setlocal enabledelayedexpansion
set txtfile=%~dp0mysql\my.ini.bak
set newfile=%~dp0mysql\my.ini
if exist "%newfile%" del /f /q "%newfile%"
for /f "tokens=*" %%a in (%txtfile%) do (
   set newline=%%a
   echo !newline! >> %newfile%
)

現在 my.ini.bak ファイルは D:\Program Files\my.ini.bak
にあります エラー : システムはファイル Files\mysql\my.ini.bak を見つけることができません。

このコードを機能させる方法、各行を my.ini.bak から my.ini にコピーする方法

4

3 に答える 3

8

パス内のスペースが原因で、FOR /F がファイルを正常に開くことができません。ファイル名を引用符で囲む必要がありますが、引用符で囲まれた名前がテキスト文字列ではなくファイル名として扱われるように、FOR /F "USEBACKQ" オプションも必要です。

使用"TOKENS=*"はほぼ同じですが、まったく同じではありません"DELIMS="

  • "DELIMS="行全体を保持します

  • "TOKENS=*"最初に先頭のスペースやタブを取り除いた後、残りの行を保持します

"DELIMS="先頭のスペースを取り除く理由がない限り、私は一般的に好みます。

.INI ファイルに!文字が含まれている可能性がある場合は、ループ内で遅延展開のオンとオフを切り替えたいと思うでしょう。の値が含まれていて、遅延展開が有効になっていると、値%%aが壊れます。!

FOR ループ全体を別のかっこのセットで囲み、反復ごとに 1 回ではなく、出力を 1 回だけリダイレクトする方が効率的です。また、ファイルが既に存在する場合、最初にファイルを削除する必要もありません。

@echo off
echo processing please wait...
setlocal disableDelayedExpansion
set "txtfile=%~dp0mysql\my.ini.bak"
set "newfile=%~dp0mysql\my.ini"
>"%newfile%" (
  for /f "usebackq delims=" %%a in ("%txtfile%") do (
    set newline=%%a
    setlocal enableDelayedExpansion
    rem Presumably more processing goes here
    echo !newline!
    endlocal
  )
)
于 2012-09-19T02:35:34.187 に答える
2

パスを引用する必要はないと思います。展開されたパスで短い名前を使用できます。したがって、%~dp の代わりに %~dps を使用してください

@echo off
echo processing please wait...
setlocal enabledelayedexpansion
set txtfile=%~dps0mysql\my.ini.bak
set newfile=%~dps0mysql\my.ini
if exist "%newfile%" del /f /q "%newfile%"
for /f "tokens=*" %%a in (%txtfile%) do (
   set newline=%%a
   echo !newline! >> %newfile%
)

ちなみに、元のコードで発生するエラーは、エラーとは少し異なりますが、理由はわかりません.

The system cannot find the file C:\Program.
于 2012-09-19T15:54:22.037 に答える
0

問題は、ファイル パスのスペースです。現在これをテストすることはできませんが、パスを引用すると修正されると思います。

set txtfile="%~dp0mysql\my.ini.bak"
set newfile="%~dp0mysql\my.ini"

これが私がテストした完全なコードです。テストのために、「my sql」にスペースを追加し、この名前でフォルダーを作成しました。

@echo off
echo processing please wait...
setlocal enabledelayedexpansion
set txtfile="%~dp0my sql\my.ini.bak"
echo %txtfile%
set newfile="%~dp0my sql\my.ini"
echo %newfile%
if exist "%newfile%" del /f /q "%newfile%"
for /f "tokens=*" %%a in (%txtfile%) do (
   set newline=%%a
   echo !newline! >> %newfile%
)
于 2012-09-19T02:06:58.410 に答える