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/
0689デフォルトの名無しさん
垢版 |
2020/01/26(日) 21:47:29.72ID:Nyn5xlpx
2つのウィンドウで別フォルダを表示してファイル存在の有無によって選択/解除ができその後コピーや移動ができる、そんなファイラーがあったら便利だなと探してました。
WinZIP関係のソフトで7-zipというのがあり、なぜか解凍するとその中に7-zip file managerというのが入っていて
起動してみると左右で別フォルダを表示することができオッ、と思ったのですが、存在を比較する機能はありませんでしたorz

ファイル存在比較 で検索したら 【バッチ作成】の文字が目にとまりページを開くと次のようなバッチファイルでした。コピー/移動作業前の確認用に
便利だなと思いました。実際はif existでもいいし、自分用に少し書き換えました

@echo off
echo AにあってBに無いファイル
pushd \A
for %%X in (*) do if not exist \B\%%X echo %%X
popd
echo BにあってAに無いファイル
pushd \B
for %%X in (*) do if not exist \A\%%X echo %%X
popd

popd、pushdってアスキーのラーニングシステムシリーズ本のMS-DOSのやつで最初に書かれていたんだけどまったく使わないわなんて思ってそのままでした。
0690デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:31:16.84ID:Jc09ZNe5
そんなことまで無理にcmdでやらんでも・・・

WinMergeすら入れさせてもらえない環境なのか?
0692デフォルトの名無しさん
垢版 |
2020/01/28(火) 22:49:16.68ID:lbmGsP+l
"送る"って意外と不自由なんだな…
バッチファイルでワンクッション入れて(゚д゚)ウマー
0694デフォルトの名無しさん
垢版 |
2020/01/30(木) 20:40:29.71ID:6k+E856c
このバッチで何か入力しても a が消える

@echo off
set /p a=data=
rem %a=%
echo data=%a%
pause
0695デフォルトの名無しさん
垢版 |
2020/01/30(木) 22:45:14.45ID:VR7HU+gm
>693
勉強不足があるかも知れんが
・さっさと画面を閉じちゃう(cmd/kで回避)
・%1に入れてくれない
・ファイル名の後ろにオプションが付けられない
0696デフォルトの名無しさん
垢版 |
2020/01/30(木) 23:26:29.39ID:D5cDwkr0
ワンクッションってそういう意味か
昔からスクリプトを送るに登録することなんて当たり前のことだったけどね
むしろexeしか登録しない人はこのスレにはいないとまで思ってた
0697デフォルトの名無しさん
垢版 |
2020/01/31(金) 11:16:38.40ID:JWfC0/9e
>>694 何かエラーすると正常になるよ(笑)

@echo off
set a=123
rem %a=%
if defined a (echo 1) else echo 0
echo a=%a%
nul 2> nul
if defined a (echo 1) else echo 0
echo a=%a%
pause

結果

0
a=
1
a=123
0698デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:23:32.44ID:62ExnvKA
叩いたらスクリーンセーバーをオフにしたく、killでスクリーンセーバーのscrファイルを終了させるバッチを作ったんだけど、Windows10のタブレットモードで動かすとスタートメニューが起動してしまう。
元々立ち上げてたソフトを表示したいんたけど何か良い方法ないかな?
ソフトを立ち上げっぱなし→スクリーンセーバー起動→条件下でスクリーンセーバーkillバッチ→立ち上げてたソフトに戻る
ってのにしたいのにkillバッチ→スタートメニューになってしまう

あと、バッチを走らせると一瞬黒いcmd画面がでるのでvbs経由で画面を出さないようにしようとしたけどこちらもうまくいかない…
0699デフォルトの名無しさん
垢版 |
2020/02/10(月) 13:13:43.33ID:0DoxGo8j
スクリーンセーバー動いてるのに、
どうやってバッチ叩いてんの?
さっぱりわからん
0702デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:11:28.69ID:DSTYXSth
特定のキー操作で解除するタイプのスクリーンセーバーなのかな?
でもそれならそれでkillするんじゃなくて該当のキーを送ればよいだけな気がするけど
0703デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:51:57.47ID:hksaF/sY
Windows7標準のmklinkでシンボリックリンクを作ると
リンクのタイムスタンプ(作成、更新、アクセスいずれも)は
リンク先ファイルのタイムスタンプに関係なくリンク作成時点のものになり
普通のファイルのようにはタイムスタンプを変更できないようだけど
変更する方法ある?

ハードリンクなら同じものを見ることになるから勝手に揃うけど
使い分けの方針が定まらなくてあまり使ってない
0704デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:47:43.79ID:9k84sg+E
>>703
シンボリックリンクの実体はファイルだからSetFileTimeで変更できるらしいぞ
らしいってのは俺がシンボリックリンクつかったことないからね
0705デフォルトの名無しさん
垢版 |
2020/02/14(金) 23:11:39.08ID:2Mmdz3hG
Windows Vistaは2017年にサポートが終了しましたがWindows Server 2008向けのセキュリティ更新プログラムを手動でインストールすることができていました。
ところがどの順番でどれをインスコすればいいのか面倒、、、それを解決するバッチプログラムを作った方がいます。
バッチファイルの記述がフムフム、へぇ〜という感じで自分にはとても勉強になりました。興味ある方はどぞ

創造の柱
http://blog.livedoor.jp/pillars_of_creation/archives/1831755.html
0706デフォルトの名無しさん
垢版 |
2020/03/24(火) 10:56:05.36
このスレで聞くべきなのか分かりませんが、Windowsで数千個のPDFを一括処理したいので、取りあえずここで聞いてみます。

PDFをAcrobatで開いた時のプロパティ(「文書のプロパティ」で、"表示"、"ページレイアウト"、"倍率"を設定できますが、
1つ1つ手作業で設定するのはさすがに無理です。
Javaの様なプログラミング言語でも、他のアプリでも何でもいいんですが、この文書のプロパティを一括で設定する方法って何がありますか?
0708デフォルトの名無しさん
垢版 |
2020/03/24(火) 19:52:05.20ID:LC2xv/4E
変更前後のAcrobatのレジストリをエクスポートしてdiff比較してどこが変わってるか確認するのが最初にやることだろうね
0710デフォルトの名無しさん
垢版 |
2020/03/24(火) 20:53:17.46ID:k6OnWQi4
そもそもPDF側に表示方法が保存されてるものなの?
結局Acrobat側の問題じゃない?
0711デフォルトの名無しさん
垢版 |
2020/03/24(火) 22:35:05.89ID:tH0Sn0AY
「pdf コマンドライン ページレイアウト」でググったら
cpdf (Coherent PDF Command Line Tools) を紹介するサイトが出てきた
これ、見開きを縦スクロールにしたり単ページにしたりできて面白い
"倍率" が 2017/10 の時点で無理らしいけど
0712デフォルトの名無しさん
垢版 |
2020/03/26(木) 01:20:56.78ID:3WOBAGMl
ID消して質問してるのがすげー腹立つな
本当に解決を望んでるなら逆にコテ付けるぐらいできんのか
0714デフォルトの名無しさん
垢版 |
2020/04/18(土) 11:05:03.45ID:6HUykZ9A
今でもたまに使うけどUTF8系のスクリプトとの相性がめっちゃ悪いな
いちいちコードページ指定するとなんかウィンドウが切り替わって重いし

cmdをchcp 65001 (UTF8)で常用するって現実的じゃないよね?
0716デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:57:49.71ID:VodBEB+r
例えば、こんなバッチをutf-8で作成して実行する。
できたtest.txtを見たら1行しかない。なんでだ。
@echo off
chcp 65001
call :test > test.txt
exit
:test
echo テスト
echo テスト
0717デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:12:48.44ID:fYZW+FI9
このスレで、utf-8 のバッチファイルにするなら、
行末は半角英数な文字にしとけ
というのを学んだ、>>262 からの流れ

なんでなのかはいまだに知らない
0718デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:22:50.42ID:D5FH+wQt
2つめのechoがエラーになってるね

echo テスト

echo テスト
と間に空白行を挟めば正常だがどういう理屈なのか分からん
0720デフォルトの名無しさん
垢版 |
2020/04/21(火) 19:56:52.87ID:vK3trFFL
%2つというのは、何らかのエスケープですか?
また、forを使うときにfor %iなどとしますが、%の意味がよくわかりません
0721デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:11:11.38ID:vK3trFFL
フォルダ内のファイルを連番つけてリネームする方法はわからないでしょうか
forを使用してインデックスを連番として付与する感じだと思うんですが

ファイルはこんな感じです
犬.txt
猫.txt
猿.txt
0722デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:17:03.32ID:FdhLTsrP
>>720
%は互換性や拡張などのおかげで大変ややこしい事になっている
説明するには小一時間かかるのでここでは控える事にする
0724デフォルトの名無しさん
垢版 |
2020/04/21(火) 22:46:58.98ID:HADG6GDb
>>721
Ruby で作った。
ただし、DryRun なので実際には実行されません。
001.txt, 002.txt に変わります

require 'fileutils'

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
dir_path = "C:/Users/Owner/test/*"
target_dir = File.dirname( dir_path ) # ディレクトリパスだけを取り出す

Dir.glob( dir_path )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.each.with_index( 1 ) do |full_path, idx| # index は、1 から始まる

# format で、0埋め3桁表示にする。extname は拡張子
# ファイル名は、001.txt, 002.txt など
dest_path = target_dir + "/" + ( "%03d" % idx ) + File.extname( full_path )

FileUtils::DryRun.move( full_path, dest_path )
end
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
もしくはコマンドプロンプトに出力された文字列を出所問わず取得したい
■ このスレッドは過去ログ倉庫に格納されています

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