2016-03-29 4 views
-1

私はリマインダーの行が異なるバッチ内にリマインダーシステムを作成しようとしています。私のバッチプログラムは、.txtファイルの異なる行に書きますが、動作しません。問題を見つけるのを手伝ってみてください。あなたが持っているものを修正するバッチで異なる行に書き込む

@echo off 
echo Enter slot # for reminder 
set /p n= 
cls 
echo Please type in the assignment name 
set /p a= 
echo ---------------------------------- 
echo Please type in the class 
set /p c= 
echo ---------------------------------- 
echo Please type in the date due 
set /p d= 
cls 
if %n%==1 goto l1 
if %n%==2 goto l2 
if %n%==3 goto l3 
if %n%==4 goto l4 
if %n%==5 goto l5 
if %n%==6 goto l6 
:l1 
echo Reminder for %c% Homework! %a%,%d% > Reminder.txt 
:end 

:l2 
echo Reminder for %c% Homework! %a%,%d% >> Reminder.txt 
:end 

:l3 
echo Reminder for %c% Homework! %a%,%d% >>> Reminder.txt 
:end 

:l4 
echo Reminder for %c% Homework! %a%,%d% >>>> Reminder.txt 
:end 

:l5 
echo Reminder for %c% Homework! %a%,%d% >>>>> Reminder.txt 
:end 

:l6 
echo Reminder for %c% Homework! %a%,%d% >>>>>> Reminder.txt 
:end 
+3

私は「それは動作していません」よりもあまり曖昧でないものを必要とします。あなたのコードには少なくとも2つの異なることがありますが、私はあなたのコードが現在やっていることと、それが何をするべきかを知る必要があります。 – SomethingDark

+0

[リダイレクト](http://ss64.com/nt/syntax-redirection.html)を参照してください。 「行x」に直接書き込むことはできません。代わりに、変更された行でファイル全体を書き換えなければなりません。 – Stephan

+0

*動作していません。*意味のある問題の説明ではありません。どんな**具体的な方法で**それは働いていない*ですか? –

答えて

1

ヒント:

  • >文字を使用すると、特定の行に書いてみましょうではないだろう、と、このようなAを行うには、Windowsのバッチでのネイティブサポートはありませんもの。
    >、出力をファイルにリダイレクトします(既存のコンテンツを置き換える)、

    >>、追加したファイル(の末尾に追加されます):
  • >文字を使用する2つの演算子があります。
  • :endという複数のインスタンスがありますが、無効です。 :endはラベルであり、コード内のそのポイントへの一意の参照です。複数を追加すると、無視され、未定義の動作が発生しますが、これは悪いことです。
  • 終了するのに:endを使用しようとしているようです。それにはgoto :EOFを使用してください。それは組み込みのラベル:EOFにジャンプし、End Of Fileの略です。
  • nがあらかじめ定義された値のいずれでもない場合を処理する必要があります。現在、7nに入力した場合、プログラムは:l1の後のロジックに達して実行されますが、これは間違っています。場合によってはgoto :EOFを入れてください。バッチでこの種の問題を解決するアプローチする方法

:私は、特定の行を変更するには、私の頭の上から考えることができる唯一の方法は、for /fを使用して、すべての行を反復処理することである
ループを作成して、変更したいものが出現するまで各行を(一時ファイルに)書き換えてから、既存の内容の代わりに新しい内容を書きます。その後、反復処理が完了したら、元のファイルをその一時ファイルに置き換えることができます。
新しい行を変更するたびにこれを行う必要があります。バッチは、配列のような有用な構造を持たない、あるいはバッシュのようなシェルスクリプト言語が持つたくさんの外部ツールを持たない本当に単純な言語です。それはまた、本当に単純なランタイム評価を持っています。

ここでは、上のコードからいくつかの行を組み合わせて、必要なものを達成できる部分的な解決方法を示します。機能性を得る

REM suppresses the echo of the commands in the program 
@ECHO OFF 
REM sets a feature that overcomes some of the weak runtime evaluation limitations that batch has 
setlocal ENABLEDELAYEDEXPANSION 
REM The name of your file 
set fname=file.txt 
REM If our file doesn't already exist, make a new one with 6 empty lines since that's all we want for now. 
if EXIST "%fname%" goto alreadyExists 
for /l %%b in (1,1,6) do echo.>>"%fname%" 
:alreadyExists 
REM The name of a temp file 
set tfile=f2.txt 
REM A counter to track the line number 
set counter=0 
REM Input to get the line number you wish to replace 
set /p replacementLine=Type the line number that should be replaced: 
REM The content that goes on the replaced line 
set newContent=New entry 
REM Read the file, iterate through all lines. 
for /f "tokens=*" %%a in (file.txt) do (
REM Add one to the counter 
set /a counter=!counter!+1 
REM Use the redirect '>' operator for the first line 
if "!counter!"=="1" (

if "!counter!"=="%replacementLine%" (
REM We're on the line we wish to replace, so use the replacement line content 
echo.%newContent% >f2.txt 
) else (
REM We're NOT on the line we wish to replace, so use the original line content 
echo.%%a >f2.txt 
) 
) else (
REM else for lines other than the first, use the append redirect '>>' 
if "!counter!"=="%replacementLine%" (
REM We're on the line we wish to replace, so use the replacement line content 
echo.%newContent% >>f2.txt 
) else (
REM We're NOT on the line we wish to replace, so use the original line content 
echo.%%a >>f2.txt 
) 
) 
) 
REM Delete the original file 
del "%fname%" 
REM Replace it with the modified copy 
ren "%tfile%" "%fname%" 

あなたが一番上に数行を置き換えることができます。これは、指定された行でファイルに(あなたの実装に置き換える)newContent変数の内容を置き、その後、行番号を入力するように求められますあなたは欲しい。

+0

*編集* Powershellは私の学校のコンピュータでブロックされています。ありがとうございますが、Javaでそれを行う方法はありますか?これは私の学校のコンピュータのためで、バッチは本当に簡単な方法です。 (それはWindowsコンピュータです)。私はHTML5でプログラムを作成し、それを自分のPC上でローカルに実行できますか?私は自分の課題を入力するリストを作成するでしょうか? – lunarcole12

+0

これはPowerShellではなく、バッチです。コマンドラインを取得してファイルを書き込むことができれば、これは動作します。バッチで実行できるものはすべてJavaで実行できますが、JavaはJREがインストールされているコンピュータでのみ実行されます。これは、JavaScriptを使用したHTML5アプリケーションでも実行できますが、そのようなソリューションを作成するために十分なJavaまたはJavaScriptを学習することは、時間の投資を必要としません。 JavaまたはJavaScriptを使用してはるかに複雑なアプローチに取り組む前に、バッチで最初に動作させるのに必要な数分を入れることをお勧めします。 – LinuxDisciple

0

バッチでファイルの特定の行に書き込むことはできません。代わりに、完全なファイルを書き直す必要があります。

手順:a)ファイルを読み取ります。 b)目的の行を変更します。 c)(上書き)ファイルに新しいデータを書き込みます。

@echo off 
setlocal enabledelayedexpansion 
if not exist reminder.txt call :InitFile :: create the file, if it doesn't exist 
set /p "n=Enter slot # for reminder: " 
set /p "a=type in the assignment name: " 
set /p "c=type in the class: " 
set /p "d=type in the date due: " 
cls 

call :ReadFile 
set "_Line[%n%]=Reminder for %c% Homework: %a%,%d%" 
call :WriteFile 
type Reminder.txt 
goto :eof 

:ReadFile 
set x=0 
for /f "delims=" %%i in (reminder.txt) do (
    set /a x+=1 
    set "_Line[!x!]=%%i" 
) 
goto :eof 

:WriteFile 
set x=0 
(for /f "tokens=2 delims==" %%i in ('set _Line[') do echo %%i)>Reminder.txt 
goto :eof 

:InitFile 
(for /l %%i in (1,1,6) do echo Reminder %%i [empty])>Reminder.txt 
goto :eof 

(注:これが原因set _line[とアルファベット順のソート以上の9行とのトラブルになるだろうが、あなたが唯一の6行を必要とするように、これはあなたのための問題になることはありません)

注:あなたの入力は含まれてはならない!

+0

LinuxDisciple、ありがとうございます。このプログラムはどのように使用しますか? – lunarcole12

+0

私はこのプログラムが気に入っていますが、最終的にすべてのリマインダを持つファイルに書き込みますか?私はすべての行をテキストファイルに書きたいと思います。すべてのスロットがいっぱいになるまで待ちません。 – lunarcole12

+0

これは、あなたが尋ねたものとちょうど逆です。そして非常に簡単です。 'echo%c%宿題のリマインダ:%a%、%d%>> >> Reminder.txt'は、ファイルの最後に改行を追加します。 – Stephan

関連する問題