【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>301-302
コマンドのバグ ⇒ 全世界のユーザーに影響出るから下手に直せない
コマンドのヘルプの文言誤り ⇒ 優先度低いのでなかなか直さない
ってことかなるほど。 >>313
cscriptで自身を実行する外見バッチ中身WSHみたいなんもあるにはあるし… >>313
元を辿ってみると、>>297が話を逸らしたせいだ
そこからどんどん逸れてvbに行き着いた
>>315
batに埋め込めるのはjscript(条件コンパイルの構文がbatとうまい具合にかみ合った)だけでvbscriptは無理 >>317
wsfの手があったか、あとjsでもスクリプトエンコードで書けばなんとかなるね powershellで似たような事はできませんか?
1ファイルにしたくて どうしても分からないので質問致します。
@echo off
@rem バッチファイルのディレクトリに移動
cd /d %~d0%~p0
set USR_INPUT_STR1=https://www.openrec.tv/live/fKGMub0cd6j
@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 Shift-JISに文字コード変換
nkf -s --overwrite %HTML% set TARGET=%TARGET:playlist=chunklist%
@rem ffmpegで動画吸い出し
ffmpeg -c copy "%TITLE%.ts" -i "%TARGET%"
@rem 最後にcurlで出力したソースファイルを削除
@rem for /R %%f in (*.) do del /Q "%%f"
pause
exit
:ERROR
echo 引数が無効のため処理できませんでした
pause
exit
このようなbatファイルを作ったのですが、どうしても最後に
sourcefile=https://station303.openrec.tv/live1/667d4bef5cb4af8db6b9198cab7b3148e957e477/chunklist.m3u8: Invalid argument
と無効な引数と言われてしまい動画の吸い出しが出来ません
完全に手詰まりなため、丸投げにはなってしまいますがご教授いただければと思います
よろしくお願いします >>322
とりあえず最初の行を
rem @echo off
にしてどこでエラーになってのか確認しろよ >>322
これ途中の処理抜けてない?
TARGETにURLが入らないんだけど 170のやつを適当に書き直したら動いたよ
for /F tokens^=2^ delims^=^" %%I in ('type %HTML%^|find /I "data-sourcefile"') do set "TARGET=%%~I" >>322の最初が抜けてました・・・
@rem HTMLから文字列抽出
for /F "tokens=2 delims=<>| " %%I in ('type %HTML%^|findstr /R /C:"<title>"') do set TITLE=%%~I
for /F "tokens=* delims=data-file= " %%I in ('type %HTML%^|find /I "playlist.m3u8"') do set TARGET=%%~I >>325
ありがとうございます・・・
エラーを見たのですが、なぜかsourcefile=が付いてしまっていました
何度もありがとうございます echo abc 1>x1 1>x11 2>x2 3>x3
とするとDOS窓が応答しなくなった
x11 x2 x3 ファイルができるが x1ファイルはできない compフォルダ配下にはa,b,c,…ってフォルダがあって、
そのフォルダの中にはzipとrarの圧縮ファイルがある
compopenってフォルダを作って、compの中のフォルダ階層は変えないで、compopenフォルダ内のaやb,cのフォルダにそれぞれすべて展開させたいときってどうするの?
zipやrar毎にフォルダ作って展開させたい
D:/
├comp/
│ └ a/
│ └ 111.zip
│ └ 222.zip
│ └ b/
│ └ xx1.rar
│ └ xx2.rar
│ └ c/
│ └ ttt.zip
│ └ rrr.rar
D:/
├compopen/
│ └ a/
│ └ 111/
│ └ 222/
│ └ b/
│ └ xx1/
│ └ xx2/
│ └ c/
│ └ ttt/
│ └ rrr/ >>329
>>12-19の方法で相対パスを取得すれば出来ると思うよ 自分用に書いたbatを流用してみた
多分こんな感じで動くはず
https://pastebin.com/zEpvpdCa >>329
set "a=D:\comp" & set "b=D:\compopen"
setlocal enabledelayedexpansion
for /L %%i in (4,1,1000) do if "!a:~%%i,1!"=="" set "c=%%i" & goto x
:x
endlocal & set "c=%c%"
for /r "%a%" %%i in (*.zip *.rar) do set "d=%%~dpni" & set "e=%%~i" & call :y
goto :eof
:y
setlocal enabledelayedexpansion
7z x -o"!b!!d:~%c%!" "!e!" >>332
なるほど
自分のは冗長に書きすぎてたね >>329
使い回しあんまり考えなければ
-------- ここから
set path=C:\Program Files\7-Zip;%path%
cd /d D:\comp
for /f "usebackq delims=" %%i in (`dir /ad /s /b`) do (
echo,"%%~i"
set "tmppath0=%%~i"
call set "tmppath1=D:\compopen%%tmppath0:~7%%"
pushd "%%~i"
call 7z.exe x *.* -spe -bso0 -o"%%tmppath1%%\*" 2>>D:\compopen\errlog.txt
popd
)
-------- ここまで
マズいフォルダ(パス)名が無いことを前提に、もろもろ 7-Zip に良きにはからってもらう >>332
>>334
ありがとうございます!
150GBくらいあるから、まだ展開し終えてないけど、
動き出しました。
実際のcompの中のa,b,c,・・・フォルダの中のzipやrarの名前は、
今のところ、下記みたいにフォルダの文字列含んでて、階層を上にしてもよかったかなと思いつつ、
例外も出てくるかもしれないので、このまま走らせてみます。
しっかり解凍しだしてフォルダ生成してくれてます。
D:/
├comp/
│ └ a/
│ └ a111.zip
│ └ a222.zip
│ └ b/
│ └ xx1b.rar
│ └ xx2b.rar
│ └ c/
│ └ cttt.zip
│ └ crrr.rar そもそも、そんな複雑な手続きには、PowerShell, Ruby などを使えw コマンドプロンプトの仕様についてだけど、遅延展開ってデフォでONじゃダメだったのかな?
あれ打ち込むのマンドクサ('A`) 1.test.exeという実行ファイルがある。
2.test.exeのフルパスは必要に応じて「test.exeをShift+右クリック」→「パスをコピー」して変数testExeに格納してもらう。
このフルパスには"D:\a bc\test.exe"のように空白が含まれることがあるとする。
3.FOR文でこのtest.exeを--helpオプションつきで実行し、結果からfindstr&setしたい。
---作成バッチ---
@echo off
cd /d %~dp0
set testExe="D:\a bc\test.exe"
FOR /F "tokens=3" %%a IN ('%testExe% --help ^| findstr "TargetStr"') DO (
set kekka=%%a
)
@echo %kekka%
pause
---実行結果---
'D:\a' は、内部コマンドまたは外部コマン ド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
---解1---
testExeを設定する際、全体をダブルクォートで囲むのではなく、
空白を含むフォルダだけをダブルクォートで囲むようにする。
set testExe=D:\"a bc"\test.exe
解1はtestExeの設定が地味に面倒になってしまうので回避したいのですが、何か良い方法はないでしょうか? >>338 追記
パスに空白を含む場合も問題ですが、
set testExe="D:\abc\test.exe"
のように空白を含まない場合には
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
と言われてエラーになるので、それも含めてなんとかしたいという点を書き忘れていました。
「FOR文でフルパスでコマンドを実行したい場合、どうすればよいのでしょう」というのが根本的な質問です。 すみません。>>338-339ですが、直接フルパスで実行するのではなくフォルダに移動して実行することで一応解決しました。
---
@echo off
cd /d %~dp0
set testExe="D:\a bc\test.exe"
FOR /F "tokens=1 delims=" %%I IN (%testExe%) DO (
IF "%%~nxI"=="test.exe" (
pushd "%%~dpI"
FOR /F "tokens=3" %%M IN ('.\%%~nxI --help ^| findstr "TargetStr"') DO (
set kekka=%%M
)
popd
)
)
@echo %kekka%
pause
---
問題点や、もっとスマートな方法があれば、教えていただけると助かります。 >>338
@echo off
cd /d %~dp0
set testExe="D:\a bc\test.exe"
for /f "tokens=3" %%a in ('start /wait /b "" %testExe% --help ^| findstr "TargetStr"') DO (
set kekka=%%a
)
@echo %kekka%
pause >>338
自分もこの問題に直面して同じ解決策とったんだけどこれって何が原因でこうなるの? こっちのがいいかも
前に似たようなネタがあったような
set testExe="D:\a bc\test.exe"
for /f "tokens=3" %%a in ('cmd /s /c "%testExe% --help | findstr "TargetStr""') do ( >>341
できました!なるほど、startを使えばよかったのですね・・・。ありがとうございます。
>>342
なんなんでしょうね。仕組みがよくわからないです・・・。どなたか解説を・・・。 やっぱり >>343 の cmd はダメだな
testExe や TargetStr の中のスペースがデリミタ扱いされる
スペースが2個以上続くと誤動作する
>>341 の start がいい >>343 >>345
重ねてありがとうございます。
cmdの場合は以下でうまくいくようです。
set testExe="D:\a bc\test.exe"
FOR /F "tokens=3" %%a IN ('cmd /c %testExe% --help ^| findstr "TargetStr"') DO ( やっと思い出したぞ裏技w
前後の端にダミーの二重引用符 ^" を付けるんだった
>>347 のおかげで思い出したぜ
set testExe="D:\a bc\test.exe"
for /f "tokens=3" %%a in ('^"%testexe% --help ^| findstr "targetstr"^"') do ( >>347-348
できました。なるほど、そういう解釈がされるんですね・・・。
バッチってほんと思わぬところでひっかかりますよね。とても勉強になりました。ありがとうございます。 VBでプログラムを作っているのですが、行き詰ってしまったので質問させていただきます。
バッチでiniファイルを読み込み、iniから取得したデータを格納した変数をVBのソース内で使いたいのですが可能ですか?
exe形式での納品となるのでiniファイルの読み込みはどうしてもバッチ内で行いたいのです。
ちなみに処理の流れとしては、iniファイル読み込み→exeファイル実行となっています。
どなたかご教授ください。よろしくお願いいたします。 申し訳ございません。
バッチでiniファイルを読み込み、iniから取得したデータを
格納した変数をVBのソース内で使いたいのですが可能ですか? ×
VBのソース内の変数に格納したいのですが可能ですか? ○
でした。 バッチで、ini ファイルを読み込み、必要な値を取り出して、
それらを引数にして、exe を起動する
そして、exe 内では、引数から読み込んだ値を使う >>352
どう調べたらいいか分からず困っていたのですが、引数の取得で検索すればなんとかなりそうですね。
後は自分で調べてやってみます。ありがとうございました。 バッチだと for文を使います
複雑なことをするのであればVBで直接読み込む方法もあります バッチでiniファイルなんて読み込めるの?
VBとかからGetPrivateProfileStringとかのAPIを使うんじゃないの?
まあ力技で出来ないことはないんだろうけど自分が知らないだけで一般的なやり方というのがあるのかな? ググればふつうに出てくるようだが。(内容まではちゃんと見てない) >>355
>>354の言うようにfor文を使う
わかりやすいとは言えないし特殊文字が含まれると色々面倒なのでおすすめはしない バッチファイルでファイル操作って一見ちゃんと動いてるように見えて穴だらけって場合が多いからやりたくないな
wshで実装したりps辺りで既存のAPI呼び出す方がいい batで設定呼び出したい時はiniじゃなくてsetting.batに変数を直接記述してcallしてるわ
このやり方も良いやり方なのかどうか分からんけど http://ascii.jp/elem/000/001/630/1630041/
Windows 10 RS4に追加された「curl」と「tar」コマンド
って curl と tar が追加されるんだ
PowerShell にも curl コマンド(エイリアス)があってややこしさが増すな
でも、標準で使えるようになるのはバッチファイル使ってる身とすれば
嬉しくはある ファイル圧縮バッチを
hta の画面にドロップするだけで実行するやつ作った
https://medaka.5ch.net/test/read.cgi/csaloon/1518353191/843-846
ファイルをバッチファイルにドロップして引数受け取りは普通にあるけど
ファイル名の一部を文字列としてドロップしても起動されないのでこういう方法を取った。 >>360
Windows10 なら、WSL で、MS Store から、Ubuntu 16.04 LTS をダウンロードすれば、
curl, tar も入っている
他のLinux のコマンドも、一杯ある 普通に使える
ubuntu run curl --help Linux(Ubuntu)側のbash、Windows側のPowerShell・コマンドプロンプトから、
相互のアプリ・コマンドを実行できる
相互のパイプも、つなげられる
つまり、Linux側のbashは、Windows10 の1つのアプリになっている > Ubuntu 16.04 LTS をダウンロードすれば、
この手の前提条件が無いことがバッチのメリットなのに... >>363
Web開発テスト用の範囲を超えてない。
当のMSが「運用には使ってくれるな」つってるのによ。
お前馬鹿か?馬鹿だろ。 >>368
WSLはウェブサービス開発で使って、
実際にそのウェブサービスを動かす(=運用)するのは
ネイティブなLinuxの上だぞ。例えばAzure上のLinuxとか
運用に使ってくれるなっていうのは、WSL上でウェブサービスを動かして
実際に不特定の人にサービスを提供するなっていう意味だ WSL 上で、Webサーバーとかを常時接続させて運用できない
まあ最初から、自分のデスクトップPC を外部につなげて、
そんなサービスをする奴は、居ないだろ >>370
端末のスタートアップスクリプトに使うのも用途外。
だから「使える」とか言うのは明らかに言い過ぎ。
お前馬鹿か?馬鹿だろ。 >>373
> 端末のスタートアップスクリプトに使うのも用途外。
端末のスタートアップスクリプトの話なんかしてないんだが、
何を言い出してるんだ? そもそも端末のスタートアップスクリプトの
意味わからねぇw
>>372
運用っていうから悪いんだよ。
「一般ユーザーに対してのウェブサービスの提供」
MSが使うなって言ってるのはこれだけだよ うん、ちゃんとFAQに書いてあったね
https://docs.microsoft.com/en-us/windows/wsl/faq
> Also, even though you will be able to run many popular server applications (e.g. Redis),
> we do not recommend WSL for server scenarios ? Microsoft offers a
> variety of solutions for running production Ubuntu workloads in Azure, Hyper-V, and Docker.
サーバーアプリケーションを実行できるが、サーバーとしてのシナリオは推奨してないと もう一つ、誰のためのものですか?という質問には
> Who is this for?
> This is primarily a tool for developers --
> especially web developers and those who work on or with open source projects.
第一に開発者、特にウェブ開発者やオープンソースプロジェクトを行ってる人
> This allows those who want/need to use Bash, common Linux tools (sed, awk, etc.) and
> many Linux-first tools (Ruby, Python, etc.) to use their toolchain on Windows.
bashや多くのLinuxツールや言語を使いたい人のためのものと Windows のコマンドプロンプトから、
wsl bash -c "echo 'hello'"
出力結果 : hello
これぐらいのLinux の起動・実行・終了は、1秒!
定時処理ぐらい楽勝
サーバーみたいに常時実行しなければ大丈夫 >>377
wsl.exeを使うなら bash -c はいらないぞ
wsl echo hello でよい
wsl echo --help と wsl /bin/echo --help の実行結果が違うから
wslの中ではbash上で動いているっぽい
wsl ps axfu やってもbashいないんだけどな
まあ詳しい人に聞けば、そこら辺の動きは知ってるだろう。
あと、別にLinuxは起動してるわけじゃないのでLinuxの起動と書かれると違和感がある。
WSLはLinuxカーネルを模したサブシステム Windows のコマンドプロンプトで、
>where wsl
C:\Windows\System32\wsl.exe
>where ubuntu
C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps\ubuntu.exe
wsl, ubuntu(Linux), bash の関係がよくわからない
漏れのノートPC は、i3、メモリ8GB、SSD だけど、
Windows10 の単なるアプリだから、起動・実行・終了で、1秒ほど
WSLは、もう正規版だし、単なるアプリとして使う分には、問題ないだろ 書き忘れた
Windows のコマンドプロンプトで、
>where bash
C:\Windows\System32\bash.exe Windows のコマンドプロンプトで、
>wsl echo hello
>ubuntu -c "echo hello"
>bash -c "echo hello"
これらは皆、hello が出力されるけど、書き方が異なる
wsl では、echo がサブコマンドになっているのかも >>379
俺もちゃんと調べたわけじゃないけど、
開発の歴史からすると、
最初はbash on ubuntu on windowsという扱いで
bash.exeでUbuntu上のbashが起動できる(おまけでLinuxコマンドも使えるよ!)という扱いだった。
このbashが起動できるという仕組みを提供しているものの名前がWindows Subsystem for Linuxだったわけだが
開発が継続しLinuxカーネルとの互換性があがってもうbashだけが起動するもんじゃないよねってことで
Windows Subsystem for Linuxの略であるwslと呼ばれるようになり。
wsl.exeができた(おそらくbash -c "コマンド" と面倒な書き方をしなくて良いラッパー)
それと前後して、ubuntuだけじゃなくopenSUSEやFedoraも動くよ!(いやFedoraまだリリースされてないんだが)
ということになり、bash.exeやwsl.exeで起動するのはどっちのディストリよ?
ってことでそれを切り替えることができるwslconfig.exeができた。
また直接wslconfig.exeの設定によらず、ubuntuやopensuseを直接起動するための
ubuntu.exe やopensuse-42.exe が出来た。
こんな所だと思う なんでバッチスレでパソコン博士がWSLでイキってるの? >>381
ubuntu /?をするとわかるが、
ubuntu run echo helloが正しい
ubuntu.exeもwsl.exeもbash.exeもパラメータの扱いが違うだけで
ディストリ上のbashを実行していることは確かなようだ >>383
Windows 10において、バッチファイルでWSLと連携するのは
当たり前の話になってきているから ubuntuは
Usage:
<no args>
- Launches the distro's default behavior. By default, this launches your default shell.
と書いてあるから、bashじゃなくてデフォルトシェルが呼び出されるのかも。
うーん、どれを使うのが良い(汎用的)なのだろう? wsl(Linux のbash)・PowerShell・コマンドプロンプトの3つが、
パイプでもつなげられるし、シームレスになってきて、CUI が統合されてきているから、
個別の話よりも、3つのCUI をパイプでどうつなげるかの方に、
話の焦点が移ってきている bash は、C:\Windows\System32\bash.exe を起動する
ubuntu は、bash, zsh など、自分がデフォルトに設定した、シェルを起動する。
環境変数、$SHELL
>wsl echo $SHELL
/bin/bash
wsl コマンドが、ubuntu, open suse など、
自分がデフォルトに設定した、Linux を起動
>wslconfig /list
Windows Subsystem for Linux ディストリビューション:
Ubuntu (既定)
推測で書いたけど、普段は、wsl を使うと良いかも >>383
オモチャ買ってもらった子供が「見て見てこれすごいんだよー」って言ってるような感じ
暖かく見守ってやれ >>389
WSL出た頃なら仕方が無いが...
やっぱパソコン博士レベルだと今頃になってやっとおもちゃを見つける感じなのか。 へへーん、ぼくなんてまえからもってるもんねー
それはすごいねー w さすがにスレチだからもうやめとけと思うけど、WSLについて少し調べてみようと思うきっかけにはなったわ。 パソコン先生に恨みでもあるのかな?
そんな話をしてもバッチファイルを書く上で
何の意味もないと思うんだが、話をしたいのだろうね >>390
Bash on Ubuntu on Windowsは、早く使いたかったんで
Inside Previewに変えてまで使ったよ。
GUIアプリには対応していないって書いてあったが仕組み上
GUIアプリ動くんじゃね?ってそこの頃はまだ情報が少なかったけど
実際に自分で試してxeyes は動いたーって2ちゃんねるに書いた記憶がある 自分語りとか余計なことをダラダラ書き連ねるから嫌われるんだよ。 嫌うのは相手の問題だからどうしようもない
俺に対する勘違いは、俺の問題だから解決する必要がある 例えば「aaa」という名前のODBCの設定は以下のコマンド
reg query HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa
を実行すると
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa
Driver REG_SZ C:\WINDOWS\system32\SQLSRV32.dll
Server REG_SZ aaa
Database REG_SZ aaaDB
LastUser REG_SZ *****
Trusted_Connection REG_SZ Yes
のように表示できますが
この設定の接続先データベース(上記ではaaaDB)をコマンドで変更することは出来るのでしょうか? reg add HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\aaa /v Server /t REG_SZ /d bbbDB
とかでだめなん >>400
「/v Server」は「/v Database」の間違いですよね?
これでバッチリいけました。ありがとうございます! windows10 のコマンドプロンプトの、文字色を変えるエスケープシーケンスで、
prompt ^[[1;36m[$d$s$t$h$h$h] ^[[1;33m%USERNAME% ^[[37m$p$_$g$s
prompt $e[1;36m[$d$s$t$h$h$h] $e[1;33m%COMPUTERNAME% $e[37m$p$_$g$s
echo ^[[1;36mバッチファイル^[[37m
は動作しますが
echo $e[1;36mスクリプト$e[37m
だと駄目でず。
( ^[ は、CTRL+[ で入力する制御文字(\x1B))
echo で有効な「$e」の様な入力方法は有りますか? バッチファイルで
空行を除く最終行にhogeって文字がなかったら追加して改行
-- hogeとかになってたら削除してhoge追記して改行
って事をやりたいんですけどどうやったらできるかおせーてください Ruby で作った
require 'stringio'
ary = []
File.open(ARGV[0]) do |io|
text = io.read
text.rstrip! # 末尾の連続した空白を、すべて削除する
sio = StringIO.new text
ary = sio.readlines # 全行を配列に読み込む
if ary[-1] == '-- hoge'
ary[-1] = "hoge\n"
elsif /hoge/ !~ ary[-1] # hoge を含まない
ary[-1] += "hoge\n"
else
return
end
end
# 一旦ファイルを削除してから、書き込む
File.open(ARGV[0], 'w') { |io| io.write ary.join } >>405
あのーバッチって聞いてるのにrubyのスクリプト出されても困るんですけど やらなくても言い余計なことをして場を混乱させる人って必ずいるよね ロジック真似すればいいだけじゃん
作ってくれじゃなくて教えてくれなんだから
Lispで回答されて読めないのは理解できるが
上のRubyくらいなら何の問題もないだろ 聞かれてるのはバッチでの実現手段なのにロジックとか言い出してどうすんだよ ■ このスレッドは過去ログ倉庫に格納されています