【.cmd】 バッチファイルスクリプト %13 【.bat】
■ このスレッドは過去ログ倉庫に格納されています
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 リネームは結構難しい リネーム後のファイルが再びリネーム対象となる場合がある set N=1000 :LOOP if "%~1"=="" exit /b set /a N+=1 ren "%~1" "%N:~-3% %~nx1" shift goto :LOOP リネームは一覧を一旦ファイルに出力してから回した方が安全だよ それとファイル名にUNICODE文字が混ざってる場合も考慮するとバッチファイルではやらん方がいいよ vbsかjsかpowershell >>724 のRuby では最初に、Dir.glob( "C:/Users/Owner/test/*" ) で、そのフォルダ内のすべてのファイルを取得しているから、 各ファイルを、rename していく途中で、 rename後のファイルを、再びrenameすることはない >>730 ファイル出力というかfor/fでdir出力の取り込みでいいんじゃね? UNICODE文字は関係あるかね? >>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の名前は何でもいいが既存の名前を避けてください。 >>732 >UNICODE文字は関係あるかね? SJISに含まれてない文字が入ってると酷いことになる 駄目文字のせいでSJISコードがバグると言うならまだわかるが その逆って意味がわからないな MSは全くテストしてないってことか 複数行を一行にまとめる場合は、&でつなぐんでしょうか? これが改行と同じ意味でしょうかね。 >>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 コードページ変えればいいだけ >>737 複数行をまとめるって、、 文字列の足し算の話? コマンドを複数行に分割して記述する話? (継続文字のこと?) >>739 または複数コマンドを一行で記述する話? >>735 コマンドプロンプトは自体はUNICODE対応 各種コマンドもUNICODE対応 だけどバッチファイルは過去の互換性が必要なので デフォルトではOSの設定(日本語だとSJIS)の文字コードとして使われる。 その設定はchcpで変えることが出来る 単にコマンド呼び出しをしてるだけならUNICODEとして扱われるが forでバッチファイルの世界に招き入れたら、 chcpの設定によって文字コードの変換が行われる テストはしてるだろ。この文字コード変換は仕様なので バッチファイルでUNICODE文字を扱いたければchcpで UTF-8に変更しなければならないというだけのこと >>739 バッチファイルではなくて、複数行をコマンドプロンプト上で実行したい場合があったりします >>742 複数行をコピペじゃ駄目なの? 例えば、この内容をメモ帳に記述しておいて rem ―- ここから ―― dism /online /cleanup-image /restorehealth sfc /scannow rem ―- ここまで ―- 4行をコピペする >>742 複数コマンドを1行で実行したいということなら、、、 A & B ... A実行後にBを実行 A | B ... Aの実行結果をBに渡して実行 A && B ... Aが成功したらBを実行 A || B ... Aが失敗したらBを実行 長いコマンドを複数行に分割したいなら、、、 Sentence1 ^<改行> Sentence2 (サーカムフレックスで継続) ()で囲めばいい。 (timeout /t 300 cd d f:\hoge for %f in ( *.jpg ) do ( ・・・ ) ) 正式名称が何かは知らないが勝手にブロックと呼んでる。 >>744 そういうのがあるのか、| 以外知らなかった >>743 コピペでももちろんいいですが、知っておきたかったです >>748 だったらこんなところで聞くんじゃなくて 一次資料に当たる努力をしなよ >>745 それ駄目。 遅延変数展開しないと痛い目に遭うよ。 連番をつけるコードでまだ躓いています hoge.txt hogehoge.txt を hoge(1).txt hogehoge(2).txt としたいです echo off & for %i in (*.txt) do (ren %i ???) このはてな部分に連番を指定するためにインデックスを指定しないといけないと思うんですが、%i自体にはファイル名が入っていると思います。インデックスは取れるんでしょうか? バッチでset /aなどのオプションがありますが、/aは計算を伴う場合に使うそうです。 この/aに意味はあるのですか? 何らかの単語の略だと覚えやすいんですが。 その程度ぐぐれば出てくるでしょ インデックスのカウント用変数が必要+変数の遅延展開 丸括弧のエスケープが必要 aはarithmeticの略 @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 1Point ノウハウ dir ですべてのファイル、フォルダを表示したい場合は dir /A 普通に do call :x "%%~i" でいいと思うんだが何故いちいち set a=%%i とかしてるの? 何か理由あるん? >>757 ファイル名に「%」入ってるとマズくない? シェルスクリプトってお手軽省略表記にこだわりすぎるあまり エスケープ処理が複雑化しバグりやすくなって本末転倒だよな そんなところで躓く能なしは、他の言語で書いても同じだよ 他の言語でもエスケープは必要なことはあるし同じこと ただbatのように自身を置換して逐次実行するするようなことは eval系の命令を使う場合なのでほぼ無いに等しいので意識されないだけ 要するに分かりにくい ここで初心者にイロハから質問されてもレスがしにくい リネームソフトでも使え >>759 シェルスクリプトでエスケープ処理が複雑なんて したことがないんだがどういうケース? むしろバッチファイルのほうがややこしすぎる バッチファイルでダブルクォートはいつつけるか言える? スペースが含まれたファイル名とか バッチファイルでこれの出力結果は echo "C:\Program Files" ↓これです。(ダブルクォート含む) "C:\Program Files" >>764 もしかしてバッチファイルとシェルスクリプトの違いわかってないの? シェルスクリプトっていうのはUnixやLinuxの /bin/shとかbashのことなんだが ファイル数わからんけどリネームソフト使えば一分かからんで終了 >>766 俺の定義ではバッチファイルはシェルスクリプトだ config.sysに shell=command.com /e:1024 とか書いてたからな >>768 意味わかんないから調べたが、 今では全く通用しない話じゃねーかよ。 てめーの定義を押し付けんな。 >>770 頑張ってググってきたんだからほめてやれよ >>769 Delims句でイコールを区切り文字にしたいときはサーカムフレックスでエスケープする必要があるときがあるけどね。 UNIXとかでshやbashがログインシェルとかインタラクティブシェルになるのと同じだよ shやbash=cmd シェルスクリプト=バッチファイル シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前 とはいえ逆にunixでバッチがどうとか言うと違和感あるしな >>766 みたいな感覚が一般的 >>775 > シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前 シェアならLinuxのシェルスクリプトの方が多いよ 今はsystemdに置き換えられつつあるが、起動処理の多くで シェルスクリプトが使われていた。 各アプリのビルドなどでもシェルスクリプトは使われている。 それに対してバッチファイルは殆ど使われていない。 そもそもWindowsのコマンドは、他のコマンドの出力を読み取って 別のコマンドで処理するように設計されていない 単に呼び出すだけ。だからバッチファイルという名前になってる 例えばcopyコマンドであってもシェルスクリプトであれば、コピーが正常に終了した場合 なにも表示されないのでスクリプトとして使いやすいが Windowsのcopyは人間用のメッセージがいちいち出る コマンドの出力を変数に入れるだけでも大変 遅延環境変数の展開を使わなければ変数の中にメタ文字的なものが入るだけで簡単に壊れる そもそもの設計思想がスクリプトを組むためではなく、単にコマンドを並べるという使い方を するためだからバッチファイルはシェルスクリプトだけでなく PowerShellスクリプトやVBScriptよりも使いづらくなってしまっている 一方、PowerShellスクリプトやVBScriptはコマンドをよびだすのが 面倒になってるので両立してるシェルスクリプトにはかなわない アスペがうだうだ言ってるだけで全く「会話」が進行していないな マンコッタ茶園のアッサムティーをすすりながら仕事するのが何よりの贅沢 滅茶苦茶初歩的な質問ですまん バッチファイルからPythonスクリプト実行してPythonスクリプト側でprintした文字列をバッチファイル側で取得する方法ってある? FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター] または usebackq オプションの場合: FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター] もしくはコマンドプロンプトに出力された文字列を出所問わず取得したい >>787 ありがとう、いけたわ logzero使ってるライブラリでこれやろうとすると途中で処理が止まるけど、これは他の問題かもしれんな >>789 標準出力じゃなくて、標準エラー出力の方にprintしてるんだろ ('py foo.py 2^>^&1') logzeroさらっと調べても設定全く分からんので今回は該当部分の出力だけlogzero.infoからprintにして無駄な出力を省いた 出力取得できたのでまあよし >>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 >コマンドプロンプト入門 Kindle版 2020年にこれを出すとはチャレンジャーすぎるな amazonで、確認すると、2019/09の出版みたいですね。 どうせなら、power shellの本出したほうが良かったかも。 ファイル名に「b」を含むファイルをコピーするときに たとえば abc.txt というファイルがあって copy *b*.txt def.txt がオッケーで copy *b* def.txt がエラーなのはなぜですか? *は0文字以上の文字列なので 両方とも成功すると思っていたのですが >>795 KindleストアにPowerShellのがいっぱいあるやん >>796 普通にできるけどどんなエラーが出るの? ちなみにその書き方だと *a* が複数ある時は連結されてしまうけどな Windows Terminal で音を鳴らすにはどうすればいいですか コマンドプロンプトではControl-Gを出力してたんですが Windows Terminalでは無視してくれやがります そんなんだったら >copy con beep.cmd echo ^G waitfor /T 3 waiting ^Z 1 個のファイルをコピーしました。 >start /min cmd /d/c beep.cmd とするけどもっといい手はないかなと ああstartで自分を呼んで鳴らせばいいんだ 自己解決しました >>802 echo ^G>beep.dat としておいて type beep.dat beep.dat は 0x07 (1byte)だけ その手がWindows Terminalでは使えないって話 https://aka.ms/terminal-documentation Windows ターミナルの概要 | Microsoft Docs >>805 そうでしたか Windows Terminal、使うか バッチでやるような処理でも 勉強兼ねてpowershell使って処理するようにしたほうがいいですか? 実務上はどうです? バッチの方が情報多いからいいんですか? >>809 どういう現場か知らないけど Widn7 SP1 PSv2 縛り なんて現場でPS書きたいとか思わないね。 使わせてくれる現場なら使うべきだし、そうでないならバッチをシコシコ書くしかないのよ。 PSでできること=C#でできることだからバッチとは全然できることが違うよ PSv2でも十分バッチとは天地の差がある 元の質問が、「バッチでやるような処理でも」なんだけどな ちゃんと読んでるか? >>809 情報量ならPowerShellの方が上だし TechnetフォーラムならPowerShellのカテゴリーあるし ポケットリファレンスの著者である牟田口大介まで出没している ストアアプリのインストールとかはPowerShell必須だし バッチのみじゃ書けない物も割と多い 処理の内容は忘れたけどバッチでやれた事を PowerShellで書いたらキー入力を要求されて かえってバッチの方が良かった場合もあるけど そんなパターンは圧倒的に少ないと思う でもウチの場合、PowerShell使いがいないから というのが最大の理由で実務はバッチだらけ 良いか悪いかならきちんとメンテナンスが出来る物が良いであるべき 個人の感想ならばPowerShellって バージョンが上がって非互換が出そうなので避けたい 9x系(95/98/Me)のWindows用MS-DOSプロンプトとNT系(それ以外)のWindows用コマンド・プロンプトの違いさえ 意識していれば、バッチファイルの利用は難しくないと思う。 VBScript(WSHことWindows Script Host)の場合は9x系とNT系に関係なく、WSHバージョン5.1以降かどうかさえ 気をつけていれば概ね大丈夫だと思う。 それらに比べてPowerShellは、個人的にはハードルが極めて高い。 >>813 当然「バッチでやるような処理でも」PSなら十二分にこなせるよ このスレで話題になるような変なクセや制限もないしね >>814 PSはバージョン指定(-vオプション)すればそのバージョンが実行される仕組みを持ってるから互換性についてもある程度クリーンだよ BATの典型的なものとしては シーケンシャルに ・外部アプリ呼び出し ・ファイルコピーや移動 ・メッセージ表示 であって、こんなものをPowerShellで書く必要は無いし、ステップ数も余分にいる PSの話したいなら該当スレへ ここでするのはスレチ バッチファイル内で、複数の文字列の一部だけを羅列して、それをまとめて補完したものを変数に入れたい 具体的には 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 ) のようにして、増減や修正を簡単に出来るようにしたい したいんだけど、なんかうまく動いてくれない 何かヒントもらえますか? 自己解決 どうやらこんな感じで動きそう for %%f in (tech prog win newsplus) do ( call :APPEND %%f ) :APPEND set LOGFILES=%LOGFILES% %LOG%\%%f\*.dat goto :EOF >>820 setlocal enabledelayedexpansion for %%f in (tech prog win newsplus) do ( set LOGFILES=!LOGFILES! %LOG%\%%f\*.dat ) じゃダメなの? あれ?出来ますね 実は!で囲むのもやってみた(つもりだった)んだけど (たぶん、どっか別のちょっとしたところでミスしてて) その時はうまく動かなかったんですね 失礼しました >>817 業務システムのくせに -v の無いPSスクリプトを Win7 上で動かしてるクソシステム、あるよ。改修したくもないけど。 PS は ver.3 で破壊的変更がなされたから、ver.2 に合わせて勉強するだけ無駄だと言われている。 core になって COM も切られたから Word や Excel ファイルへのアクセスも今後どーなんの?的な段階。 また、PS が「管理の自動化」を目指しているのに対して、バッチや WSH は「一般ユーザーの定型操作の自動化」を目指しているから方向性自体が違う。 おまけにバッチとWSHはもう仕様変更が無いという強みがある。 等価なものを個人的に PS でリライトしてみる、はいいと思うけど、本番環境に入れるのはNGかな…。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる