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/
0726デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:04:39.20ID:s3lLVMWt
3桁連番付けただけ
@echo off & set n=1001
for %%i in (*.txt) do set a=%%i& call :x
goto :eof
:x
ren "%a%" "%n:~1%-%a%" & set /a n+=1
0727デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:14:39.66ID:J0u+GdjC
リネームは結構難しい
リネーム後のファイルが再びリネーム対象となる場合がある
0730デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:49:32.13ID:GY5lnYbX
リネームは一覧を一旦ファイルに出力してから回した方が安全だよ
それとファイル名にUNICODE文字が混ざってる場合も考慮するとバッチファイルではやらん方がいいよ
vbsかjsかpowershell
0731724
垢版 |
2020/04/21(火) 23:57:26.74ID:HADG6GDb
>>724
のRuby では最初に、Dir.glob( "C:/Users/Owner/test/*" )
で、そのフォルダ内のすべてのファイルを取得しているから、

各ファイルを、rename していく途中で、
rename後のファイルを、再びrenameすることはない
0732デフォルトの名無しさん
垢版 |
2020/04/22(水) 00:04:16.90ID:vEO7RF6u
>>730
ファイル出力というかfor/fでdir出力の取り込みでいいんじゃね?
UNICODE文字は関係あるかね?
0733デフォルトの名無しさん
垢版 |
2020/04/22(水) 06:52:59.32ID:gobEj/px
>>721
@echo off & set "n=1001" & set t=tmp_dir
md %t% & for %%i in (*.txt) do set a=%%i& call :x
move %t%\* . > nul & rd %t% & goto :eof
:x
move "%a%" "%t%\%n:~1%-%a%" > nul & set /a n+=1

tmp_dirの名前は何でもいいが既存の名前を避けてください。
0735デフォルトの名無しさん
垢版 |
2020/04/22(水) 10:16:03.76ID:MJO3kN2U
駄目文字のせいでSJISコードがバグると言うならまだわかるが
その逆って意味がわからないな
MSは全くテストしてないってことか
0736デフォルトの名無しさん
垢版 |
2020/04/22(水) 11:07:12.34ID:/W5c3Vma
>>722-735
どうも
勉強中です
0737デフォルトの名無しさん
垢版 |
2020/04/22(水) 11:53:22.55ID:/W5c3Vma
複数行を一行にまとめる場合は、&でつなぐんでしょうか?
これが改行と同じ意味でしょうかね。
0738デフォルトの名無しさん
垢版 |
2020/04/22(水) 12:07:17.67ID:vEO7RF6u
>>736
@echo off & set n=1001& chcp 65001 > nul
for /f "delims="eol^= %%i in ('dir /b *.txt') do set a=%%i& call :x
goto :eof
:x
ren "%a%" "%n:~1%-%a%" & set /a n+=1

>>734 コードページ変えればいいだけ
0739デフォルトの名無しさん
垢版 |
2020/04/22(水) 19:08:42.79ID:nR8TNEgs
>>737
複数行をまとめるって、、
文字列の足し算の話?
コマンドを複数行に分割して記述する話?
(継続文字のこと?)
0741デフォルトの名無しさん
垢版 |
2020/04/22(水) 20:05:53.95ID:j1ZYXyL3
>>735
コマンドプロンプトは自体はUNICODE対応
各種コマンドもUNICODE対応

だけどバッチファイルは過去の互換性が必要なので
デフォルトではOSの設定(日本語だとSJIS)の文字コードとして使われる。
その設定はchcpで変えることが出来る

単にコマンド呼び出しをしてるだけならUNICODEとして扱われるが
forでバッチファイルの世界に招き入れたら、
chcpの設定によって文字コードの変換が行われる

テストはしてるだろ。この文字コード変換は仕様なので
バッチファイルでUNICODE文字を扱いたければchcpで
UTF-8に変更しなければならないというだけのこと
0742デフォルトの名無しさん
垢版 |
2020/04/23(木) 06:47:17.74ID:153+oMoq
>>739
バッチファイルではなくて、複数行をコマンドプロンプト上で実行したい場合があったりします
0743デフォルトの名無しさん
垢版 |
2020/04/23(木) 08:24:04.38ID:5iduMLE+
>>742
複数行をコピペじゃ駄目なの?
例えば、この内容をメモ帳に記述しておいて

rem ―- ここから ――
dism /online /cleanup-image /restorehealth
sfc /scannow
rem ―- ここまで ―-

4行をコピペする
0744デフォルトの名無しさん
垢版 |
2020/04/23(木) 09:07:36.24ID:Z6s7Y3Lu
>>742
複数コマンドを1行で実行したいということなら、、、
A & B ... A実行後にBを実行
A | B ... Aの実行結果をBに渡して実行
A && B ... Aが成功したらBを実行
A || B ... Aが失敗したらBを実行

長いコマンドを複数行に分割したいなら、、、
Sentence1 ^<改行>
Sentence2
(サーカムフレックスで継続)
0745デフォルトの名無しさん
垢版 |
2020/04/23(木) 12:04:05.59ID:qTwHi2aC
()で囲めばいい。

(timeout /t 300
cd d f:\hoge
for %f in ( *.jpg ) do (
 ・・・
)
)

正式名称が何かは知らないが勝手にブロックと呼んでる。
0748デフォルトの名無しさん
垢版 |
2020/04/23(木) 15:25:29.03ID:153+oMoq
>>743コピペでももちろんいいですが、知っておきたかったです
0752デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:05:24.10ID:FVxXRtXH
連番をつけるコードでまだ躓いています
hoge.txt
hogehoge.txt

hoge(1).txt
hogehoge(2).txt
としたいです
echo off & for %i in (*.txt) do (ren %i ???)
このはてな部分に連番を指定するためにインデックスを指定しないといけないと思うんですが、%i自体にはファイル名が入っていると思います。インデックスは取れるんでしょうか?
0753デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:36:58.48ID:FVxXRtXH
バッチでset /aなどのオプションがありますが、/aは計算を伴う場合に使うそうです。
この/aに意味はあるのですか?
何らかの単語の略だと覚えやすいんですが。
0754デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:40:50.40ID:Pfsg7A5O
その程度ぐぐれば出てくるでしょ
インデックスのカウント用変数が必要+変数の遅延展開
丸括弧のエスケープが必要
aはarithmeticの略
0755デフォルトの名無しさん
垢版 |
2020/04/26(日) 20:15:42.23ID:cczyU4e/
@echo off & set n=1& chcp 65001 > nul
for /f "delims="eol^= %%i in ('dir /b *.txt') do set a=%%i& call :x "%%a%%"
goto :eof
:x
ren %1 "%~n1(%n%)%~x1" & set /a n+=1
0757デフォルトの名無しさん
垢版 |
2020/04/26(日) 22:18:32.20ID:DxwpR+0O
普通に do call :x "%%~i" でいいと思うんだが何故いちいち set a=%%i とかしてるの?
何か理由あるん?
0759デフォルトの名無しさん
垢版 |
2020/04/28(火) 05:49:29.43ID:ceHl0duT
シェルスクリプトってお手軽省略表記にこだわりすぎるあまり
エスケープ処理が複雑化しバグりやすくなって本末転倒だよな
0761デフォルトの名無しさん
垢版 |
2020/04/28(火) 13:01:40.55ID:DKHJb1hS
他の言語でもエスケープは必要なことはあるし同じこと
ただbatのように自身を置換して逐次実行するするようなことは
eval系の命令を使う場合なのでほぼ無いに等しいので意識されないだけ
0762デフォルトの名無しさん
垢版 |
2020/04/28(火) 16:44:00.76ID:3RXW9/E3
要するに分かりにくい
ここで初心者にイロハから質問されてもレスがしにくい
リネームソフトでも使え
0763デフォルトの名無しさん
垢版 |
2020/04/28(火) 17:37:46.72ID:7TaGv6sC
>>759
シェルスクリプトでエスケープ処理が複雑なんて
したことがないんだがどういうケース?

むしろバッチファイルのほうがややこしすぎる
バッチファイルでダブルクォートはいつつけるか言える?
スペースが含まれたファイル名とか

バッチファイルでこれの出力結果は
echo "C:\Program Files"

↓これです。(ダブルクォート含む)
"C:\Program Files"
0768デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:35:28.46ID:C/yTg51l
>>766
俺の定義ではバッチファイルはシェルスクリプトだ

config.sysに
shell=command.com /e:1024
とか書いてたからな
0769デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:39:22.04ID:C/yTg51l
ちなみにMS-DOSにはエスケープ文字なんて無い
0770デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:40:45.75ID:f4hk4dsD
>>768
意味わかんないから調べたが、
今では全く通用しない話じゃねーかよ。

てめーの定義を押し付けんな。
0772デフォルトの名無しさん
垢版 |
2020/04/28(火) 22:38:03.31ID:0mXw36Cx
>>769
Delims句でイコールを区切り文字にしたいときはサーカムフレックスでエスケープする必要があるときがあるけどね。
0775デフォルトの名無しさん
垢版 |
2020/04/29(水) 06:34:57.98ID:bLWOmnfL
UNIXとかでshやbashがログインシェルとかインタラクティブシェルになるのと同じだよ
shやbash=cmd
シェルスクリプト=バッチファイル
シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前
0777デフォルトの名無しさん
垢版 |
2020/04/29(水) 07:15:11.82ID:sus1L+2H
>>775
> シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前

シェアならLinuxのシェルスクリプトの方が多いよ
今はsystemdに置き換えられつつあるが、起動処理の多くで
シェルスクリプトが使われていた。
各アプリのビルドなどでもシェルスクリプトは使われている。

それに対してバッチファイルは殆ど使われていない。
そもそもWindowsのコマンドは、他のコマンドの出力を読み取って
別のコマンドで処理するように設計されていない
単に呼び出すだけ。だからバッチファイルという名前になってる

例えばcopyコマンドであってもシェルスクリプトであれば、コピーが正常に終了した場合
なにも表示されないのでスクリプトとして使いやすいが
Windowsのcopyは人間用のメッセージがいちいち出る
コマンドの出力を変数に入れるだけでも大変
遅延環境変数の展開を使わなければ変数の中にメタ文字的なものが入るだけで簡単に壊れる

そもそもの設計思想がスクリプトを組むためではなく、単にコマンドを並べるという使い方を
するためだからバッチファイルはシェルスクリプトだけでなく
PowerShellスクリプトやVBScriptよりも使いづらくなってしまっている

一方、PowerShellスクリプトやVBScriptはコマンドをよびだすのが
面倒になってるので両立してるシェルスクリプトにはかなわない
0786デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:46:37.87ID:jiFNKMfo
滅茶苦茶初歩的な質問ですまん

バッチファイルからPythonスクリプト実行してPythonスクリプト側でprintした文字列をバッチファイル側で取得する方法ってある?
0787デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:51:16.63ID:cw3NlGJG
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]
または usebackq オプションの場合:
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]
0788デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:51:30.99ID:jiFNKMfo
もしくはコマンドプロンプトに出力された文字列を出所問わず取得したい
0789デフォルトの名無しさん
垢版 |
2020/05/07(木) 19:01:03.56ID:jiFNKMfo
>>787 ありがとう、いけたわ

logzero使ってるライブラリでこれやろうとすると途中で処理が止まるけど、これは他の問題かもしれんな
0792デフォルトの名無しさん
垢版 |
2020/05/07(木) 19:47:29.96ID:jiFNKMfo
logzeroさらっと調べても設定全く分からんので今回は該当部分の出力だけlogzero.infoからprintにして無駄な出力を省いた
出力取得できたのでまあよし
0793デフォルトの名無しさん
垢版 |
2020/05/07(木) 20:17:47.30ID:2gF3mugX
>>792
@echo off
setlocal enabledelayedexpansion
set n=0
for /f "tokens=*" %%i in ('py test.py 2^>^&1') do (
set IN!n!=%%i
set /a n+=1
)
set /a n-=1
for /l %%i in (0,1,%n%) do (
echo.!IN%%i!
)
endlocal
0794デフォルトの名無しさん
垢版 |
2020/05/12(火) 09:27:08.95ID:hWMQZbFi
>コマンドプロンプト入門 Kindle版

2020年にこれを出すとはチャレンジャーすぎるな
0795デフォルトの名無しさん
垢版 |
2020/05/12(火) 16:03:14.69ID:PeLhefIP
amazonで、確認すると、2019/09の出版みたいですね。
どうせなら、power shellの本出したほうが良かったかも。
0796デフォルトの名無しさん
垢版 |
2020/05/12(火) 18:45:23.48ID:NJ7uTfC9
ファイル名に「b」を含むファイルをコピーするときに
たとえば
abc.txt というファイルがあって

copy *b*.txt def.txt
がオッケーで
copy *b* def.txt
がエラーなのはなぜですか?

*は0文字以上の文字列なので
両方とも成功すると思っていたのですが
0798デフォルトの名無しさん
垢版 |
2020/05/12(火) 19:55:35.27ID:UaCqmgBQ
>>796
普通にできるけどどんなエラーが出るの?

ちなみにその書き方だと *a* が複数ある時は連結されてしまうけどな
0800デフォルトの名無しさん
垢版 |
2020/05/23(土) 20:41:18.51ID:H5g1ckea
Windows Terminal で音を鳴らすにはどうすればいいですか

コマンドプロンプトではControl-Gを出力してたんですが
Windows Terminalでは無視してくれやがります
0801デフォルトの名無しさん
垢版 |
2020/05/23(土) 22:23:07.24ID:105ldQbQ
start beep.wav
0802デフォルトの名無しさん
垢版 |
2020/05/23(土) 22:45:59.81ID:H5g1ckea
そんなんだったら

>copy con beep.cmd
echo ^G
waitfor /T 3 waiting
^Z
1 個のファイルをコピーしました。

>start /min cmd /d/c beep.cmd

とするけどもっといい手はないかなと
0807デフォルトの名無しさん
垢版 |
2020/06/03(水) 20:30:01.66ID:HabAm56l
バッチでやるような処理でも
勉強兼ねてpowershell使って処理するようにしたほうがいいですか?
0810デフォルトの名無しさん
垢版 |
2020/06/03(水) 21:04:50.01ID:mm84GRB0
>>809
どういう現場か知らないけど
Widn7 SP1 PSv2 縛り
なんて現場でPS書きたいとか思わないね。

使わせてくれる現場なら使うべきだし、そうでないならバッチをシコシコ書くしかないのよ。
0812デフォルトの名無しさん
垢版 |
2020/06/03(水) 22:11:19.84ID:JNM2fzED
PSでできること=C#でできることだからバッチとは全然できることが違うよ
PSv2でも十分バッチとは天地の差がある
0813デフォルトの名無しさん
垢版 |
2020/06/03(水) 22:22:36.62ID:5eIQQTQm
元の質問が、「バッチでやるような処理でも」なんだけどな
ちゃんと読んでるか?
0814デフォルトの名無しさん
垢版 |
2020/06/03(水) 23:24:38.53ID:Gm6SBE/O
>>809
情報量ならPowerShellの方が上だし
TechnetフォーラムならPowerShellのカテゴリーあるし
ポケットリファレンスの著者である牟田口大介まで出没している

ストアアプリのインストールとかはPowerShell必須だし
バッチのみじゃ書けない物も割と多い

処理の内容は忘れたけどバッチでやれた事を
PowerShellで書いたらキー入力を要求されて
かえってバッチの方が良かった場合もあるけど
そんなパターンは圧倒的に少ないと思う

でもウチの場合、PowerShell使いがいないから
というのが最大の理由で実務はバッチだらけ

良いか悪いかならきちんとメンテナンスが出来る物が良いであるべき

個人の感想ならばPowerShellって
バージョンが上がって非互換が出そうなので避けたい
0815デフォルトの名無しさん
垢版 |
2020/06/04(木) 09:41:35.56ID:Di3Z81qX
9x系(95/98/Me)のWindows用MS-DOSプロンプトとNT系(それ以外)のWindows用コマンド・プロンプトの違いさえ
意識していれば、バッチファイルの利用は難しくないと思う。
VBScript(WSHことWindows Script Host)の場合は9x系とNT系に関係なく、WSHバージョン5.1以降かどうかさえ
気をつけていれば概ね大丈夫だと思う。

それらに比べてPowerShellは、個人的にはハードルが極めて高い。
0816デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:05:12.56ID:iofqxoab
>>813
当然「バッチでやるような処理でも」PSなら十二分にこなせるよ
このスレで話題になるような変なクセや制限もないしね
0817デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:12:12.70ID:iofqxoab
>>814
PSはバージョン指定(-vオプション)すればそのバージョンが実行される仕組みを持ってるから互換性についてもある程度クリーンだよ
0818デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:16:33.10ID:efimIni8
BATの典型的なものとしては
シーケンシャルに
・外部アプリ呼び出し
・ファイルコピーや移動
・メッセージ表示
であって、こんなものをPowerShellで書く必要は無いし、ステップ数も余分にいる
0820デフォルトの名無しさん
垢版 |
2020/06/05(金) 09:26:58.17ID:YNSaAEsR
バッチファイル内で、複数の文字列の一部だけを羅列して、それをまとめて補完したものを変数に入れたい

具体的には
set LOGFILES=%LOG%\tech\*.dat %LOG%\prog\*.dat %LOG%\win\*.dat %LOG%\newsplus\*.dat ...
のように指定するのではなく

setlocal enabledelayed...
for %%f in (tech prog win newsplus) do (
 set LOGFILES=%LOGFILES% %LOG%\%%f\*.dat
)
のようにして、増減や修正を簡単に出来るようにしたい

したいんだけど、なんかうまく動いてくれない


何かヒントもらえますか?
0821デフォルトの名無しさん
垢版 |
2020/06/05(金) 10:14:13.82ID:YNSaAEsR
自己解決
どうやらこんな感じで動きそう

for %%f in (tech prog win newsplus) do (
 call :APPEND %%f
)

:APPEND
set LOGFILES=%LOGFILES% %LOG%\%%f\*.dat
goto :EOF
0822デフォルトの名無しさん
垢版 |
2020/06/05(金) 11:33:35.77ID:xkF+o6Lc
>>820
setlocal enabledelayedexpansion
for %%f in (tech prog win newsplus) do (
 set LOGFILES=!LOGFILES! %LOG%\%%f\*.dat
)

じゃダメなの?
0823デフォルトの名無しさん
垢版 |
2020/06/05(金) 11:53:35.34ID:YNSaAEsR
あれ?出来ますね

実は!で囲むのもやってみた(つもりだった)んだけど
(たぶん、どっか別のちょっとしたところでミスしてて)
その時はうまく動かなかったんですね

失礼しました
0824810
垢版 |
2020/06/06(土) 00:36:10.94ID:ZNTMwsEj
>>817
業務システムのくせに -v の無いPSスクリプトを Win7 上で動かしてるクソシステム、あるよ。改修したくもないけど。
PS は ver.3 で破壊的変更がなされたから、ver.2 に合わせて勉強するだけ無駄だと言われている。
core になって COM も切られたから Word や Excel ファイルへのアクセスも今後どーなんの?的な段階。

また、PS が「管理の自動化」を目指しているのに対して、バッチや WSH は「一般ユーザーの定型操作の自動化」を目指しているから方向性自体が違う。
おまけにバッチとWSHはもう仕様変更が無いという強みがある。

等価なものを個人的に PS でリライトしてみる、はいいと思うけど、本番環境に入れるのはNGかな…。
■ このスレッドは過去ログ倉庫に格納されています

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