【.cmd】 バッチファイルスクリプト %13 【.bat】

■ このスレッドは過去ログ倉庫に格納されています
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/
461デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:52:33.20ID:spBBwL/I
>>460
今の最新の公式リリース
462デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:56:43.68ID:spBBwL/I
なんかわかりづらくなったので再掲

copy test.txt CONで検証

Windows7、chcp 932・・・text.txt が ShiftJIS だと正しく表示される
Windows10、chcp 932・・・text.txt が UTF-8(BOMなし) だと正しく表示される
2019/10/29(火) 16:52:33.42ID:spBBwL/I
なんかいろいろ勘違いしてたっぽい
copy CONつかってもどこかの誰かが変換かましてるっぽい

こんな漢字でバイナリ直接吐き出したら、chcp 932ではSJISしか正しく表示されなかった。
chcp 65001にしたらUTF8だけ
Windows 10でだけど、たぶんWindows 7でも同じじゃないかな?

#include <iostream>
int main()
{
unsigned char str[] = { 0xE6, 0xBC, 0xA2, 0xE5, 0xAD, 0x97, 0xE2, 0x9D, 0xA4 };
std::cout.write((char*)&str, sizeof(str));
}
2019/10/29(火) 17:46:22.44ID:4a4kNF+Q
一つわかった気がする。

コマンドプロンプトはUnicode対応してるけどバッチファイルはUnicode対応じゃないんだ。
(正確にはchcp 65001を実行すれば、UTF-8のバッチファイルを実行できる)

だからchcp 932のままコマンドプロンプトでUnicode文字を使うことができるけど
バッチファイルにするとそれができない。
2019/10/29(火) 17:46:59.43ID:wQOUEDyj
テキストストリームだけしか通さないから何らかの変換が入ってるのかも知れないね
copy /b hoge.txt con
指定されたデバイスに書き込めません。
0 個のファイルをコピーしました。
2019/10/29(火) 18:03:33.66ID:4a4kNF+Q
あ、copyに/bオプションなんてあったのか・・・
2019/10/29(火) 18:10:48.74ID:4a4kNF+Q
そんな馬鹿な・・・。Windows 10でもShiftJISじゃないと表示されなくなっただと?
何度も確認したはずだぞ???
2019/10/29(火) 18:37:30.30ID:tLCpEMn0
Windows10については徐々に更新されているらしい

Windows Command-Line: Unicode and UTF-8 Output Text Buffer
https://devblogs.microsoft.com/commandline/windows-command-line-unicode-and-utf-8-output-text-buffer/
2019/10/29(火) 19:04:08.72ID:SHkVBveq
少し前にここで同様の話題が有ったが UTF-8(BOM無し) のテキストは
たとえ chcp 65001 しても type で一部分文字化けする

findstr ^^ foo.txt

で正常に表示されるはず(chcp 65001 で)
2019/10/29(火) 19:08:30.96ID:SHkVBveq
あと chcp 65001 しても UTF-8 のバッチは
正常に動作しないと思った方がいい
471デフォルトの名無しさん
垢版 |
2019/10/29(火) 20:31:39.34ID:ltL5L5Cn
あぁ、クソ。意味がわからんけど、理由がわかった。

1. まず、utf8.txt の中身をUTF-8で作る。ShiftJISにない文字も入れておく。
2. chcp を実行。「現在のコード ページ: 932」と表示されることを確認する。
3. コマンドプロンプトを起動して、type utf8.txt にして文字化けすることを確認する

ここまではなんの変哲もない。

4. powershell.exe -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 を実行する
5. type utf8.txt を実行すると文字化けしない(!)
6. chcp を実行。「Active code page: 932」と表示される。932なのになぜか英語(!)

chcpを変更してもとに戻すと、元に戻るし、
powershell -Command [Console]::OutputEncoding = [Text.Encoding]::Default を実行しても元に戻る

子プロセスであるはずのpowershellがなにかコマンドプロンプトの状態を変えてやがる。
なんだこれ?コマンドプロンプトに英語モードとかあったっけ?
2019/10/29(火) 20:34:10.83ID:ltL5L5Cn
コマンドプロンプトを起動するのは2の時の間違いな
2019/10/29(火) 20:38:52.72ID:ltL5L5Cn
この話から気づくと思うけど、

powershell -Command [Console]::OutputEncoding
初期状態は、日本語 (シフト JIS)

powershell -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8
これでUTF-8に変更して

powershell -Command [Console]::OutputEncoding
現在の設定を確認すると、UTF-8になってる。

chcpの値は変わらんのに、コードページを変えることができてしまっているかのようだ。
2019/10/29(火) 21:33:51.82ID:ltL5L5Cn
Windows 7にPowerShell6をインストールしてやってみたけど、
pwsh -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 で
コードページが変わるな。Windows 7はまともに動かないので画面がバグるw
2019/10/29(火) 21:41:58.40ID:ltL5L5Cn
なるほど、SetConsoleOutputCPでコマンドプロンプトのコードページを変更できるらしい

http://tooljp.com/language/C-Languate/sample-code/SetConsoleOutputCP-sample-code.html
2019/10/30(水) 07:47:21.02ID:WNRoeYsC
おれもコードページ弄って色々やったが上手くいかなかった
typeは一部ダメ、moreは全くダメ、findstrはリダイレクトするとダメ、
copy〜conは utf-7とjis が一部ダメ、
for〜do echoでやると空行が抜けてダメという具合
2019/10/30(水) 08:50:12.52ID:BvOaIOcB
エディタがあれば必要ない
2019/10/30(水) 11:07:44.00ID:iT3/p0k9
>>476
なんとなく画面に表示する部分にバグがあるから
バッチファイル内で閉じて画面に表示しなければ、chcp 65001で動くような気がする。
あとWindows 10ではそこらへんが直ってるので同じように考えるのは早計
2019/10/30(水) 11:25:55.22ID:iT3/p0k9
Windows 7でこれが文字化けせずに動いた
chcpで画面はクリアされるが、正しく出力される。

↓UTF8 + CRLFで作成

@echo off
chcp 65001
set A=ユニコード文字
chcp 932
echo %A%
2019/10/30(水) 12:04:53.93ID:BvOaIOcB
>>262 みたいのは今でも化けるね
>>476 はWindows10だと思う
どっちにしろ不具合を把握しとくのは大事だね
2019/10/30(水) 12:11:59.20ID:n2bLSC2q
chcp 65001 にしてもcmd /u で開き直さなきゃバグるんじゃない?
2019/10/30(水) 12:17:27.39ID:4eNYSN+t
chcpやってモード変更したとしても
既に開いたハンドルは開いたときのモードのままだろうからね
2019/10/30(水) 12:27:14.70ID:iT3/p0k9
>>480
化けると言うよりか、文字の終わりを正しく認識できてない感じ
これならうまくいく。
まずchcpをifの()内でやるとおかしくなる。
その上でsetする文字をダブルクォートでくくらなかったらおかしくなった
なのでダブルクォートくくって、出力時に外してる。

@echo off
chcp 65001
set A=
set B=
if "hoge"=="hoge" (
set A="あああ"
set B="いいい"
)
chcp 932
call :output %A% %B%
exit /b

:output
echo %~1
echo %~2
2019/10/30(水) 12:29:13.59ID:iT3/p0k9
ちなみに >>483 はchcp65001した状態でバッチファイルを実行すれば
バッチファイルの中でchcpせずに動く

あとファイルの文字コードはUTF8な
2019/10/30(水) 12:32:44.17ID:iT3/p0k9
>>482
そうとは限らない。

chcpはどうやら内部でSetConsoleOutputCPを呼び出してるんだろうけど

SetConsoleOutputCPっていうのはConsole APIの一つで、
コマンドプロンプトのコードページを変更する。

このAPIは子プロセスから親プロセスをたどって見つけた
コンソール(コマンドプロンプト)のコードページを変更できる。

ハンドルのモードは関係なく、コンソールのコードページの話
2019/10/30(水) 12:38:00.67ID:iT3/p0k9
>>252の改良でこれならうまく動くんだよな
ダブルクォートはいるけど。
あとecho あああa みたいに最後をASCII文字にしても動く

@echo off
chcp 65001
if "hoge"=="hoge" (
echo "あああ"
echo "いいい"
)
2019/10/30(水) 12:45:45.44ID:iT3/p0k9
こうすりゃいいのかw

@echo off
chcp 65001
if "hoge"=="hoge" (
call :echo "あああ"
call :echo "いいい"
)

exit /b

:echo
echo %~1
2019/10/30(水) 12:46:49.70ID:iT3/p0k9
まあバッチファイルでchcp 65001を使うのはやめたほうがいいと思うけど
ワークアラウンドでどうにか対応できなくはないかもしれないw
2019/10/30(水) 13:25:11.54ID:iT3/p0k9
上の方でcmdがだめならPowerShellを使えばいいじゃないみたいなことが書いてあるけど、
UTF8の出力に関しては、コンソールの問題だから
Windows 7、8.1 ではPowerShellでもバグるんだよな

Windows 7にPowerShell6を入れてみたが、デフォルトで
「あいう」というファイル名が「ああいいうう」と表示される上に
[Console]::OutputEncoding = [Text.Encoding]::UTF8 すると
出力できませんみたいなエラーが発生するw

つまりWindows 7+PowerShell6だと日本語ファイル名は正しく表示されない
標準搭載のPowerShell 2なら問題ないんだけどね
2019/10/30(水) 13:41:42.20ID:zJjGNXoj
それは
>これは、$OutputEncoding が Default だと US-ASCII になっているので、S-JIS 文字列を渡そうとしてもリダイレクト時に日本語がうまく扱えないからです。
>結論から言うと、$OutputEncoding を S-JIS に変更して clip.exe にリダイレクトすれば文字化けしません。
これが関係するのかな?
2019/10/30(水) 13:53:29.35ID:ecgQNQwo
hoge ディレクトリに
 test_1.txt  …半角スペースなし
 test 2.txt  …半角スペースあり
 test 3.txt  …全角スペースあり
がある場合に

@echo off
for /f "usebackq" %%I in (`dir /b "hoge"`) do echo %%I

というバッチファイルを実行すると
 test_1.txt
 test
 test 3.txt
となって、普通に dir /b "hoge" を実行した結果と異なり、
半角スペースのある文字列(test 2.txt)を渡せないのだけれど、
どうしたらいいですか?
2019/10/30(水) 13:53:40.11ID:iT3/p0k9
どこの記事だよw まあググったが。
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
2019/10/30(水) 14:08:53.46ID:iT3/p0k9
clipは使ったのことがないので実験。
あとPowerShellのバージョンで色々変わるので、
その記事の内容から検証しないといかんw

■コマンドプロンプトより
・chcp 932の場合
OK: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

・chcp 65001の場合
OK: echo あいう | clip.exe
OK: echo (ユニコード文字) | clip.exe


■Windows 10 の PowerShell 5.1より
・[Console]::OutputEncoding = [Text.Encoding]::Default (Code Page 932)
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe


■PowerShell 6.2より
・[Console]::OutputEncoding = [Text.Encoding]::Default (Code Page 65001)
NG: echo あいう | clip.exe
NG: echo (ユニコード文字) | clip.exe

ただし、コマンドプロンプトおよびPowerShell 5.1では
?になるのにたいしてこっちは文字化けする
2019/10/30(水) 14:13:56.47ID:iT3/p0k9
ここはPowerShellのスレじゃないんだがw

$OutputEncoding と [Console]::$OutputEncoding は別もんなんか!?
[Console]は[Console]::WriteLine とか使うときだけかな?
2019/10/30(水) 14:16:01.69ID:n2bLSC2q
>>491
"usebackq delims="
2019/10/30(水) 14:21:07.12ID:iT3/p0k9
[Console]::OutputEncoding と $OutputEncoding の
両方をUTF8にしたらユニコード文字含めて文字化けしなかった。

■Windows 10 の PowerShell 5.1より

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
?になる: echo あいう | clip.exe
?になる: echo (ユニコード文字) | clip.exe

・$OutputEncoding = [Text.Encoding]::UTF8
?文字化け: echo あいう | clip.exe
?文字化け: echo (ユニコード文字) | clip.exe

???・[Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8
?OK: echo あいう | clip.exe
??OK: echo (ユニコード文字) | clip.exe
2019/10/30(水) 14:22:18.15ID:iT3/p0k9
なぜか書き込みにゴミが入った・・・

■Windows 10 の PowerShell 5.1より

・[Console]::OutputEncoding = [Text.Encoding]::UTF8
?になる: echo あいう | clip.exe
?になる: echo (ユニコード文字) | clip.exe

・$OutputEncoding = [Text.Encoding]::UTF8
文字化け: echo あいう | clip.exe
文字化け: echo (ユニコード文字) | clip.exe

・[Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8
OK: echo あいう | clip.exe
OK: echo (ユニコード文字) | clip.exe
2019/10/30(水) 14:24:19.49ID:ecgQNQwo
>>495
あら、そんなことだったんだ
どうもありがとう
2019/10/30(水) 14:27:47.60ID:iT3/p0k9
[Console]::OutputEncoding は chcp 相当のことをしていて、
コンソールのコードページを変更しているのに対して、
$OutputEncoding は出力の文字コード変換の制御をしてるっぽい
2019/10/30(水) 14:46:57.29ID:iT3/p0k9
[Text.Encoding]::UTF8 じゃなくて [Text.Encoding]::Unicode を使ってもうまくいく

テキスト出力には、ASCII(?)モードとUnicodeモードというのがあるってのはわかってるんだよね
https://blog.miz-ar.info/2017/01/wide-stdio-msvcrt/
> Unicode mode はさらに UNICODE モード (_O_WTEXT)、UTF-8 モード (_O_U8TEXT)、
> UTF-16LE モード (_O_U16TEXT) の3つに細分できる

んで仮説

[Console]::OutputEncoding は OutputEncoding と書いているけど、
実際にはコンソールのコードページを変更するもので
コマンドプロンプトとPowerShellのプロンプト入力の文字コードも変えてしまうから
名前に反して入力にも影響を及ぼしてるんじゃないだろうか?

[Console]::OutputEncoding + $OutputEncoding = [Text.Encoding]::UTF8
というのは、つまりプロンプトからの入力をUTF8、出力をUTF8にするという意味

Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
http://www.vwnet.jp/Windows/PowerShell/CharCode.htm

とかは、コンソールのコードページを変更してない=デフォルトのcp932状態で
echoしてるから入力がcp932、そしてデフォルトの$OutputEncoding=US-ASCIIで
文字化けするから(入力と同じ)cp932で出力しましょうねって話なんだと思う。

Windows 10以前は、コンソールのコードページ65001にバグが有って
使い物にならなかったけど、Windows 10で修正されたから
コードページ65001でコマンドプロンプトもPowerShellも正しく動くようになったんだと思う

(ただしこれは画面出力の問題であって、UTF8でバッチファイルを書いた時のパース処理は別の話)
2019/11/02(土) 13:44:45.56ID:+w7z2z4x
https://duckduckgo.com/bang
https://duckduckgo.com/bang_lite.html
!you "Batch File"
!tw バッチファイル
!tw "Batch File"
!ig BatchFile
!r BatchFile
!so "Batch File"
!gnuk "Batch File"
!msd cmd
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-commands
2019/11/02(土) 14:20:34.65ID:+UvDifof
!hatebu バッチファイル
!qiita バッチファイル
503デフォルトの名無しさん
垢版 |
2019/11/03(日) 23:33:41.85ID:/0rS8sv9
質問なのですが、以下の内容を実行するバッチプログラムを作りたいのですが、どなたかご教示頂けないでしょうか。

Cドライブにある「A、B、C、D」という4つのフォルダとサブフォルダの中身全部を、
Dドライブにある「XXXX」のフォルダの中に存在するフォルダにコピーしたいのですが、コピーする際以下の条件があります。

1.フォルダが1つしかない場合、その中だけにコピーする。
2.フォルダが複数ある場合は、それぞれのフォルダに1.と同様にコピーする。


宜しくお願いします。
2019/11/03(日) 23:37:03.86ID:Xh3slsXc
>>503
自分で作ってください
2019/11/04(月) 09:25:52.62ID:0uHh5Wp4
宜しくお願いします。と書けば誰かがやってくれるとでも?
xcopy robocopy move for if set call dir findstr
この辺使えりゃ出来るから自分で調べろ
"バッチ バックアップ" とかでググれば腐るほど例が出るだろ
2019/11/04(月) 13:01:25.95ID:Zu03xGz4
>>493-500
Ruby で、クリップボード内の複数行文字列の、各行の先頭・末尾から、
連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end

>>503
そんな複雑な条件を、バッチでプログラミングするのは無理!

Ruby などのプログラミングで、再帰的にコピーするか、
PowerShell で、robocopy を使うとか
2019/11/04(月) 13:46:43.19ID:UHaJ6Kuw
> Ruby で、クリップボード内の複数行文字列の、各行の先頭・末尾から、
> str = `powershell Get-Clipboard`

Rubyでできないなら、もう全部powershellで書いちゃえよw
508506
垢版 |
2019/11/04(月) 15:48:40.94ID:Zu03xGz4
>>503
Ruby で作った。
FileUtils::DryRun では、実際には実行しない

require 'fileutils'

src_dirs = [ "C:/Users/Owner/Documents/A/", "C:/Users/Owner/Documents/test/B/" ]

target_dir = "D:/何々/*"

# target の子フォルダの配列
dest_dirs = Dir.glob( target_dir ).select { |path| File.directory?( path ) }
return if dest_dirs.length == 0 # フォルダが存在しない

src_dirs.each do |src_dir| # 2重ループ
dest_dirs.each do |dest_dir|
FileUtils::DryRun.cp_r( src_dir, dest_dir )
end
end
2019/11/04(月) 22:13:40.62ID:mdzUzifN
>>505 >>508

有難うございます。
それらでググって調べてやってみます。
2019/11/05(火) 12:51:32.26ID:3/4kxzup
>>509 参考にどうぞ
@echo off
set s="C:\"
set d="D:\XXXX"
cd/d %s%
for %%i in (A B C D) do call :x "%%~fi" "%%~i"
pause & exit/b
:x
pushd %d%
for /d %%j in (*) do xcopy /e /i %1 "%%~j"\%2
popd
511デフォルトの名無しさん
垢版 |
2019/11/05(火) 18:52:56.56ID:ykrQtfUP
>>510
そんな複雑なことをしなくても、@echo offを除いて1行で書けるだろ。

@echo off
for %%s in (A, B, C, D) do for /d %%d in (D:\XXXX\*) do xcopy "C:\%%s" "%%d\%%s" /e /i
2019/11/05(火) 20:10:31.32ID:3/4kxzup
多分 %%~fd やね
513デフォルトの名無しさん
垢版 |
2019/11/05(火) 20:28:07.61ID:ykrQtfUP
%%dだけでフルパスになるから~fは不要。
2019/11/05(火) 20:42:07.32ID:3/4kxzup
そうか失礼いたしました
2019/11/05(火) 20:50:46.27ID:kqXSHliE
火【22】義母と娘ブルース 11.5__11.3__12.4__12.2__13.1__13.9__15.1__15.5__17.3__19.2(終)________14.15

これはドラマ視聴率のデータですがコマンドプロンプトで値を入力していって、
その時点での相加平均値を表示してくれるバッチファイルってできますか?
INPUTを使うのかな

あと、ウィンドウを開いている間生きている変数ってファイルへの格納、取り出しって
そんな面倒なことしてるなら表計算ソフトでも使えってか
2019/11/05(火) 21:30:33.42ID:HPnxYMOW
>>515
出来なくはないけれど set /a では整数しか扱えずバッチのみでやるのは面倒
やるならPowerShell とか wsh, js かな
単に平均出すだけなら電卓アプリの方が楽
2019/11/05(火) 22:38:05.69ID:aoMnc07l
Dim str
str =""
Dim num
Dim ans
Dim bln_Confirm
Function main()
str = InputBox("数値を入力",,str)
If instr(str,"_") Then
ans = Eval("(" & Replace(str,"_","+") & ")/" & UBound(split(str,"_"))+1)
else
ans = Eval(str)
End If
bln_Confirm = MsgBox("入力数値:" & str & vblf & vblf & "入力の平均:" & ans,3,"続ける?")
str = str & "_"
End Function
Do
main
Loop While bln_Confirm = vbYes

VBSならこうかな?
2019/11/06(水) 01:50:43.91ID:ZR40S1lI
Ruby で作った。
最後の(終) の部分は、数字とみなされないので、無視される

str = "11.5__11.3__12.4__12.2__13.1__13.9__15.1__15.5__17.3__19.2(終)"

ary = str.split( "__" ) # 数字部分を配列に入れる
ary.map!( &:to_f ) # 文字列を浮動小数点へ変換する
p ary.inject( :+ ) / ary.length # 合計 / 要素数
2019/11/06(水) 03:37:02.69ID:sEBZ5Hrs
スレタイも読めないメクラか?
ドヤりたいなら該当スレへ逝け
2019/11/06(水) 15:19:13.85ID:Z1XrM+Fl
:ALCL
@echo off &setlocal enabledelayedexpansion
echo 少数切り捨て。少数以下は求めたい桁数まで0埋めして入力
echo 少数2位まで求めたい場合 ex: 12.4 -^> 1240
echo 00で Clear, 000で AllClear
set i=
:LOOP
set /a i+=1
:INPUT
set /p N%i%=数値を入力 :
echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT)
if !N%i%!==000 goto :ALCL
if !N%i%!==00 (
if %i% leq 2 goto :ALCL
if %i% gtr 2 set /a i-=2
)
set s=
set r=
for /l %%a in (1,1,%i%) do (
set s=!s! !N%%a!
set /a r+=!N%%a!
)
set /a r/=%i%
echo %s% : %r%
goto :LOOP
2019/11/06(水) 15:48:22.56ID:Z1XrM+Fl
set /p N%i%=数値を入力 :
if not defined N%i% (echo 入力無効 &goto :INPUT)
echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT)

上のに真ん中の行追加で
2019/11/06(水) 20:50:16.92ID:wTTuQQRz
バッチファイルは難しすぎ!
引数の概念がLinuxと全く違う
2019/11/06(水) 23:04:29.95ID:wTTuQQRz
空白が入ったパスをバッチファイルにわたすために
ダブルクォートで括らないといけないが、
それをやると、変数にダブルクォートが入るのがクソなんだな

しかも、if "%1" == "" とか書くと、引数がダブルクォート
一個だったときにエラーが出るとかいろいろ破綻してる
2019/11/07(木) 01:48:00.01ID:4r3ojeSB
>>522
難しすぎというよりは適当仕様すぎ
仕様を安易に何回も拡張した、増築して迷路化した老舗旅館
2019/11/07(木) 04:42:48.88ID:nSoHFrko
>>511
@for %%s 以下略じゃダメなの?
2019/11/07(木) 06:29:37.44ID:lb8cogBR
>>525
それならdoの後のforとxcopyにも@付けろ
何でも一行にすりゃいいわけじゃないがな
2019/11/07(木) 06:59:41.26ID:LFqMQC4+
>>523
%~1で外せるでしょ?
2019/11/07(木) 07:54:19.69ID:isVFtAa0
>>520さんありがとうございます
”これこそが私の求めていたものだ”
そんな慣用句?ローマの名文句?ってあったっけと思ってしまいますた。
000と00の入力処理で使いやすくなっているのがセンスというか実際の使用を考えた親切な仕様だなと思います。
訂正できるのは本当に便利だ。

VBSとRubyで書いてくださった>>517さんと>>518さんにも感謝。
自分の要求仕様がどう解釈・解決されるのか勉強になります。
2019/11/07(木) 09:58:22.71ID:d6TMJd25
>>528
冗談で書いたんだが。。これなら同様のアプリ探した方がいいんじゃない?
あと以下修正、>>521部分も含む
:INPUT
set N%i%=
set /p N%i%=数値を入力 :
if not defined N%i% (echo 入力無効 &goto :INPUT)
echo !N%i%!|findstr /r /c:"[^0-9]" && (echo 入力無効 &goto :INPUT)

Clear後に空入力繰り返すと消したのが戻ってまたClearしてと繰り返す挙動が直る
実害無いだろうから敢えてそのままにするのも有り
既存の環境変数に set /p で空入力しても 空で上書き初期化されずそのまま残るみたい
2019/11/07(木) 10:37:33.42ID:sEmiRyTj
>>527
どこ見てもその程度。みんな適当なんだよな。

まず最初に書いた例から。バッチファイル(test.bat)を

1.このように書いた時
if "%1" == "" echo 引数なし

> test.bat "
コマンドの構文が誤っています。

2.このように書いた時
if "%~1" == "" echo 引数なし

> test.bat "
引数なし

※↑間違い。「"」という引数があります。

3. このように書いた時
if %~1 == "" echo 引数なし

> test.bat "
echo の使い方が誤っています。
2019/11/07(木) 12:19:13.92ID:Z6Qb1qTa
Windowsバッチの仕様がダメダメというのはそのとおりだが、
引数が " だけというのは、かなり特殊な想定だよな。
これが大丈夫という言語ってあるのか?

この場合とは違うが、外部アプリから""でくくったパスなどを渡してもらうときは、
アプリの方で、\"〜\"で吐き出すように設定して、
バッチファイルで、この\を削除するようにすることで、
引数展開でおかしな動作をさせないようにしている。
e.g. fxのOpenWithアドオンなど
2019/11/07(木) 12:32:04.92ID:sEmiRyTj
>>531
言語関係ない。コマンドプロンプトの仕様だから

例えばechoでダブルクォートだけを出力したいなら
echo " と書くしか無い。

PowerShellとかコマンドプロンプトを使わないなら
閉じてないダブルクォートの扱いを変えることは可能だが、
コマンドプロンプトはもうどうしようもないw

そしてこれ(もともとはMS-DOSの仕様)を前提に
Windows版のC言語とかのCRTライブラリが作られ、
mainに渡る前に、そういう文字列を解釈するようになってる。
2019/11/07(木) 12:33:31.15ID:sEmiRyTj
> この場合とは違うが、外部アプリから""でくくったパスなどを渡してもらうときは、
> アプリの方で、\"〜\"で吐き出すように設定して、

いきあたりばったりなんだよなw
本当にここらへんの奴らは適当
2019/11/07(木) 12:40:37.56ID:sEmiRyTj
https://thinca.hate
nablog.com/entry/20100210/1265813598

\ は、
ダブルクォートの内外を問わず、" の前に \ を前置すると " 自身を表現できる。
\\" とすると \" の \ をエスケープしたことになり、 \" になる。この " は特殊文字である。
\\\" とすると \\ + \" になり、 \" になる。この " は " 文字自身である。
以下、\ が増える度に上記のようなエスケープを繰り返す。
\\\\" → \\" (" は特殊文字)
\\\\\" → \\" (" は通常文字)
上記以外の場所にある \、つまり後に " が続かない \ は、いくつ重なっていてもその文字自身になる。
535デフォルトの名無しさん
垢版 |
2019/11/07(木) 12:53:05.11ID:LDERshfw
>>528
バッチ/シェルスクリプトは、複雑なプログラミングをするものじゃない!
Ruby, PowerShell, VBScript などを使うべき

まず、データの仕様を作るべき。
その程度のデータなら、普通は、CSV 形式とか

1. どこかのサイトから、データの集積物を取得する
2. それをパースして、CSV 形式に変換する

一旦、CSV へ変換すれば、
その後は、Rubyなど、様々なプログラミング言語で処理できる

1の部分は、Ruby, Selenium WebDriver などで、クローラー・スクレイピングも出来る
2019/11/07(木) 12:58:16.29ID:lb8cogBR
>>531
まったくスレチだけどGnuPGのパスワードを思い出した
引用符だけのパスワードを渡す場合は

pass "
>gpg -c --passphrase ^""" hoge.txt
pass ""
>gpg -c --passphrase """""" hoge.txt
pass """
>gpg -c --passphrase ^""""""""" hoge.txt

何でこうなるかは知らんがGnuPGだけの話さ
コマンド側でどう引数処理するかだよな
バッチでは普通ダメだね
2019/11/07(木) 13:04:39.19ID:sEmiRyTj
ダブルクォートを"""と3個やっても動かないときは、
"""" に増やして動くか
""""" に増やして動くか
""""" に増やして動くか
これぐらいまで試す

あるある
2019/11/07(木) 13:26:56.23ID:Z6Qb1qTa
>>536
クォートの先頭にエスケープが必要な場合でも、
後ろの方は何故かエスケープが不要なことがあるんだよな。
*nix系から移植したプログラムで、こういう事がたまに起きる。
いずれにしても、謎仕様…
2019/11/08(金) 05:39:07.91ID:78hADO4V
set x=echo
%x% qqq

set a=y
set %a%=3
echo %y%

どちらもできた
2019/11/09(土) 12:37:18.78ID:9Z+ynpem
もう無理だw

if "%value%" == "" echo match

こんな感じのコードで、%value% にどんな文字
(ダブルクオート、スペース、カンマ、その他記号)が
入っていてもエラーにならないというコードを
バッチファイルで書くのは不可能だw

お手上げ\(-o-)/
2019/11/09(土) 12:55:41.49ID:hmJLHo7y
IF NOT DEFINED VALUE
2019/11/09(土) 13:02:21.70ID:9HGwW/1Y
>>541
あ、ごめん。実際は右側、値が入ってる。

if "%value%" == "abc" echo match
2019/11/09(土) 13:03:25.05ID:hmJLHo7y
setlocal enabledelayedexpansion
if "!value!"=="abc" echo match
endlocal
2019/11/09(土) 13:14:34.88ID:9HGwW/1Y
あれ?マジで?それだけでいけちゃうの?
2019/11/09(土) 13:22:47.16ID:hmJLHo7y
これな、"abc"の方が要注意なんよ
^とか!とか入ってるとやばいかも
setlocalの前に代入して
if !a!==!b! とかやった方がええかもな
2019/11/09(土) 13:53:03.27ID:9HGwW/1Y
>>545
右側、固定値なら大丈夫だよね?
2019/11/09(土) 14:00:20.08ID:hmJLHo7y
うん多分、変な文字入って無けりゃね
遅延モードだと全角文字のリテラルにも一部副作用が有るかも
2019/11/09(土) 14:07:53.35ID:9HGwW/1Y
なんだよ、全角文字の副作用って・・・
せっかく進んだのにw
2019/11/09(土) 14:15:55.11ID:hmJLHo7y
setlocalの外で代入すりゃ問題ない
遅延の中では書くな
あと、if !a!==!b! に " はたぶん不要
2019/11/09(土) 14:26:55.47ID:9HGwW/1Y
setlocalの中で代入するとなにか問題があるのか・・・
2019/11/09(土) 14:37:46.76ID:hmJLHo7y
ええと
setlocal enabledelayedexpansion 〜 endlocal の中だよ
2019/11/09(土) 15:15:35.38ID:hmJLHo7y
>>550
すまん。おれの勘違いだった
全角文字は関係無かった。無視してください
でも^や!は要注意だけど
2019/11/09(土) 17:06:16.41ID:hmJLHo7y
でもif文自体が挙動不審だからなあ
if "ーー"=="""" echo 同じ
2019/11/09(土) 20:49:07.09ID:9HGwW/1Y
>>553
ShiftJISだとだめだけど、バッチファイルをUTF8で保存したら大丈だったよ!

ただし、それでも引数で渡すとダメだったけどwww
2019/11/09(土) 20:57:33.36ID:9HGwW/1Y
>>553
それも enabledelayedexpansion 使えば大丈夫じゃない?

setlocal enabledelayedexpansion
set A=%1
if !A! == "" echo 同じ


もうやだこの言語(?)
2019/11/09(土) 21:14:31.85ID:9HGwW/1Y
@echo off
echo %1
call :LABEL %1
exit /b

:LABEL
echo %*



> test.bat a
a
a

 これが普通

> test.bat ^^
call :LABEL exit /b
ECHO は <OFF> です。

 頭痛いけどなんとなく理解できる

> test.bat "^"
"^"
"^^"

 なんで^増えてんだよwww
2019/11/09(土) 21:24:41.89ID:9HGwW/1Y
@echo off

setlocal enabledelayedexpansion
echo %1
set A=%1
call :LABEL "%A%"
call :LABEL !A!
call :LABEL "!A!"
exit /b

:LABEL
echo %1

> test.bat "^"
"^"
""""
"^^"
""""

もう意味がわかんないw
これ人間が制御できるものなんか?
2019/11/10(日) 09:44:25.06ID:fP398yW4
setlocal enabledelayedexpansion は >>540対策で使えるけど、
それ以外はもっと制御が難しいかも・・・

基本は通常のsetlocalで比較のときだけ
部分的に使ったほうが良さそう

今回は頑張ったけど、もうやらない。
2019/11/10(日) 15:37:42.63ID:noq81T2Q
スレ伸びてると思ったらほぼ ID:9HGwW/1Y だったでござる
2019/11/10(日) 20:23:39.65ID:u8+xJCBj
for in って for %%i in (*) みたいにワイルドカードが含まれていればファイルを検索する機能で
for %%i in (a b c) みたいにワイルドカードが含まれてない場合は
ファイルがあるなしに関係なく、a、b、cを繰り返す機能ってことであってますか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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