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

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

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

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

Q&A

解決済

2回答

683閲覧

Windowsのバッチファイルの中身についてです。

hamaguri

総合スコア1

Windows

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

0グッド

1クリップ

投稿2024/10/01 06:45

編集2024/10/01 08:27

実現したいこと

キッティングの作業に使用する予定のバッチファイルを作成しています。
大まか行いたいことは実行できていますが、一か所だけうまくいかない箇所があります。

発生している問題・分からないこと

こちらの処理のなかで、> 引用テキスト@rem 本社勤務かつBP以外の場合にscanフォルダを作成
if "%WorkplaceType%"=="本社勤務" (
if "%Dept%"=="BP" (
echo 本社勤務ですが、BPのため、scanフォルダを作成しません。
) else (
echo 本社勤務のため、scanフォルダを作成します。
mkdir "C:\Users%UserName%\Desktop\scan"
net share scan="C:\Users%UserName%\Desktop\scan" /GRANT:everyone,FULL
icacls "C:\Users%UserName%\Desktop\scan" /grant Everyone:(OI)(CI)F /T
)
) else (
echo 本社勤務ではないため、scanフォルダを作成しません。
)

こちらの処理に到達した瞬間に、if文に入ることなくバッチの処理が終了し、cmdが閉じてしまいます。

エラーメッセージ

error

1突然ばっちの処理が終わってしまいます。

該当のソースコード

@echo off @rem 管理者権限の確認 whoami /priv | find "SeDebugPrivilege" > nul if %errorlevel% neq 0 ( @powershell start-process %~0 -verb runas exit ) :select_workplace @rem 勤務形態の選択 echo 勤務形態を選択してください。 echo 1: 本社勤務 echo 2: 本社勤務ではない set /p Workplace="番号を入力してください (1/2): " if "%Workplace%"=="1" ( set WorkplaceType=本社勤務 ) else if "%Workplace%"=="2" ( set WorkplaceType=本社勤務ではない ) else ( echo 無効な入力です。もう一度選択してください。 goto select_workplace ) :select_department @rem 所属部署の選択 echo. echo 所属部署を選択してください。 echo 1: 管理部 echo 2: 人事部 echo 3: 営業 echo 4: その他 echo 5: BP set /p DeptNum="番号を入力してください (1-5): " @rem 所属部署に応じて変数を設定 if "%DeptNum%"=="1" ( set Dept=管理部 set UserNameFormat=小文字.小文字 ) else if "%DeptNum%"=="2" ( set Dept=人事部 set UserNameFormat=大文字.大文字 ) else if "%DeptNum%"=="3" ( set Dept=営業 set UserNameFormat=小文字_小文字 ) else if "%DeptNum%"=="4" ( set Dept=その他 set UserNameFormat=社員番号_小文字 ) else if "%DeptNum%"=="5" ( set Dept=BP set UserNameFormat=BP_小文字 ) else ( echo 無効な入力です。もう一度選択してください。 goto select_department ) @rem 名前を入力させる set /p FirstName="名前 (ローマ字で) を入力してください: " set /p LastName="姓 (ローマ字で) を入力してください: " @rem その他の場合、社員番号を入力させる if "%Dept%"=="その他" ( set /p EmployeeID="社員番号を入力してください: " ) @rem ユーザー名の設定 if "%UserNameFormat%"=="小文字.小文字" ( set UserName=%FirstName%.%LastName% ) else if "%UserNameFormat%"=="大文字.大文字" ( set UserName=%FirstName:~0,1%%LastName:~0,1% ) else if "%UserNameFormat%"=="小文字_小文字" ( set UserName=%FirstName%_%LastName% ) else if "%UserNameFormat%"=="社員番号_小文字" ( set UserName=%EmployeeID%_%LastName% ) else if "%UserNameFormat%"=="BP_小文字" ( set UserName=BP_%LastName% ) @rem 確認メッセージ echo. echo 勤務形態: %WorkplaceType% echo 所属部署: %Dept% echo ユーザー名: %UserName% set /p Confirm="この情報でよろしいですか? (Y/N): " if /i "%Confirm%" neq "Y" ( echo 処理を中止しました。 exit /b 1 ) @rem パスワードの入力と確認 set /p Password="パスワードを入力してください: " set /p PasswordConfirm="確認のため、もう一度パスワードを入力してください: " if not "%Password%"=="%PasswordConfirm%" ( echo パスワードが一致しません。処理を中止しました。 exit /b 1 ) @rem ローカルアカウントの作成 net user %UserName% %Password% /add if %errorlevel% neq 0 ( echo ユーザー作成に失敗しました。 exit /b 1 ) net localgroup administrators %UserName% /add echo ユーザー %UserName% を管理者として作成しました。 @rem 管理者権限に戻す cd C:\Windows\System32 @rem 作成したアカウントのファイルを作成させる runas /user:%UserName% smd PAUSE echo 作成したユーザーのスクリーンセーバーの設定 @rem 本社用PCセットアップのファイルに移動 cd C:\Users\10660_fuse\Downloads\Kitting_Setup_Scripts\config echo パスのコピー後 PAUSE @rem 「スクリーンセーバー用バッチ」を作成したアカウントのデスクトップにコピーする copy ScreenSaver_Config.bat C:\Users\%UserName%\Desktop\ScreenSaver_Config.bat echo 作成ユーザーのデスクトップにコピー後 PAUSE @rem 作成したアカウントでスクリーンセーバー設定を行うバッチを起動する runas /user:%UserName% C:\Users\%UserName%\Desktop\ScreenSaver_Config.bat echo NTPサーバー設定 @rem WindowsTimeサービスを開始する net start w32time @rem NTPサーバーを「ntp1.jst.mfeed.ad.jp」に変更する w32tm /config /manualpeerlist:ntp1.jst.mfeed.ad.jp /update @rem 設定したNTPサーバと時間を同期する w32tm /resync /nowait @rem NTPの状態を確認する w32tm /query /status @rem 確認後キーを何か押す echo. @rem 共通設定が完了した後にインストール処理を開始 echo 共通設定が完了しました。アプリケーションをインストールします。 @rem インストールバッチを選択して呼び出す if "%WorkplaceType%"=="本社勤務" ( if "%Dept%"=="管理部" ( call "C:\Users\10660_fuse\Downloads\Kitting_Setup_Scripts\config\install_admin.bat" ) else ( call "C:\Users\10660_fuse\Downloads\Kitting_Setup_Scripts\config\install_inhouse.bat" ) ) else ( call "C:\Users\10660_fuse\Downloads\Kitting_Setup_Scripts\config\install_outside.bat" ) echo アプリケーションのインストールが完了しました。 echo scanフォルダ作成前 PAUSE @rem 本社勤務かつBP以外の場合にscanフォルダを作成 if "%WorkplaceType%"=="本社勤務" ( if "%Dept%"=="BP" ( echo 本社勤務ですが、BPのため、scanフォルダを作成しません。 ) else ( echo 本社勤務のため、scanフォルダを作成します。 mkdir "C:\Users\%UserName%\Desktop\scan" net share scan="C:\Users\%UserName%\Desktop\scan" /GRANT:everyone,FULL icacls "C:\Users\%UserName%\Desktop\scan" /grant Everyone:(OI)(CI)F /T ) ) else ( echo 本社勤務ではないため、scanフォルダを作成しません。 ) pause

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

if文を調べて調整したりしましたが、変わりませんでした。

しかし、if文を消せばフォルダは作成されるため、今回の問題はif文なんだろうと、考えました。

補足

Windows11Proです。文字コードはANSIです。

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

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

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

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

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

odataiki

2024/10/01 07:02

動作環境を質問文に追記できますか? (Windows10Pro、等) バッチファイルのエンコードはUTF-8ですか?SJIS(Shift-JIS)ですか? 文字化け等が起きてないかなと思いました。
bsdfan

2024/10/01 08:05

確認方法と修正方法が思いついていないのですが、/grant Everyone:(OI)(CI)F のカッコが、else の閉じカッコとして扱われていないかが気になります。
hamaguri

2024/10/01 08:25

現状、Windows11Proでです。文字コードはANSIです。 if文についてですが、scanフォルダを作成するif文の上にある、部署によってインストールバッチを選択しているif文のものをまるまるコピーして、中身だけをscan関連にしたとしても処理落ちしてしまっている状況です。 bsdfanさんがおっしゃっていただいたelseの閉じカッコについて、確認をしてみます。 みなさんコメントありがとうございます。
guest

回答2

0

ベストアンサー

こちらの処理に到達した瞬間に、if文に入ることなくバッチの処理が終了し、cmdが閉じてしまいます。

構文エラーがあるため、エラーメッセージを表示して直後にウィンドウが閉じるので、エラーメッセージが見えないのでしょう。
デバッグが終わっていないバッチスクリプトは、コマンドプロンプトから起動しましょう。また、デバッグ中はecho offしない方が良いです。どんなコマンドを実行しているかという情報が失われるので。

この場合は、管理者権限でないコマンドプロンプトで実行するとバッチ処理の本体部分はpowershell start-processで新規ウィンドウで実行されてしまうので駄目です。管理者権限のコマンドプロンプトを開いて、そこから実行するとそのまま実行されるので、エラーメッセージが表示されるかと思います。
おそらく、(echo offしない前提で)

text

1前略 2(CI の使い方が誤っています。 3C:\~~> icacls "C:\Users\~~\Desktop\scan" /grant Everyone:(OI)(CI)F /T

複数行をまとめる()の中で、クォートされていない)が出てくるとそれが「閉じる)」とみなされるので、その直後の(CIの部分が文法エラーになります。
複数の解決法がありますが、引用符で囲むのが簡単です。

CMD

1icacls "C:\Users\%UserName%\Desktop\scan" /grant "Everyone:(OI)(CI)F" /T

投稿2024/10/01 08:56

otn

総合スコア86277

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

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

hamaguri

2024/10/02 08:02

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

0

回答ありがとうございました。
無事解決いたしました。

デバックの際に注意すべき事項も同時に教えていただきありがとうございます!
たすかりました!

投稿2024/10/02 08:02

hamaguri

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問