アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の後で参照するにはどうしたら良いですか?

質問者からの補足コメント

  • ありがとうございます。
    これです、うまくいきました。

    ちなみに、
    for文の前で
    set STR=
    のようにして代入するというのはどういう意味があるのでしょうか?
    forの中でも
    set STR=%%A
    というように代入しているのに二重で行うのはなぜなのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/09/06 11:59
  • ありがとうございます。

    あと、この方法だとDirをForで回して最後に取得できたパスを取得しますが
    一回だけDirを使ってパスを取得するにはどうしたら良いですか?

    set STR=%%A in ('dir ImageMagick* /B')
    とか

    set STR= ('dir ImageMagick* /B')
    とかを試してみましたがうまくいきませんでした。

    どうすれば良いでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/09/06 20:06
  • ありがとうございます。

    Dirを使わずに

    for /d %%A in ("C:\Program Files (x86)\ImageMagick*") do (
    set STR=%%A
    )


    でできることが分かりました。
    いつもVBを使っているのでてっきりDirでファイル・フォルダーの取得だと思っていました。

    ところで、上のコードでForループを使わずに検索して出た一つ目のフォルダー名だけを取得するにはどうしたら良いですか?
    あるいは、一つ目のフォルダーを取得した時点でForループから抜けるにはどうしたら良いですか?
    batでforループから抜けるコードを探してみたのですがなぜか見つかりませんでしたので
    教えてください。

    No.5の回答に寄せられた補足コメントです。 補足日時:2016/09/07 23:32

A 回答 (5件)

えぇっと... 何をしようとしているのかがわからなくなった....



質問文で
「ImageMagick*
のフォルダーを検索し、フォルダー名を表示したいのですが」
とあるけど, これを
for /F %%A in ('dir ImageMagick* /B') do (
set STR= %%A
)
echo "%STR%"
のような形でやろうとすると実際には「フォルダー」が出てくるとは限らない (「ImageMagick*」にマッチするファイルがあったらそれが出てくるかもしれない) よね. さらに, 補足にある
「一回だけDirを使ってパスを取得する」
というのもよくわからない. 「パスを取得する」という「パス」って, なんのパスなんでしょうか? なんでもいいからてきとうに見つかればいいのかな?

質問文にあるように「フォルダーを検索する」というなら, そもそも dir 自体が不要なんだけどなぁ.
この回答への補足あり
    • good
    • 0

あまり良い方法が思い付きませんが、私が思い付く限りだと以下のような方法があるかと思います。



ファイル出力処理(リダイレクト)を使う方法です。

―――――――――――――――――――――
@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だと、もっと高度な処理が出来ると思いますが、私はプログラミングの知識が無いので、これらはあまり使えません。
    • good
    • 0

「set STR=」は、変数「STR」の中身を空にしているだけだと思います。



変数「STR」が、既に別の処理で使われていた時の為の掃除のようなものだと思います。

for文の中の「set STR=%%A」がメインとなる本当の代入処理だと思います。

フォルダ名に半角スペースがある場合は、「for /F %%A」の部分を「for /F "delims=:" %%A」等とした方が良いかと思います。半角スペースで名前が切れてしまう事がなくなります。

複数の「ImageMagick~」フォルダが存在する場合、変数「STR」に代入されるのは、DIRコマンドで最後に表示される行のフォルダ名1つだけですので、その点はご留意ください。
この回答への補足あり
    • good
    • 0

「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%"

とすれば、行頭のスペースも削除出来、その後も変数を使えると思いますが、これではまずいでしょうか。

ただ、この構文では、複数のフォルダや、半角スペースを含むフォルダには対応出来ません。
この回答への補足あり
    • good
    • 0

まず, endlocal のあとで参照する方法はありません. あきらめてください.



前半については set のヘルプを読むべし.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!