X



【.cmd】 バッチファイルスクリプト %13 【.bat】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/11/21(水) 14:52:07.84ID:v84I4o+L
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

※何でも無理矢理バッチでやろうとせず、WSH等の使用も検討しましょう。
前スレ
【.cmd】 バッチファイルスクリプト %11 【.bat】©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1424858999/
【.cmd】 バッチファイルスクリプト %12 【.bat】
https://mevius.5ch.net/test/read.cgi/tech/1489207631/

それ以前の過去スレ
%10 http://peace.2ch.net/test/read.cgi/tech/1374205515/
%9  http://toro.2ch.net/test/read.cgi/tech/1335015478/
%8  http://toro.2ch.net/test/read.cgi/tech/1315844420/
%7  http://hibari.2ch.net/test/read.cgi/tech/1298873550/
%6  http://hibari.2ch.net/test/read.cgi/tech/1277465356/
%5  http://pc12.2ch.net/test/read.cgi/tech/1242268171/
%4  http://pc12.2ch.net/test/read.cgi/tech/1229955189/
%3  http://pc11.2ch.net/test/read.cgi/tech/1217860043/
%2  http://pc12.2ch.net/test/read.cgi/tech/1197881068/
%1  http://pc11.2ch.net/test/read.cgi/tech/1178281991/
0124117
垢版 |
2019/02/19(火) 20:46:10.94ID:kZ82VOHH
>>118
ネットで探したのですが、バッチファイルをやり始めて日が浅いので使うコマンドの見当も付きませんでした。
今日職場で必要だったので聞いてしまいました。

>>119
助かりました。
どうもありがとうございます。
0126デフォルトの名無しさん
垢版 |
2019/02/20(水) 08:00:48.35ID:vs0GH/UB
AzureAD、Office365を使うなら(Office365についてはGraphの使いこなしも必須)。バッチやVBSの代替としても必須。
「Powershellが出来る」だけではなくPowershellも活用し、なんの業務をしてたか?がスキルとなる基本的にはインフラ屋のスキルの一要素
0128デフォルトの名無しさん
垢版 |
2019/02/21(木) 18:42:23.51ID:WAQ7+H44
環境変数の中に=があると
変数参照が変な事になってくるな...

>set a=b=c

>echo %a%
b=c

>echo %a=b%
c
0129デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:45:58.39ID:bhin4IwL
イコールは^つけないと特殊な動作するはず
0133デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:19:20.44ID:WAQ7+H44
バッチでやって見た
set a=b^=c
echo %a%
echo %a=b%

結果
b=c
c

set "a=b=c" でも同じ
Microsoft Windows 10 Pro
10.0.17763 N/A ビルド 17763

>set a
a=b=c
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\ore\AppData\Roaming
0134デフォルトの名無しさん
垢版 |
2019/02/21(木) 23:16:08.70ID:WAQ7+H44
>>133
たった今、品質更新プログラムのインストールしました。
KB4487044 (OS ビルド 17763.316)
なんと正常になったようです

結果
b=c
ECHO は <OFF> です。
0135デフォルトの名無しさん
垢版 |
2019/03/01(金) 16:41:47.85ID:7J1MA7z+
1.batファイルで
start ***.bat
を実行してその***.batの中に
call ***.exe
があるんだけど
最初に実行するbatファイルでどうにか ***.exeを最小化で起動できますか?
0137デフォルトの名無しさん
垢版 |
2019/03/12(火) 10:13:24.40ID:2ZxzO4Nc
forで行取得して並列で処理してるんですが、一度にすべて実行するのでPCの負担が大きいです。
さらに回数指定するには、どうすればできますか?
0138137
垢版 |
2019/03/12(火) 11:09:28.51ID:2ZxzO4Nc
すみません。説明不足でした。
初めにforでテキストを取得しsetに割り当て、全てをコマンドとして生成して並列処理しています。
並列で3回ずつ実行し終了をループしたいです。
0140デフォルトの名無しさん
垢版 |
2019/03/12(火) 14:22:43.31ID:JT0qCUVC
FORでサブルーチンをCALLするようにして、
3回呼び出されたら実行するようにするとかかな
これ以上は元のバッチを見ないと何とも
0141デフォルトの名無しさん
垢版 |
2019/03/12(火) 14:35:25.41ID:ollYoz5v
並列処理ということは、非同期呼び出しを使ってるわけだから
その呼び出した処理の終了をどうやって感知するかが肝
多分プロセスの存在チェックでいけると思うがそういうのが過去ログにあったと思う
0142デフォルトの名無しさん
垢版 |
2019/03/12(火) 20:57:10.17ID:kFHhQjU8
んでもそんな高度な事がしたいならVCあたりで作っちゃいかんの?
0143デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:11:57.06ID:MfJOghkN
-- A.bat --
:loop
if "%~1" == "" goto end

call B.bat "%~1"

shift
goto loop
:end

-- B.bat --
--
if exist "%~dpn1_hoge.txt" (
set XXX=--option "%~dpn1_hoge.txt"
)
--

A.batに複数ファイルをD&DしたときにB.batのif existで指定したファイルがA.batに入力したファイルに1つでも存在すれば他の入力ファイルにも同じ処理が実行されてしまいます
これを回避するにはどうすればいいでしょうか?
0144デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:20:05.87ID:Gms0hgp4
毎回リセットしとけば?
b.batの先頭でset xxx=を書くとかb.batをsetlocal〜endlocalするとか
0145デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:26:03.45ID:Gms0hgp4
すまん良く読んでなかった
ファイルね
b.batで生成するのかな?
削除しちゃっても問題ないのならa.batの先頭でdelしちゃえば?
0146デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:37:26.49ID:MfJOghkN
B.batは動画のエンコードに使っているバッチファイルの中身の一部で %~dpn1_hoge.txt があった場合はツールに追加のオプションを指定するようにしている感じです
0147デフォルトの名無しさん
垢版 |
2019/03/19(火) 11:54:10.54ID:hD2ftWP/
set day=3/19(火)
if 1==1 (
echo %day%
)

すみませんどなたか教えてください。
曜日の半角括弧のせいでif文が閉じられてしまうんだけど
どうやってエスケープすればいいんでしょうか?
0150デフォルトの名無しさん
垢版 |
2019/03/19(火) 12:57:54.34ID:dDtGuicR
>>147
こういう方法もある
変数dayの中に、二重引用符がなければ

set day=3/19(火)
if 1==1 (
for /f delims^=^ eol^= %%i in ("%day%") do echo %%i
)

これだとdayに & | > < ^ ( ) 等やばそうな文字が入っても大丈夫
0152147
垢版 |
2019/03/19(火) 13:11:02.99ID:hD2ftWP/
set day=3/19(火)
if 1==1 (
echo %day:~0,6%^)%
)

これでいけました。
>>150のも今後の参考にさせてもらいます。ありがとうございました
0154デフォルトの名無しさん
垢版 |
2019/03/19(火) 20:28:12.65ID:xvBmkr0d
>>147
echo出力だけなら環境変数を ""でくくった上で遅延展開する方法もある。
これだとほとんどすべての記号がそのまま出力される。例外として「!」は「^!」で、「%」は「%%」で、「^」「^^」などは要エスケープ。

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set "day=3/19(火)"
if 1==1 (
echo !day!
)
0159デフォルトの名無しさん
垢版 |
2019/03/21(木) 23:03:18.28ID:HPyHK69o
遅延モードでのエスケープの動作が面白い
setlocal enabledelayedexpansion
set "a=^x ^^ ^!"
set "b=^x ^^ ^y"
set "c=^x ^^ ^y" !
echo a=!a!
echo b=!b!
echo c=!c!

a=x ^ !
b=^x ^^ ^y
c=x ^ y
0160デフォルトの名無しさん
垢版 |
2019/04/10(水) 22:17:03.83ID:dRPi9Fbo
コマンドプロンプトで以下のpowershellコマンドを実行すると曜日が英語で表示されるのですが、
ここで表示された"Wednesday"を呼び出し元であるコマンドプロンプト側の変数に取得するのは難しいでしょうか?
曜日の判定に使いたいのです。

  C:\>powershell "(get-date).DayOfWeek"
  Wednesday
0163デフォルトの名無しさん
垢版 |
2019/04/17(水) 14:41:43.82ID:SVkPhkuc
読み取り専用属性付加と解除についてお願いします

ATTRIB +R hoge.txt
この場合hoge.txtをバッチファイルにドロップしたときhoge.txtの属性が読み取り専用になりますが

ATTRIB +R *.txt
とすると一つのファイルをドロップしただけでディレクトリ内の全てのテキストファイルの属性が変わってしまいます
バッチファイルへドロップしたファイルのみ属性を変えたいのですがこういうことは可能でしょうか?
0164デフォルトの名無しさん
垢版 |
2019/04/17(水) 15:11:44.94ID:SVkPhkuc
>>163です
バッチファイルにファイル名を指定してしまうと同一名のファイルしか処理できませんが
ファイル名が異なっていてもドロップしたファイルのみ属性変更したいのです
0166デフォルトの名無しさん
垢版 |
2019/04/17(水) 15:59:23.64ID:SVkPhkuc
>>165
ATTRIB +R

これだけでいいのでしょうか
試してみましたが一つのファイルをバッチファイルへドロップすると
ディレクトリ内の全てのファイルが属性変更されてしまいます
0167デフォルトの名無しさん
垢版 |
2019/04/17(水) 16:34:46.90ID:HAjihGMm
>>166
ATTRIB +R %1

引数のファイルだけ属性を変える
引数が無い場合は全てのファイルになるので
ガードは付けた方が良いと思う
0168デフォルトの名無しさん
垢版 |
2019/04/17(水) 17:06:43.84ID:SVkPhkuc
>>167
%1 とすることでドロップした一つのファイルが読み取り属性変更できるようになりました
二つとか三つとか複数ファイルはできないのですよね
皆さんありがとうございました
0170デフォルトの名無しさん
垢版 |
2019/04/17(水) 18:03:53.01ID:mAjziF7r
バッチファイルの図形プログラミング作ったら広告収入入ると思いますか?
0171デフォルトの名無しさん
垢版 |
2019/04/17(水) 18:18:21.55ID:QABBLuNd
俺のところじゃ>>169はエラーになる
for %%i in (%*) do attrib +r %%i
まあファイル名によってはこれもダメだけど
0173デフォルトの名無しさん
垢版 |
2019/04/17(水) 21:07:05.52ID:3cAVwUGz
複数ファイルドロップするなら shift でループが簡単だと思うけど何か落とし穴ある?
0174デフォルトの名無しさん
垢版 |
2019/04/18(木) 19:59:48.99ID:pUSpmyse
ファイルドロップで落とし穴があるとしたら >>45 みたいな引数の時
>>48 を参考にすると

@echo off
set "a=%cmdcmdline:"=*%"
set "a=%a:~0,-1%" & set "e="
set "c=" & for /f "tokens=2* delims=*" %%i in ("%a%") do set "c=%%j"
:x
set "a=" & for /f "tokens=*" %%i in ("%c%") do set "a=%%i"
if "%a:~0,1%"=="*" (set "d=*") else set "d= "
set "b=" & set "c="
for /f "tokens=1* delims=%d%" %%i in ("%a%") do set "b=%%i" & set "c=%%j"
if defined b set e=%e% "%b%" & goto x
for %%i in (%e%) do attrib +r %%i

でもこれファイルドロップでしか使えない
0175デフォルトの名無しさん
垢版 |
2019/04/19(金) 16:41:41.89ID:nzBF9sby
batのコマンドのタイトルバーに
「管理者: 」
の表示を消すこと出来ないのでしょうか?
0177デフォルトの名無しさん
垢版 |
2019/04/19(金) 18:58:50.77ID:FmrBk+Vp
スレチと怒られそうだが

--- change_wnd_title.uws ------
DEF_DLL SetWindowTextA(HWND, STRING):BOOL:user32.DLL
DIM old_title = PARAM_STR[0]
DIM new_title = PARAM_STR[1]
DIM idwnd = GETID(old_title)
IFB -1<idwnd THEN
SetWindowTextA(IDTOHND(idwnd), new_title)
ENDIF
---------

C:\UWSC\UWSC.exe C:\TEST\change_wnd_title.uws "管理者: test" "ABC"
を管理者権限で実行
「管理者:」 と「test」 の間にスペースが2つある点に注意

べつにWin32apiが使えればほかのスクリプトでもいいが
すでに配布が終了している(?)UWSCをすすめるのは
とてもにコンパクトで気軽に試しやすいため
以下のレスにあるDL先は公式リンク
使うのはFree版でよい
http://egg.2ch.net/test/read.cgi/software/1533818531/3
0178デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:14:57.50ID:5yrPogsy
>>175
例えば d:\hoge\a.bat を実行するなら

ショートカットの新規作成でコマンドは
cmd /c start "ABC" /d "d:\hoge" a.bat
ショートカットのプロパティで
実行時の大きさは「最小化」
詳細設定で「管理者として実行」

このショートカットを実行すると
a.bat が管理者として実行されて
タイトルは ABC のみになる
0179デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:49:09.78ID:5yrPogsy
>>178
念のため書いておくが
バッチの中で
title xxx
と書くと「管理者:xxx」
となるので台無し
バッチの title コマンドは消せ
それが出来ないなら俺は知らん
0180デフォルトの名無しさん
垢版 |
2019/04/19(金) 23:47:56.76ID:UTkV4PFm
あのさ
もう設計書はあるからバッチ作ってって言われて設計書見たんだが
「%0\..\xxx\yyy.batをコールする」とか書かれてて腰折れそうなんだけど…
0181デフォルトの名無しさん
垢版 |
2019/04/20(土) 00:03:36.64ID:oEi+Bse9
やりたい事が書いてあるかどうかだな
設計書作る手間で自分でかけとも思うけど 

外注なら設計書から作りましょうねと諭して工数確保だな
0182デフォルトの名無しさん
垢版 |
2019/04/20(土) 00:08:13.21ID:vpsjY4OY
>>181
まあやりたい事分かるからこっちで直して
これでいいですよね?って聞くつもりだけど
細かく書いといて間違えてるのやめてほしい…
0184179
垢版 |
2019/04/20(土) 04:50:04.97ID:HO8cTApa
たぶん>>121の奴だろ
胡散臭い
0197デフォルトの名無しさん
垢版 |
2019/05/19(日) 00:27:10.87ID:p20+5ZYI
Win10で、.(ドット)から始まる4文字以上のフォルダを再帰的に削除したいのですがうまくいきません

for /d /r %%d in (.????*) do rmdir /s /q "%%d"

フォルダ名をスペースおきに書くと削除できますがワイルドカードを使って処理できないものでしょうか
0200デフォルトの名無しさん
垢版 |
2019/05/19(日) 11:40:23.60ID:C4jenAHt
>>197

for /d /r %%i in (.*) do set "a=%%~fi" & call :x "%%a%%"
pause & goto :eof
:x
set "b=%~nx1"
if not "%b:~4,1%"=="" rd /s /q %1
0201197
垢版 |
2019/05/19(日) 12:35:02.55ID:p20+5ZYI
>>198-199
>>200
ありがとうございます!

rmdirをechoに置き換えて確認してみましたところ、>>200 様ではフォルダ名を取得できませんでした
>>198-199 様で対象にしたいフォルダ名を取得できましたのでこちらを使わせていただきます
ありがとうございました
0202デフォルトの名無しさん
垢版 |
2019/05/19(日) 13:00:03.54ID:C4jenAHt
>>201
なにを言ってるのか意味不明だな?
>>200 の rd を echo rd に変えたのなら問題ないだろ

>>198 を使うなら /f "delims=" にしろよ?
あと、>>198 だと \.12\abc とかも消えるぞ
0204デフォルトの名無しさん
垢版 |
2019/05/20(月) 07:05:59.13ID:/nt8UTBS
for /f "delims=" %%i in ('dir/adh/s/b .*') do (
set "a=%%~nxi" & call set "a=%%a:~4,1%%"
if defined a if exist "%%i" rd/s/q "%%i")
0205デフォルトの名無しさん
垢版 |
2019/05/26(日) 10:45:56.66ID:nyCVecKy
7-Zipスレからこちらに誘導されてきました

バッチファイルを実行して
指定したフォルダを7z圧縮し別の指定した場所へ保存する方法教えてください
0209デフォルトの名無しさん
垢版 |
2019/05/26(日) 17:24:55.92ID:iePtiDR/
>>205
7-Zip のパスは自分の環境に合わせる

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files (x86)\7-zip;%path%
set /p i=圧縮するフォルダのフルパス=
set "i=%i:"=%"
set /p o=書庫を作成するフォルダのフルパス=
set "o=%o:"=%"
set /p n=書庫名(拡張子なし)=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause
0210デフォルトの名無しさん
垢版 |
2019/05/26(日) 18:42:28.21ID:nyCVecKy
>>209
ありがとうございます

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set /p i=Z:\TE=
set "i=%i:"=%"
set /p o=Z:\zz=
set "o=%o:"=%"
set /p n=a=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause

7-Zip のパス
C:\Program Files\7-Zip

ZドライブTEフォルダを圧縮
Zドライブzzフォルダに作成
書庫名aにしてみましたが動作しませんでした
誤った箇所ありますでしょうか
0211デフォルトの名無しさん
垢版 |
2019/05/26(日) 19:22:25.25ID:4n4gfKEy
>>210
書き換えないといけないのは7zipのパスのところだけであとのところはいじっちゃだめ
なので↓をメモ帳に貼り付けて適当な名前のbatファイルに保存が正解

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set /p i=圧縮するフォルダのフルパス=
set "i=%i:"=%"
set /p o=書庫を作成するフォルダのフルパス=
set "o=%o:"=%"
set /p n=書庫名(拡張子なし)=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause
0213デフォルトの名無しさん
垢版 |
2019/05/26(日) 19:35:30.91ID:nyCVecKy
>>211
>>212
これでできました

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set i=Z:\TE
set o=Z:\zz
set n=a
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause

自分のような者に教えていただきありがとうございました
0214デフォルトの名無しさん
垢版 |
2019/05/30(木) 23:24:33.44ID:D3n586fF
CMDの画面でこういうのを入力して実行したら
FOR /L %I IN (1,1,20) DO @CALL ECHO %I
画面の上のタイトルに文字が
うじゃうじゃ出て来るのはなぜ?
0215デフォルトの名無しさん
垢版 |
2019/06/01(土) 22:51:37.17ID:cR7U/Ve2
最近の発見
remの前に空白をおける

: でラベルを示すが、:の前後に複数の空白、タブ、全角空白があってもよい
: タブ abc

またラベルの後の空白以降の文字列は無視するのでコメントを書ける
: abc エラーの場合

まあ、あまり使うところないけど
0216デフォルトの名無しさん
垢版 |
2019/06/02(日) 00:30:45.28ID:0ZBCelud
最後のは割と便利そうだけど
現場だとコメントはREM使えっていうコーディング規約に阻まれそうだw
0217デフォルトの名無しさん
垢版 |
2019/06/02(日) 03:07:05.57ID:rFF/uYB6
>>214
そもそも call の引数はバッチファイル名かラベルだ。
それ以外の、内部コマンドや外部コマンドじゃない。
そんな使い方、help のどこにも書いてない。
一見、正常に動作している様に見えるが、
内部では子プロセスが異常終了している。
だからタイトル名に子プロセスの残骸が残る。

call set なども動作はするが邪道。
0218デフォルトの名無しさん
垢版 |
2019/06/04(火) 23:08:45.76ID:YyzuHNes
>>215
REM は「コマンド」だから前に空白が置ける。それは当然として。

ラベルをコメント代わりに使うのは止めとけ。
for や if コマンドの中で「インテンドを使って」コメントに使おうとすると弾かれる。
大人はバッチのコメントは REM で書くものだ。

Intel のドライバーインストーラーのバッチは奇麗だと思うぞ。
0219デフォルトの名無しさん
垢版 |
2019/06/09(日) 19:33:03.04ID:ESLww06V
変数のサイズの最大値って何バイトなんだろう

@echo off
setlocal enabledelayedexpansion
set "a=x"
for /L %%i in (1,1,12) do set "a=!a!!a!"
set "b=x"
for /L %%i in (1,1,13) do set "b=!b!!b!"
if !a!==!b! (echo "a=b") else echo "a<b"
pause

結果は
"a=b"
0221デフォルトの名無しさん
垢版 |
2019/06/10(月) 07:14:20.96ID:24zpPZFc
https://www.atmarkit.co.jp/ait/articles/1510/30/news041.html
内部的には1つの変数当たり最大32767文字
コマンドプロンプトの入力行は最大で8190文字
システム環境変数やユーザー環境変数の最大値は約2000文字(setxコマンドでは最大1024文字)

@echo off &setlocal
set a=x
set b=x
set /a i=2
:LOOP
set a=%a%x
echo %i%
if not %a%==%b% (
set b=%a%
set /a i+=1
goto :LOOP
)
pause
速くて正確ではないけど4093くらいで落ちた
コマンドの制限に掛かるみたいやね
0223デフォルトの名無しさん
垢版 |
2019/06/10(月) 15:28:36.17ID:q9TwxOtc
>>221
こういうのって統一して何バイトって決めないとやばくないのかな
windowsバージョン、英語、日本語、ヒンズー語など言語で微妙に変化すると、
おかしなことがおきたり、ウィルスの侵入口に利用される
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況