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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

3回答

3989閲覧

バッチスクリプトで共有フォルダ解除したい

javabigineer

総合スコア87

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2016/11/14 09:38

バッチスクリプトで共有設定されているフォルダを解除するツールをつくりたいのですが、永遠に1行目の共有名しか取得できず、2行目以降の共有フォルダを解除できません。
バッチスクリプトについて、あまり理解できていないので原因調査も行き詰っております。原因わかる方いらっしゃいましたら、ご教授ください。

@echo off echo 共有フォルダチェックを行います。 rem 共有フォルダをテキストに出力 net share | find /V "$" > C:\tmp\com.txt rem 出力テキストの4文字目以降を出力 more +4 C:\tmp\com.txt > C:\tmp\comn.txt pause rem 最初の一時ファイルを削除 del C:\tmp\com.txt setlocal ENABLEDELAYEDEXPANSION rem :FOR01 for /f "delims= " %%i IN (C:\tmp\comn.txt) DO ( echo "共有名 " %%i " が存在します" SET comn=%%i set /p ANSWER="共有解除してよろしいですか(Y/N)?" if /i {!ANSWER!}=={y} (goto :yes) if /i {!ANSWER!}=={yes} (goto :yes) if /i {!ANSWER!}=={n} (goto :no) if /i {!ANSWER!}=={no} (goto :no) if !comn!=="" EXIT /B ) :no echo !comn!の共有解除を中止しました。& pause exit :yes net share !comn! /delete echo !comn! の共有が解除されました。 SET comn="" goto FOR01 echo 一時ファイルを削除します。 del C:\tmp\comn.txt

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

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

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

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

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

guest

回答3

0

ベストアンサー

yesの場合にgotoでは無くcallにして :yes の処理をサブルーチンっぽくしてみてください。

if /i {!ANSWER!}=={y} (goto :yes) if /i {!ANSWER!}=={yes} (goto :yes)

を以下に変更

if /i {!ANSWER!}=={y} (call :yes) if /i {!ANSWER!}=={yes} (call :yes)

:yesの最後を

SET comn="" goto FOR01

から

exit /B

まとめるとこんなコードになります。

・・・略・・・ for /f "delims= " %%i IN (C:\tmp\comn.txt) DO ( if !comn!=="" goto :finish echo "共有名 " %%i " が存在します" SET comn=%%i set /p ANSWER="共有解除してよろしいですか(Y/N)?" if /i {!ANSWER!}=={y} (call :yes) if /i {!ANSWER!}=={yes} (call :yes) if /i {!ANSWER!}=={n} (goto :no) if /i {!ANSWER!}=={no} (goto :no) ) :finish if exist C:\tmp\comn.txt del C:\tmp\comn.txt EXIT /B :no echo !comn!の共有解除を中止しました。& pause exit :yes net share !comn! /delete echo !comn! の共有が解除されました。 exit /B ・・・略・・・

投稿2016/11/14 10:09

編集2016/11/14 15:08
Y.H.

総合スコア7914

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

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

MasahikoHirata

2016/11/14 10:14

それと’SET comn="" ’を削除しないと。
Y.H.

2016/11/14 10:19

Oh...一つ目で終わってしまいますね。ありがとうございます。回答を修正します。
javabigineer

2016/11/14 10:26

上記のコードで試してみたところ、1つ目の共有を解除したあと、EXITで処理が終わってしまいます。続けて2つ目、3つ目と解除させたいのですが。。
Y.H.

2016/11/14 10:33

すみません、exitに/Bつけるの忘れてました。 回答を修正しました。これで大丈夫だと思うのですが。。。
MasahikoHirata

2016/11/14 10:35

ついでに’del C:\tmp\comn.txt’もお忘れなく。
javabigineer

2016/11/14 10:35

修正ありがとうございます。できました。 最後にブランクも"共有名 が存在します"となってしまいますが、if !comn!=="" EXIT /Bがきいてないんですかね?
Y.H.

2016/11/14 10:39

そのif文をforの先頭に移動してください。
guest

0

yes のときの処理で、解除後にfor ループの手前に戻ってしまっています。
結果、forループをやり直しますから、先頭行だけが出てくることになります。

投稿2016/11/14 09:46

tacsheaven

総合スコア13703

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

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

0

’SET comn=""
goto FOR01’しているけど、FOR01の位置が’)’の前では?

投稿2016/11/14 09:42

MasahikoHirata

総合スコア3747

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

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

javabigineer

2016/11/14 09:48

goto FOR01を’)’の前にもっていきましたが、1行目のみ処理してそのまま処理終了してしまいました。。
MasahikoHirata

2016/11/14 09:50

いえいえ'FOR01'だけを’)’の前。tacsheavenさんも回答されていますが、forの外では最初の行からになりますので。')'だと次の行に行きますよ。
javabigineer

2016/11/14 09:55

:FOR01をfor分の中に入れるということですか?
MasahikoHirata

2016/11/14 09:56

はい。forの最後、つまり')'の前に。
tacsheaven

2016/11/14 09:56

フローチャートを描けば(って古いか?)、何がおかしかったのかわかりやすいかもしれませんね。 本来必要なことは、yesの処理が終わったら、forループの中の、yesを呼び出した部分の直後に戻ることです。
MasahikoHirata

2016/11/14 09:58

tacsheavenさん、そうですよね。goto で':yes'に飛んでるから、処理の後、forの次の為の場所に帰ればOK。
javabigineer

2016/11/14 10:01

for文の最後に:FOR01を記載すると、「コマンドの使い方が誤っています」とエラーになってしまいます。
tacsheaven

2016/11/14 10:03

あ、そうか。yes の処理の中で comn をクリアしちゃってるから、単純に直後に戻ると if !comn!=="" EXIT /B に引っ掛かりますね。 ループ末端の方がいいか。
MasahikoHirata

2016/11/14 10:03

’:FOR01 for /f "delims= " %%i IN (C:\tmp\comn.txt) DO ( echo "共有名 " %%i " が存在します" SET comn=%%i set /p ANSWER="共有解除してよろしいですか(Y/N)?" if /i {!ANSWER!}=={y} (goto :yes) if /i {!ANSWER!}=={yes} (goto :yes) if /i {!ANSWER!}=={n} (goto :no) if /i {!ANSWER!}=={no} (goto :no) if !comn!=="" EXIT /B ) ’これを ’ for /f "delims= " %%i IN (C:\tmp\comn.txt) DO ( echo "共有名 " %%i " が存在します" SET comn=%%i set /p ANSWER="共有解除してよろしいですか(Y/N)?" if /i {!ANSWER!}=={y} (goto :yes) if /i {!ANSWER!}=={yes} (goto :yes) if /i {!ANSWER!}=={n} (goto :no) if /i {!ANSWER!}=={no} (goto :no) if !comn!=="" EXIT /B :FOR01 ) これでエラー出ますか?
MasahikoHirata

2016/11/14 10:07

javabigineerさん、そしてtacsheavenさん、だから’)’の前です。(念のため前の行を改行したが)
javabigineer

2016/11/14 10:21

)の使い方が間違えています。 と出ます。なんか違うところがおかしいんですかね?
tacsheaven

2016/11/14 10:22

んー…もしかして、for ループから goto で脱出してしまってるので、戻れないかも。 yes も no も for ループ内に処理持ってこないとダメかな?
tacsheaven

2016/11/14 10:35

for の部分を書き換えるとこんな感じになります。 for /f "tokens=1 delims= " %%i IN (C:\tmp\comn.txt) DO ( SET comn=%%i if %%i=="" EXIT /B echo "共有名 " %%i " が存在します" set /p ANSWER="共有解除してよろしいですか(Y/N)?" set yn = 0 if /i {!ANSWER!}=={y} (set yn=1) if /i {!ANSWER!}=={yes} (set yn=1) if /i {!ANSWER!}=={n} (set yn=2) if /i {!ANSWER!}=={no} (set yn=2) if {yn}=={1} ( net share !comn! /delete echo !comn! の共有が解除されました。 ) else if {yn}=={2} ( echo !comn!の共有解除を中止しました。 ) set ANSWER="" ) echo 一時ファイルを削除します。 これで一応は動きますが、最後に「コマンドは正常に終了しました。」という存在しない共有名が出てきます(最初の net share | find /V "$" の結果から取り除いていないため) あとこれ、管理者権限のコマンドプロンプトからでないと net share /DELETE が効かないかも
javabigineer

2016/12/13 06:02

管理者権限で実行させるために、自動昇格ってできるんでしたっけ?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問