C:\Program Files (x86)フォルダ内に入っている
ImageMagick*
のフォルダーを検索し、フォルダー名を表示したいのですが
http://ja.stackoverflow.com/questions/4745/
このページを参考にし
cd /d "C:\Program Files (x86)"
setlocal enabledelayedexpansion
set STR=
for /F %%A in ('dir ImageMagick* /B') do (
set STR= %%A
)
echo "%STR%"
endlocal
とやってみました。
すると、
ImageMagick-7.0.2-Q16
というように前にスペースが入ってしまいます。
このスペースを削除したいのですが
http://scripting.cocolog-nifty.com/blog/2007/01/ …
このページの
SET a=%a:~0,-1%
という方法が使えるかと思ったのですが
これを行頭一文字削除にするにはどうすれば良いですか?
あと、
endlocal
の後で変数STRを参照すると空になっているのですが
endlocalの後で参照するにはどうしたら良いですか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
えぇっと... 何をしようとしているのかがわからなくなった....
質問文で
「ImageMagick*
のフォルダーを検索し、フォルダー名を表示したいのですが」
とあるけど, これを
for /F %%A in ('dir ImageMagick* /B') do (
set STR= %%A
)
echo "%STR%"
のような形でやろうとすると実際には「フォルダー」が出てくるとは限らない (「ImageMagick*」にマッチするファイルがあったらそれが出てくるかもしれない) よね. さらに, 補足にある
「一回だけDirを使ってパスを取得する」
というのもよくわからない. 「パスを取得する」という「パス」って, なんのパスなんでしょうか? なんでもいいからてきとうに見つかればいいのかな?
質問文にあるように「フォルダーを検索する」というなら, そもそも dir 自体が不要なんだけどなぁ.
No.4
- 回答日時:
あまり良い方法が思い付きませんが、私が思い付く限りだと以下のような方法があるかと思います。
ファイル出力処理(リダイレクト)を使う方法です。
―――――――――――――――――――――
@echo off
pushd "C:\Program Files (x86)"
dir /b "ImageMagick*" > "%TEMP%\OUT.txt"
set /p STR= < "%TEMP%\OUT.txt"
echo."%STR%"
popd
pause
―――――――――――――――――――――
カレントディレクトリの移動を無くす場合は以下の通りです。
―――――――――――――――――――――
@echo off
dir /b "C:\Program Files (x86)\ImageMagick*" > "%TEMP%\OUT.txt"
set /p STR= < "%TEMP%\OUT.txt"
echo."%STR%"
pause
―――――――――――――――――――――
一行にまとめる場合は以下の通りです。
―――――――――――――――――――――
@echo off
dir /b "C:\Program Files (x86)\ImageMagick*" > "%TEMP%\OUT.txt" & set /p STR= < "%TEMP%\OUT.txt"
echo."%STR%"
pause
―――――――――――――――――――――
上記の処理だと、複数の「ImageMagick」から始まる名前のフォルダがある場合、DIRコマンドで一番上に表示される行が変数「STR」に代入されます。
パイプ処理で出来ればスマートだと思うのですが、私の知識ではそれは出来ないので、上記の処理が限界です。
この処理の注意点は、複数のバッチファイルを並行して動かす場合、出力ファイル「%TEMP%\OUT.txt」が他の処理で上書きされてしまう可能性があるので、保存場所を変えるか、重複しないファイル名にする必要があります。
又、ダブルクォーテーションで囲んでから変数「STR」に代入する事が出来ないので、フォルダ名に特定の記号が使われている場合はエラーが発生する可能性があります。
私自身、バッチファイルはよく使いますが、主にUNIXユーティリティの「sed」で処理してしまうので、バッチファイルのこういう事はあまり詳しくないです。
sedだと、例えば、dirの結果から、指定した一行を取り出したり、行頭や行末の何文字かを削除したり、逆に追加したり、指定した文字列を別の文字列に置換したり、様々な処理が簡単に出来るので便利です。
AWKやPerlだと、もっと高度な処理が出来ると思いますが、私はプログラミングの知識が無いので、これらはあまり使えません。
No.3
- 回答日時:
「set STR=」は、変数「STR」の中身を空にしているだけだと思います。
変数「STR」が、既に別の処理で使われていた時の為の掃除のようなものだと思います。
for文の中の「set STR=%%A」がメインとなる本当の代入処理だと思います。
フォルダ名に半角スペースがある場合は、「for /F %%A」の部分を「for /F "delims=:" %%A」等とした方が良いかと思います。半角スペースで名前が切れてしまう事がなくなります。
複数の「ImageMagick~」フォルダが存在する場合、変数「STR」に代入されるのは、DIRコマンドで最後に表示される行のフォルダ名1つだけですので、その点はご留意ください。
No.2
- 回答日時:
「C:\Program Files (x86)」フォルダ直下にある、「ImageMagick」から始まる名前のフォルダのフォルダ名を、コマンドプロンプトの画面に表示したいということでしょうか。
それなら、
dir /b /ad "C:\Program Files (x86)\ImageMagick*"
あるいは、
pushd "C:\Program Files (x86)"
dir /b /ad "ImageMagick*"
で可能だと思うのですが、これでは駄目なのでしょうか。
複数のフォルダ名を一行にまとめて表示したかったり、あるいは、変数にセットして使いたかったりするのでしょうか。
ご質問にある構文なら、
cd /d "C:\Program Files (x86)"
set STR=
for /F %%A in ('dir ImageMagick* /B') do (
set STR=%%A
)
echo "%STR%"
とすれば、行頭のスペースも削除出来、その後も変数を使えると思いますが、これではまずいでしょうか。
ただ、この構文では、複数のフォルダや、半角スペースを含むフォルダには対応出来ません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(プログラミング・Web制作) バッチファイルでPCのモデル名を取得したい 1 2022/03/31 10:58
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- ソフトウェア Aimpに関する質問です。 1 2022/09/08 11:11
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) vbaサブフォルダーをワイルドカードで取得したい 2 2022/11/15 08:04
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
コマンドプロンプトでファイル...
-
バッチファイルで、iniファイル...
-
ExcelVBAのDirでスペース含むフ...
-
フォルダ内の更新日時が一番新...
-
バッチコマンドでファイル名の...
-
エクセルVBAを使用してJPGファ...
-
コマンドプロンプトでのCSV...
-
【vbs】ファイル名の検索と該当...
-
前日日付のファイルGETバッチ
-
[DOS] コピー先に同じファイル...
-
サブフォルダからファイルをコ...
-
コマンドプロンプトで変数が数...
-
バッチ処理で16進数でファイル...
-
【Access】エクスポート時のフ...
-
Windowsコマンドプロンプトで、...
-
ftp処理でmove(移動)を行いたい
-
バッチにて複数のcsvファイルを...
-
ファイル名に ” を使うと エク...
-
ExifToolでの文字化け対策
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトの「%1」と...
-
[DOS] コピー先に同じファイル...
-
コマンドプロンプトでファイル...
-
コマンドプロンプトで変数が数...
-
バッチファイルで、iniファイル...
-
バッチコマンドでファイル名の...
-
ftp処理でmove(移動)を行いたい
-
フォルダ内の更新日時が一番新...
-
.batでファイル名から抽出して...
-
ExcelVBAのDirでスペース含むフ...
-
access,vbaでフォルダ内のファ...
-
DOSのバッチ作成について‐FORの...
-
R18文学賞はファイル名は自由で...
-
ファイル名に ” を使うと エク...
-
【vbs】ファイル名の検索と該当...
-
コマンドプロンプトまたはpower...
-
【Access】エクスポート時のフ...
-
Windowsコマンドプロンプトで、...
-
サブフォルダからファイルをコ...
-
ファイル名を該当フォルダ内か...
おすすめ情報
ありがとうございます。
これです、うまくいきました。
ちなみに、
for文の前で
set STR=
のようにして代入するというのはどういう意味があるのでしょうか?
forの中でも
set STR=%%A
というように代入しているのに二重で行うのはなぜなのでしょうか?
ありがとうございます。
あと、この方法だとDirをForで回して最後に取得できたパスを取得しますが
一回だけDirを使ってパスを取得するにはどうしたら良いですか?
set STR=%%A in ('dir ImageMagick* /B')
とか
set STR= ('dir ImageMagick* /B')
とかを試してみましたがうまくいきませんでした。
どうすれば良いでしょうか?
ありがとうございます。
Dirを使わずに
for /d %%A in ("C:\Program Files (x86)\ImageMagick*") do (
set STR=%%A
)
でできることが分かりました。
いつもVBを使っているのでてっきりDirでファイル・フォルダーの取得だと思っていました。
ところで、上のコードでForループを使わずに検索して出た一つ目のフォルダー名だけを取得するにはどうしたら良いですか?
あるいは、一つ目のフォルダーを取得した時点でForループから抜けるにはどうしたら良いですか?
batでforループから抜けるコードを探してみたのですがなぜか見つかりませんでしたので
教えてください。