質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

2回答

865閲覧

MSDOSにて配列に入れた日付の比較ができない

goron

総合スコア12

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2018/11/12 18:06

MSDOSにてフォルダーから名前が同じで枝番のついたファイルを読み込んで
配列に溜め込んでいます。
途中同じ枝番のファイルが出現したら新しい更新日付のものを
配列に入れ替えるロジックを作成していますが、どうしても、
更新日付の比較ができません。
何がおかしいのか教えて頂きたくお願い致します。
ファイルは XXXXX_999_99.txt といったものでxxxx_999までが
同じです。

@echo off

SETLOCAL enabledelayedexpansion

rem *** 該当ファイルの順次読み込み ***

SET Array_Index=0
SET Wk_Index=0

FOR %%I IN (*.txt) DO (

rem *** 3桁の前ゼロを取る ***
SET File_Name=%%I
SET /A WK_NUM = 1!File_Name:~5,3! - 1000

rem *** 同じ番号の新しい日付ファイルを退避 ***
IF !Array_Index! == !WK_NUM! (
IF !Array_YMD[Array_Index]! LSS %%~tI (
SET Array[!Array_Index!]=!File_Name!
SET Array_YMD[!Array_Index!]=%%~tI
)
====ここにはテーブルにためこむロジックがあります=====
ここのロジックではちゃんと目的のファイルが
ためこまれているのをechoにて確認済みです。
Array_Indexもここでカウントアップしています。
)

日付を分解してみたり
IF文にて !Array_YMD[Array_Index]! の部分を Array_YMD[!Array_Index!]にしてみたり色々試しましたが全くだめです。
echo で項目を表示しても echo <OFF> で表示もされません。

どなたか教えて下さい。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuro

2018/11/13 02:57

タグは「bash」ではなく「バッチファイル」ではないでしょうか?
guest

回答2

0

MSDOSでは、ファイル名が8文字まで、という制限があります
なので、長いファイル名は、XXXX1.txt、XXXX2.txt というふうに変換されてしまいますんで、長いファイル名を比較するということはできなくなります

投稿2018/11/12 22:16

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/11/13 04:28

>MSDOSでは、ファイル名が8文字まで、という制限があります それは、8.3形式の短い名前の方の文字数の話ですね。 名前は短いのと長いの両方作成されるはずですが、この事例が8.3形式を比較しているとされる根拠は何でしょう?
y_waiwai

2018/11/13 04:40

MSDOSは8.3型式でしか実装されてません。 Windowsのコマンドプロンプト、となるとはなしはかわりますが
sazi

2018/11/13 04:46

成程。私は勝手に読み替えてました。失礼しました。 +評価した人達もMSDOSでの話という認識だったのかは疑問ですけど、コメントで明らかになったので目的は果たせました。
guest

0

ベストアンサー

SETLOCAL enabledelayedexpansionとかあるので、MSDOSの話じゃなくて、Windowsのコマンドプロンプトの話ですよね?

1.何をしたいのかが、質問文からもコードからも不明。
2.「ファイルは XXXXX_999_99.txt といったもので」と書きながら1!File_Name:~5,3! というのは文字数数え間違いのバグ
3.IF !Array_YMD[Array_Index]! LSS %%~tI (は、Array_Indexの値を取り出していないのので、これもバグ

保存して参照するサンプルを付けておきます。

CMD

1@ECHO OFF 2SETLOCAL enabledelayedexpansion 3SET N=0 4REM DATAにセット 5FOR %%F IN (*.txt) DO call :SET %%F 6REM DATAをそのまま表示 7SET DATA 8REM DATAを参照 9FOR /L %%I in (1,1,%N%) do call :GET %%I 10GOTO :EOF 11 12:SET 13SET /A N+=1 14SET DATA[%N%]=%1 15GOTO :EOF 16 17:GET 18ECHO NO_%1 is !DATA[%1]! 19GOTO :EOF

投稿2018/11/13 06:19

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

goron

2018/11/14 05:28

おつかれさまです。 ご指摘とコマンドプロンプトのコードありがとうございます。 説明もコードも不慣れて至りませんで申し訳ありません。 頂いたサンプルにてSETのルーチンにて対象ファイルの更新日時も 退避してうまくいきました。 次のGETのルーチンで更新日時の比較をしたいのですが、 うまく比較ができず困っています。 IF文で比較しているのですが、どんな条件でも IFのルーチンに入ってしまいます。 退避した DATA「1」の更新日時とDATA[2]の更新日字を 比較しているのですが・・・ 正しいIF文の書き方を是非教えていただければ助かります。 基本的な事もわからず申し訳ありません。
otn

2018/11/14 05:32

> 正しいIF文の書き方を是非教えていただければ助かります。 普通に書けば良いだけだと思いますが。 今どう書いているのですか?
goron

2018/11/14 06:00

@ECHO OFF SETLOCAL enabledelayedexpansion SET N=0 REM DATAにセット FOR %%F IN (*.txt) DO call :SET %%F "%%~tF" REM DATAをそのまま表示 REM SET DATA REM SET YMD REM PAUSE REM DATAを参照 SET X=0 FOR /L %%I in (1,1,%N%) do call :GET %%I REM DATAをそのまま表示 SET WK_DATA SET WK_YMD PAUSE GOTO :EOF :SET SET /A N+=1 SET VV=%2 SET DATA[%N%]=%1 SET YMD[%N%]=!VV:~1,16! GOTO :EOF :GET SET DD=!DATA[%1]! SET EE=!YMD[%1]! SET /A WK_NUM = 1!DD:~5,3! - 1000 IF %X% == %WK_NUM% ( IF !WK_YMD[%X%]! LSS %EE% ( SET WK_DATA[%X%] = %DD% SET WK_YMD[%X%] = %EE% ) IF %X% LSS %WK_NUM% ( SET /A X+=1 FOR /L %%C IN (!X!,1,%WK_NUM%) DO (SET WK_DATA[%%C]=Nul) FOR /L %%C IN (!X!,1,!WK_NUM!) DO (SET WK_YMD[%%C]=Nul) SET WK_DATA[%WK_NUM%]=%DD% SET WK_YMD[%WK_NUM%]=%EE% SET X=%WK_NUM% ) GOTO :EOF おはずかしいコードですみません。 下から15行目の所です。 XXXX_999_枝番.txt というファイルの 999 が同じ番号のファイルが 複数あれば更新日付の比較をして新しいファイル名を 取得したいというロジックです。 999 は 連番でなく抜けている番号もあります。 すみません。よろしくお願い致します。
otn

2018/11/14 07:00

括弧の数が合ってません。
goron

2018/11/14 08:02

otn様 誠にありがとうございました。 出来ました。 お忙しいのに お時間とらせました。 申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問