X



【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net
垢版 |
2017/03/11(土) 13:47:11.66ID:2LSSeyH1
拡張子が .cmd または .bat のバッチファイルのスクリプティング(プログラミング)に関わる
質問,テクニック(JScript,Perl等の埋め込みなど含む),関連情報のためのスレです。

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

それ以前の過去スレ
%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/
0110デフォルトの名無しさん
垢版 |
2017/06/26(月) 00:08:20.51ID:a4kJ2YgH
DIRコマンドでは*を使って検索みたいなことが出来ますね。


【コマンド】
C:\>dir /s /b C:\Windows\System32\host*

【実行結果】
C:\Windows\System32\hostname.exe
C:\Windows\System32\dllcache\hostname.exe
C:\Windows\System32\drivers\etc\hosts


他にもっと複雑な検索も出来るのでしょうか?
0111デフォルトの名無しさん
垢版 |
2017/06/26(月) 00:10:31.02ID:a4kJ2YgH
あと「DIR /?」で出てくるヘルプにはこの機能について触れられていないのはなぜなのでしょう?こんなに便利なのに。
0113デフォルトの名無しさん
垢版 |
2017/06/26(月) 00:27:25.02ID:q7GF7ZpN
>>111
windowsXPで恐縮なんだが、Windowsヘルプ(ヘルプとサポートセンター)では、
Dirの項目の説明の中で、ワイルドカード関係のものとして以下のものが書いてあったよ

解説
・複数の filenames を使用する
 複数の filenames を使用できます。スペース、カンマ、またはセミコロンでファイル名を区切ります。
 FileName でワイルドカード文字 (? と *) を使うと、ファイルのグループを表示することができます。
・ワイルドカードを使用する
 ワイルドカード (? と *) を使うと、ファイルとサブディレクトリのサブセットの一覧を表示できます。


ドライブ C のすべてのディレクトリで、拡張子が .txt のすべてのファイルの一覧を表示するには、次のように入力します。

dir c:\*.txt /w/o/s/p

各ディレクトリにある拡張子が .txt のファイル名が、アルファベット順にソートされた一覧がワイド形式で表示されます。
画面単位で一時停止し、キーが押されると次の画面が表示されます。
0114デフォルトの名無しさん
垢版 |
2017/06/26(月) 01:37:25.73ID:q7GF7ZpN
>>111
つまりコマンドの内蔵ヘルプは簡略版ってことなんだ

それと、なんかちょっと検索してみたら
Windows10には「ヘルプとサポート」がないらしい
なのでオンラインでのコマンドラインリファレンス
https://technet.microsoft.com/ja-jp/library/cc755121%28v=ws.10%29.aspx
XPの「ヘルプとサポート」には
「コマンドラインリファレンス」の他にも、
「新しいコマンドラインツール」
「コマンドシェルの概要」(ここにパイプやリダイレクトの説明が載っている)
ってのがあったんだけどなあ
0115デフォルトの名無しさん
垢版 |
2017/07/01(土) 02:44:43.86ID:mwCfh4Ih
質問があります。
ちょっと事情があってすべての引数をダブルクオーテーションで囲って実行しなければならなくなりました。
例えばこんな感じで

"C:\Software\ffmpeg\ffmpeg.exe" "-i" "%~1" "-vcodec" "utvideo" "-acodec" "pcm_s16le" "%~dpn1_test.avi"

ffmpegでは正常に動くことを確認したのですが他の一般的なソフトウェアもこのような起動方法で動作すると考えてもいいのでしょうか?
0117デフォルトの名無しさん
垢版 |
2017/07/05(水) 22:31:01.85ID:9GxT9B4i
とあるファイルの中身の文字列を置換したいのですが、何かいい方法はありますでしょうか?
とあるファイルはtxtファイルではないですが、テキストエディタで開くと文字列が書いてあります。
0118デフォルトの名無しさん
垢版 |
2017/07/05(水) 22:46:04.03ID:R8zuGv9z
全部テキストならともかくそれ以外のバイナリファイル内の置換はcmdじゃ無理だろ
WSHとかPower Shellとかで探せ
0120デフォルトの名無しさん
垢版 |
2017/07/06(木) 01:41:06.31ID:vizsBHcK
findstr である程度のことはできるけど、置換の条件とかが複雑になってくるとしんどい。
外部コマンドが使用可能なら、onigsedとか、SEDを使った方が多少は楽。
0121デフォルトの名無しさん
垢版 |
2017/07/06(木) 02:34:32.14ID:VUvDmuBp
>>119
拡張子になんの意味があると思ってるの?
なんかそのレベルの知識だったら、メモ帳でも使った方がいいと思うよ。
0123デフォルトの名無しさん
垢版 |
2017/07/09(日) 19:10:43.21ID:Gxva3cTk
バッチファイルからシリアルポートを簡単に読み書き出来る手段って無いですかね?
古くはCOM?を使う方法が有名ですがBluetoothなどで作られた仮想シリアルポート?には使えないようです
0126デフォルトの名無しさん
垢版 |
2017/07/16(日) 11:23:45.75ID:FHjtOHLZ
そもそもバッチファイルって何?
CでもBasicでもなく、メモ帳の拡張子をbatに変えるだけで良くて、
コマンドブロンプトとかいう、MS-DOSと何が違うのかわからないような画面で動いて、
何なの?
0136デフォルトの名無しさん
垢版 |
2017/07/19(水) 00:19:58.81ID:wIP5zHZ/
とにかく>>126は色々とおかしい
どこから突っ込めばいいのかわからんくらいにアチコチおかしい

PC初心者板ならともかく、なぜム板にこんな人が居るんだ?ってレベル
迷い込んできたのか?
0140デフォルトの名無しさん
垢版 |
2017/07/19(水) 22:27:12.79ID:caLBuZR5
コピー系コマンドのコピー速度って

遅 copy < xcopy < robocopy 早

で良いですよね?
これはVista、7、10のどのOSでも同じでしょうか?
0142140
垢版 |
2017/07/20(木) 03:04:39.26ID:R4lBeVK+
>>141
コマンド打ち込むにも時間がかかりますから一理ありますね。copyは引数指定も直感的だし…


って常にコマンド手打ちする訳でもないですし!w
0146デフォルトの名無しさん
垢版 |
2017/07/29(土) 01:24:32.19ID:ocuZvBLs
@.bat や =.bat
ファイルを作ることはできるが、実行しようとしてもコマンドプロンプトに無視されて実行できなかった
0147デフォルトの名無しさん
垢版 |
2017/07/29(土) 02:07:03.67ID:0L2d7SO5
@.bat はフルパスで C:\work\@bat ってするか、キャレットでエスケープして ^@.bat で実行できる
=.bat はフルパスでもダメだけど、キャレットでエスケープすればいける
0148デフォルトの名無しさん
垢版 |
2017/08/01(火) 00:45:45.45ID:7i1X54Qd
>>147
キャレットって何かわからなかったが、^をつけることなんですね
^@ や ^= でたしかに実行できました
0151デフォルトの名無しさん
垢版 |
2017/08/14(月) 22:38:23.70ID:3xlVGOet
すみません助けてください
遅延関数を宣言してるところから、下記の親ディレクトリの名前だけ引くサブルーチンに
ファイルフルパス投げて、戻そうとしているのですが
for文のところでDEST_DIRに値が入らなくて困っています

windows7環境で遅延関数について調べているのですが
なんで値が入らないのかわからず。 %%Pをechoすると中身が表示されるのですが
それをSETするときに何をやっても入りません。。。助けてください

:GET_PARENTDIR
setlocal enabledelayedexpansion

SET PathLF=%1
SET PathLF=%PathLF:~0,-1%

SET PathLF=!PathLF:\=^

!

for /F %%P in ("!PathLF!") do SET DEST_DIR = %%P
endlocal && set DEST_DIR = %DEST_DIR%
echo %DEST_DIR%

exit /b
0153デフォルトの名無しさん
垢版 |
2017/08/14(月) 23:55:08.58ID:pZiLFUe+
>>151
これって例えばc:\aaa\bbb\ccc\test.txtってファイルを投げたら
最終的にtest.txって文字を得たいの?
cccを得たいの?
0154デフォルトの名無しさん
垢版 |
2017/08/15(火) 02:10:26.85ID:F71LHla5
>>151
まずは

SET DEST_DIR = %%P
endlocal && set DEST_DIR = %DEST_DIR%

の空白がいけないのでは?

SET DEST_DIR=%%P
endlocal && set DEST_DIR=%DEST_DIR%
0155デフォルトの名無しさん
垢版 |
2017/08/15(火) 08:22:11.69ID:ltV5IdSe
>>154
後輩にその空白を入れられたことがある
「可読性を良くしようと思って…」って言ってたな
普通の高級言語やってる奴は=の前後に空白入れただけで不具合起こるなんて考えもしないわな
コマンドプロンプトはホント昔の仕様を引きずり過ぎだわ
0156デフォルトの名無しさん
垢版 |
2017/08/15(火) 08:51:21.42ID:J2u+qflL
setlocal enabledelayedexpansion使うとファイル名に!が入ってるとめんどくさいから極力使わないようにしてるんだけど俺だけ?みんなはどうしてる?
0157デフォルトの名無しさん
垢版 |
2017/08/15(火) 08:55:13.27ID:GzAS59pw
>>155
C言語で言うマクロ置換みたいなもんだからしょうがない
もう新規の奴はPowerShellに移行するしかない
0159デフォルトの名無しさん
垢版 |
2017/08/17(木) 23:34:26.73ID:jGLnJoZN
スペースが入ったファイル名からスペースを取り除くには一行では無理ですか?
0162デフォルトの名無しさん
垢版 |
2017/08/20(日) 03:39:45.42ID:w/lVOYHU
バッチでよく使う pslist.exe はプロセス名が日本語だと間違える
pslist v1.4 sysonternals
0163デフォルトの名無しさん
垢版 |
2017/08/20(日) 16:32:29.32ID:7nn0chG1
フォルダD:\XXXX直下の、
AAAA、BBBB、CCCCの3つの隠しファイル(拡張子なし)を、
定期的にE:\backupフォルダにバックアップするためのバッチファイルを作りたい
フォルダXXXX以下には、YYYY、ZZZZというフォルダがあり、
この下にもAAAA、BBBB、CCCCと同名のファイルが存在するが、
それはバックアップしなくていい
copyコマンドでは隠しファイルはコピーできない
xcopyコマンドではサブディレクトリ以下の同名ファイルもコピーされてしまう
バッチファイルで処理するためにはどうすればいいのでしょうか?
できればアトリビュートはいじりたくないです
よろしくお願いいたします
0166デフォルトの名無しさん
垢版 |
2017/08/20(日) 17:25:05.34ID:7nn0chG1
>>165
実験してみたんですが、
xcopy D:\XXXX\AAAA E:\backup\
とすると、backupフォルダには、
AAAA
\YYYY\AAAA
\ZZZZ\AAAA
の3ファイルがコピーされちゃうんですよ
\YYYYと\ZZZZのはいらないのでどうしたもんかなと質問させていただきました
0168デフォルトの名無しさん
垢版 |
2017/08/20(日) 17:43:47.57ID:7nn0chG1
>>167
テストありがとうございます
あれ?
なんか余計なスイッチ入れるとかしちゃってたかな?
今出先なんで帰ったら再度実験してみます
0169デフォルトの名無しさん
垢版 |
2017/08/20(日) 19:15:30.58ID:T95gEh5X
>>161
cd /d "%~dp1" & set "File=%~nx1" & call ren "%%File%%" "%%File: =%%"

>>163
cd /d "D:\XXXX"
for %%i in (AAAA BBBB CCCC) do xcopy /h /y "%%~i" "E:\backup"
0170デフォルトの名無しさん
垢版 |
2017/08/22(火) 19:19:28.49ID:rIu52qT/
以前こちらで聞いて試行錯誤しているのですが、何分初心者で四苦八苦しております。
そこでご教授願いたいのですが、
@rem 引数有無と引数名チェック
if "%USR_INPUT_STR1%"=="" goto ERROR
echo;%USR_INPUT_STR1%|findstr /R /C:"^http" /C:"openrec" >NUL||(echo "%1" を処理できません) && goto ERROR

@rem URLのアドレスとHTMLを環境変数へ設定
set ADDR=%USR_INPUT_STR1%
for %%I in (%USR_INPUT_STR1%) do set HTML=%%~nxI

@rem HTMLダウンロード
curl -L --max-redirs 10 -R -O %ADDR%
if not %ERRORLEVEL%==0 goto ERROR

@rem HTMLから文字列抽出
for /F "tokens=2 delims=<>| " %%I in ('type %HTML%^|findstr /R /C:"<title>"') do set TITLE=%%~I
for /F "tokens=3 delims=, " %%I in ('type %HTML%^|find /I "m3u8"') do set TARGET=%%~I

ffmpeg -c copy "%TITLE%" -i "%TARGET%"
pause
exit

:ERROR
echo 引数が無効のため処理できませんでした
pause
exit

このままだと、ファイル名がUTF-8で文字化けしてしまいます。
これを、面倒なのでファイル名で出力したいと思ったのですが、正規表現が弱く全く前に進みません。

丸投げで申し訳ございませんが、どうか手直ししていただけませんでしょうか。
よろしくお願い致します。
0173デフォルトの名無しさん
垢版 |
2017/08/22(火) 20:52:58.84ID:rIu52qT/
>>172
それも考えたのですが、不特定多数のPCで使う機会があるので手間が増えてしまうなと思い諦めました。
そこで、URLからIDとなる文字列を抽出してそれをファイル名に使おうと考えました。
参考URL:https://www.openrec.tv/live/7cuVKOAY3lv
この末尾の7cuVKOAY3lvの部分だけを、TITLEに代入したいと思ったのですが、思うようにいかなくて・・・。
0174デフォルトの名無しさん
垢版 |
2017/08/22(火) 21:10:23.56ID:rIu52qT/
結局、実行batのディレクトリ内にnkf32を導入し、
nkf -s --overwrite %HTML%
と書き加えて対処致しました
0175デフォルトの名無しさん
垢版 |
2017/08/29(火) 14:35:48.67ID:91TLAHUR
フォルダの中に、あああ_1.flv あああ_2.flv … あああ_100.flvのようなファイルがあるときに、あああ_1.flvをあああ_001.flvのようにリネームしたりできないんでしょうか
0179デフォルトの名無しさん
垢版 |
2017/08/29(火) 20:06:42.61ID:KnTCuJQc
set "a=あああ_"
set "b=.flv"
setlocal enabledelayedexpansion
for /L %%i in (1,1,99) do set /a c=%%i+1000 & ren "!a!%%i!b!" "!a!!c:~1!!b!"
0180デフォルトの名無しさん
垢版 |
2017/08/31(木) 16:38:58.30ID:omILiWW+
>>175
pushd "%~dp1"
:LOOP
for /f "tokens=1,2 delims=_" %%a in ("%~n1") do (
set FNAME=%%a
set /a FN=%%b+1000
)
ren "%~1" "%FNAME%_%FN:~-3%%~x1"
shift
if not "%~1"=="" goto :LOOP
0181デフォルトの名無しさん
垢版 |
2017/08/31(木) 17:02:31.64ID:KsdTyPQv
>>180
変換の数字の前が_文字じゃないかもしれないし
_文字がファイル名の中に混じっている可能性もあるし
0183デフォルトの名無しさん
垢版 |
2017/08/31(木) 18:00:47.56ID:kMuf1wHV
なんでか知らないけど他人に勝手にマルチポストされたけど>>175の質問は元のスレで解決したのでもういいです
0185デフォルトの名無しさん
垢版 |
2017/09/04(月) 00:02:37.80ID:pBY/MKIa
>>184
そうならなきゃ逆にダメでしょ
setlocalでは(親の環境を引き継いだ)別の環境の上で実行されている
カレントを移動しようが環境変数を操作しようが元の環境には影響しない
pushd D:\abc
setlocal
endlocal
popd
または
setlocal
pushd D:\abc
endlocal
0188デフォルトの名無しさん
垢版 |
2017/09/16(土) 05:59:12.53ID:TbhIjs8j
>>187
このスレのタイトル見てから言えよ
それとも、お前は、自分が使ってないソフトのスレ行って
「別のソフト使え」って言って巡るのが趣味なのか?
0189デフォルトの名無しさん
垢版 |
2017/09/16(土) 06:09:12.67ID:NzFbxZfY
PowerShellに移行しようと思ったこともあるけどファイルをD&D出来ないから断念した
あと他人の環境で動くのか分からないから渡しにくいし
0190デフォルトの名無しさん
垢版 |
2017/09/16(土) 06:11:20.82ID:NzFbxZfY
まあbatに面倒臭いとこがあるのも理解できるけど
せめて正規表現と小数の計算くらいはあればよかったんだが
0191デフォルトの名無しさん
垢版 |
2017/09/16(土) 11:00:27.02ID:Nvo3nRRv
自分で使うにはPoweShellはめちゃめちゃ便利だけど
一般的に定着してるかというとそうじゃないし
0192デフォルトの名無しさん
垢版 |
2017/09/17(日) 11:17:50.05ID:jtG62g+O
PowerShell は起動が遅いから小さいバッチをループで呼び出すのには向いてないんじゃないかな。
いったんロードしたオブジェクトを関数形式で呼び出せばいいんだろうけどよくわからなくてめんどくさいし。
0193デフォルトの名無しさん
垢版 |
2017/09/17(日) 11:23:06.30ID:jtG62g+O
最近、フリーソフトとかの小さいやつの管理がめんどくさくなって
メニュー代わりにバッチファイルを使うことにしたんですよ。
全部をVHDに入れてマウントなんで、持ち運びは仮想ディスクファイル1個をコピーするだけ。
起動が素早いのがメリット。
アイコンが出ないのがデメリット。
アイコン出そうと思ったら全環境で共通のドライブ名に固定してショートカットを使ったらいいと思うけど。

プログラムの入ったフォルダ
Program Files 3

バッチファイルの入ったフォルダ
Program Link

[FirefoxPortable.bat]
set pathname1=%~d0\Program Files 3\FireFoxPortable52.0.2\FirefoxPortable\FirefoxPortable.exe
start "" "%pathname1%"
0194デフォルトの名無しさん
垢版 |
2017/09/17(日) 12:31:00.83ID:z++LvPT9
それだけならバッチ作るまでもなくハードリンクにすればアイコン問題も解決では
0196デフォルトの名無しさん
垢版 |
2017/09/18(月) 00:06:56.51ID:AVBMNnfo
短いファイル名に関していくつか質問

1 短いファイル名はダブルクオーテーションで囲まなくても実行可能?
2 短いファイル名は取得して一ヶ月経っても変動せずにそのパスを実行出来る?
0197デフォルトの名無しさん
垢版 |
2017/09/18(月) 23:50:36.04ID:2dThcY7y
>>196
「1」は、多分可能
「2」は、他にファイルが出来なければが前提かと

「dir c:\*1」と「dir c:\*1 /x」を実行して挙動を確かめて下さい。
0198デフォルトの名無しさん
垢版 |
2017/09/19(火) 00:09:36.87ID:I5t298fo
少なくともNTFSではファイルの情報としてショートファイルネームも格納されるから
ファイルが存在したままある日突然名前が変わることはないはず

そのファイルを削除して似たようなロングファイルネームの別のファイルを作った時
同名だけど別のファイルが出来てしまう事はありえる
0199196
垢版 |
2017/09/19(火) 01:33:17.50ID:FIGNw+kF
レスありがとうございます。
ちなみに自分がやりたかったのは↓と同じケースで自作のbatをタスクスケジューラに登録したいというものでした。

schtasksで半角スペースを含むパスを実行させたい (DOSプロンプト活用相談室LOG)
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/taskkillstart/at/4-0842.html

"を\"と書いてエスケープさせるやり方もあるようですがそちらではbatにダブルクォーテーションで囲った引数を渡すと不可解な動作をすることがあり上手くいきせんでした。

batのパスにスペースを含んだ場合 起動しない
batのパスにスペースを含まない場合 %~dp0を実行したときにbatのフォルダパスの頭にカレントディレクトリの文字列も追加される
0200デフォルトの名無しさん
垢版 |
2017/09/19(火) 02:17:59.79ID:Lhe/hdFe
mklinkやsubstを使って違う名前でアクセスするのはどうなのでしょう
うまくいくかどうかわかりませんが

ファイル名フォルダ名に空白や%^!みたいな記号があると困ることが多いですね
0201デフォルトの名無しさん
垢版 |
2017/09/20(水) 03:12:37.88ID:aIPv0JYK
>>199
この書き方に準じていないだけでは?

A Scheduled Task Does Not Run When You Use Schtasks.exe to Create It and When the Path of the Scheduled Task Contains a Space
https://support.microsoft.com/en-us/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

Schtasks.exe を使用して、スケジュールされたタスクのパスにスペースが含まれている場合を作成するときにスケジュールされたタスクが実行されません。
https://support.microsoft.com/ja-jp/help/823093/a-scheduled-task-does-not-run-when-you-use-schtasks-exe-to-create-it-a

失敗例
schtasks /create /tn "my task" /tr "c:\foldername containing spaces\script.bat arguments" /sc once /sd 07/29/2003 /st 10:01

成功例
schtasks /create /tn "my task" /tr "\"c:\foldername name containing spaces\script.bat\" arguments" /sc once /sd 07/29/2003 /st 10:01
0202196
垢版 |
2017/09/20(水) 06:44:59.65ID:w13Y3qRA
>>201
自分の説明が下手で伝わらなかったんだと思いますが、成功例の方の記述でパスにスペースを含むbatは起動できるのですがそのbatにダブルクオーテーションを含む引数を渡すと動作がおかしくなるのです。
引数にダブルクオーテーションを含まない場合は正常に起動できます。
0203196
垢版 |
2017/09/20(水) 07:01:29.72ID:w13Y3qRA
一応追記しておくと、おかしくなるのはタスクスケジューラから起動した場合限定で通常の起動では問題ありません。
呼び出すbat内の記述にミスがあるとかそういうのではないと思います。
0208デフォルトの名無しさん
垢版 |
2017/09/24(日) 20:04:30.28ID:0vysq0yQ
基本的に引数の中の半角スペースはデリミタであり
そこより左に " が奇数個あればデリミタじゃなくなる

それに関しては \" とか ^" とかあっても関係ないんじゃね
0209デフォルトの名無しさん
垢版 |
2017/09/25(月) 14:27:46.65ID:aNTDK6ge
>>207
もう見てないかも知れないけど

schtasks /create /tn "test\test" /sc once /st 23:00 /tr "cmd /s /c \"\"C:\schtasks test\schtaskstest.bat\" hoge1 hoge2 \"ho ge3\" \"h oge4\"\""

これだと実行ファイルのパスにスペースがあっても問題ない
■ このスレッドは過去ログ倉庫に格納されています

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