お世話になります。
バッチファイルのコマンドについてですが、
for文の中で 一番下の階層のファイル名の先頭5バイトが
"abcde"のものだけ処理対象にしたいと考えています。
例えば、
C:\tempに以下のファイルがあったら
C:\temp\abcdefg.txt ・・・(1)
C:\temp\xxxxxxx.txt ・・・(2)
C:\temp\abcde.txt ・・・(3)
C:\temp\abc.txt ・・・(4)
C:\temp\abcdezzzz.txt ・・・(5)
(1)、(3)、(5)だけを処理させたいと考えています。
実装方法として、以下を考えましたがうまくいきません。
dir /s /b /a-d C\Temp > file.txt
for /f "delims=" %%F in (file.txt) do (
set A=%%~nF%
if "%%A:~0,5%"=="abcde" (
<処理コマンド>
) )
おそらくfor文の中で何個も命令を記述できないということと、
パラメータ修飾子の指定が間違っているからだと思われますが、
うまくできない理由を知りたいです。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
簡単に書くと、
pushd C:\temp
for /f %%F in ('dir /s /b /a-d abcde*') do <処理コマンド>
もとの線で行くと、
dir /s /b /a-d C\Temp > file.txt
for /f "delims=" %%F in (file.txt) do call :sub %%F
goto :EOF
:sub
set A=%~n1
if "%A:~0,5%"=="abcde" (
<処理コマンド> (ファイル名は %1 で)
)
goto :EOF
今回の私の質問ですが、notnotさんの
pushd C:\temp
for /f %%F in ('dir /s /b /a-d abcde*') do <処理コマンド>
で簡単に処理できることがわかりました。
一番シンプルだったので使わせて頂きます。
どうもありがとうございました。
No.5
- 回答日時:
>・cmd /v:on は一回手作業で実行させれば効果が持続するのでしょうか?
cmd /v:on で起動した『コマンドプロンプト』を終了するまでは、『遅延環境変数』の展開が行われます。一旦、『コマンドプロンプト』を終了し、再度、起動する際には、再び、cmd /v:on で起動しないと、『遅延環境変数』の展開は無効のままです。
『コマンドプロンプト』を起動する際、常に『遅延環境変数』の展開を有効にしたければ、下記のレジストリキーに"DelayedExpansion"という名前のD_WORD値を新規に作成し、0x00000001(16進表記)に設定します。"/v:on"オプション無しの cmd のみで『コマンドプロンプト』を起動しても『遅延環境変数』の展開が有効になります。
HKEY_CURRENT_USER\Software\Microsoft\Command Processor (←ユーザー個別の設定)
"DelayedExpansion"=dword:00000001
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor (全ユーザー共通の設定)
"DelayedExpansion"=dword:00000001
>・if "!A:~0,5!"=="abcde" ( にて、半角感嘆符"!"の中の変数Aには
>%を付加しなくて良いのでしょうか?
"%"は不要です。『遅延環境変数』の参照の際には、"%"の代わりに"!"を使います。
%A% ⇒ !A!
%A:~0,5% ⇒ !A:~0,5!
>・if文の後に echo !A! がありますが、確認のために行っているのでしょうか?
はい、そうです。回答#4内のバッチをそのままメモ帳等にコピー&ペーストして保存後、実行してみてください。
該当するファイル名だけが表示されるはずです。
わかりました。丁寧なご回答ありがとうございます。
まだまだ勉強不足でした。ご指摘のヘルプなどをみて再チャレンジしてみたいと思います。
No.4
- 回答日時:
ご質問のように、"for"文内で変数を操作・参照する場合には、通常の"%A:~0,5%"では、"for"コマンドが実行される前の変数Aの値が参照され、望みどおりの結果が得られませんので、『遅延環境変数』の参照を使用します。
通常、『遅延環境変数』の展開はオフに設定されていますので、『コマンドプロンプト』を"/v:on"オプションを付けて、
cmd /v:on
の書式で起動した上で、バッチファイルを実行する必要があります。
(『遅延環境変数』については、set /? でヘルプを参照すると、最後の方に記載されています。)
『遅延環境変数』の参照は、下記のバッチファイルの4行目、5行目のように半角感嘆符"!"を使用します。
@echo off
for /f "delims=" %%F in ('dir /s /b /a-d C:\Temp') do (
set A=%%~nF
if "!A:~0,5!"=="abcde" (
echo !A!
)
)
なお、ご質問文中のバッチファイル内での変数の参照方法は間違っていますョ
A=%%~nF% ⇒ A=%%~nf (最後の%が余分)
%%A:~0,5% ⇒ %A:~0,5% (最初の%は1つです)
この回答への補足
ありがとうございました。遅延環境変数は全然知りませんでした。
ただ、バッチファイルを実行したらできませんでしたので
以下教えて頂けると有難いです。
・cmd /v:on は一回手作業で実行させれば効果が持続するのでしょうか?
・if "!A:~0,5!"=="abcde" ( にて、半角感嘆符"!"の中の変数Aには
%を付加しなくて良いのでしょうか?
・if文の後に echo !A! がありますが、確認のために行っているのでしょうか?
以下、実行できなかったソースになります。
rem 対象ファイルの一覧作成
dir /s /b /a-d C:\Temp > file.tmp
for /f "delims=" %%F in (file.tmp) do (
set A=%%~nF
if "!%A:~0,5!"=="abcde" (
echo !%A!
for /f "delims=\ tokens=3" %%D in ("%%F") do (
for /f "delims=\ tokens=4" %%E in ("%%F") do (
<処理コマンド>
) ) ) )
No.3
- 回答日時:
ANo.2 です。
ごめんなさい。>でもこれだと"file.txt" を1個だけ引用して終わりそうなので、
>ここは変だと思いますけど。
は勘違いです。すみません。
No.2
- 回答日時:
> うまくできない理由を知りたいです。
どううまくできないのかを示してほしいですね。
また、表示を止めてないのだからどう展開されてるか表示を遡ってみれが
どこが期待どおりでないか判断できるのでは?
確認してませんが、
> for /f "delims=" %%F in (file.txt) do (
は file.txt の内容からファイル名を1個ずつ引用したいのですか?
でもこれだと"file.txt" を1個だけ引用して終わりそうなので、
ここは変だと思いますけど。
この回答への補足
言葉足らずでした。
うまくできないと申し上げたのは、
set A=%%~nF%
if "%%A:~0,5%"=="abcde" (
の部分で "%%A:~0,5%"がどうやらファイル名の先頭5バイトを
認識していないようでした。
%%Aの%の数が多いのか、
そもそも for~doの中で
変数Aをsetセットしながら、if文を記述することが無理なのか
という意味で、コーディングの誤りがあれば指摘して頂きたい
ということで質問させてもらいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイル内置換
-
exeファイルの実行結果をテキス...
-
USBメモリ内のバッチで書き出す...
-
コマンド実行結果のファイル出力
-
C言語コンパイラ・デバッガをご...
-
Macの手書き漢字入力ツールにつ...
-
.cshrcでのエラー
-
VBでExcelが起動されているか知...
-
illustratorを日本語仕様にする...
-
InstallShield って何?
-
フロッピーディスクの読み込み方法
-
OS インストール場所確認
-
DebianのApache(掲示板)CGIエ...
-
ソフトのインストール場所って...
-
Solaris10でツールのインストー...
-
累積動作時間とはなんですか?
-
PowerMac G5(M9393)のクラシッ...
-
Httpステータス500 InternalSer...
-
/usrがいっぱいになって。mount...
-
KDEからGNOMEへ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル内置換
-
exeファイルの実行結果をテキス...
-
コマンド実行結果のファイル出力
-
USBメモリ内のバッチで書き出す...
-
batファイル 行った履歴をテキ...
-
batが動かない
-
【Mac/Xcode】カレントディレク...
-
メーリングリスト宛てのメール...
-
C言語コンパイラ・デバッガをご...
-
ftpのgetが正常できる方法について
-
ldapユーザ登録について
-
PowerShellで自分が書いたコマ...
-
デバッグ停止中 一つ戻る
-
Win7でコンピュータ名変更を自動で
-
cron で rsync が実行できない
-
プログラムでTAを制御するコマ...
-
linuxのsshの反応が非常に遅い。
-
VBSでのファイル読込、出力操作...
-
pythonで業務効率
-
リモートコンピュータの再起動...
おすすめ情報