【.cmd】 バッチファイルスクリプト %13 【.bat】
■ このスレッドは過去ログ倉庫に格納されています
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のやつで最初に書かれていたんだけどまったく使わないわなんて思ってそのままでした。 そんなことまで無理にcmdでやらんでも・・・ WinMergeすら入れさせてもらえない環境なのか? "送る"って意外と不自由なんだな… バッチファイルでワンクッション入れて(゚д゚)ウマー このバッチで何か入力しても a が消える @echo off set /p a=data= rem %a=% echo data=%a% pause >693 勉強不足があるかも知れんが ・さっさと画面を閉じちゃう(cmd/kで回避) ・%1に入れてくれない ・ファイル名の後ろにオプションが付けられない ワンクッションってそういう意味か 昔からスクリプトを送るに登録することなんて当たり前のことだったけどね むしろexeしか登録しない人はこのスレにはいないとまで思ってた >>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 叩いたらスクリーンセーバーをオフにしたく、killでスクリーンセーバーのscrファイルを終了させるバッチを作ったんだけど、Windows10のタブレットモードで動かすとスタートメニューが起動してしまう。 元々立ち上げてたソフトを表示したいんたけど何か良い方法ないかな? ソフトを立ち上げっぱなし→スクリーンセーバー起動→条件下でスクリーンセーバーkillバッチ→立ち上げてたソフトに戻る ってのにしたいのにkillバッチ→スタートメニューになってしまう あと、バッチを走らせると一瞬黒いcmd画面がでるのでvbs経由で画面を出さないようにしようとしたけどこちらもうまくいかない… スクリーンセーバー動いてるのに、 どうやってバッチ叩いてんの? さっぱりわからん 何かをトリガーにしてタスクから叩くって事じゃないかな 特定のキー操作で解除するタイプのスクリーンセーバーなのかな? でもそれならそれでkillするんじゃなくて該当のキーを送ればよいだけな気がするけど Windows7標準のmklinkでシンボリックリンクを作ると リンクのタイムスタンプ(作成、更新、アクセスいずれも)は リンク先ファイルのタイムスタンプに関係なくリンク作成時点のものになり 普通のファイルのようにはタイムスタンプを変更できないようだけど 変更する方法ある? ハードリンクなら同じものを見ることになるから勝手に揃うけど 使い分けの方針が定まらなくてあまり使ってない >>703 シンボリックリンクの実体はファイルだからSetFileTimeで変更できるらしいぞ らしいってのは俺がシンボリックリンクつかったことないからね Windows Vistaは2017年にサポートが終了しましたがWindows Server 2008向けのセキュリティ更新プログラムを手動でインストールすることができていました。 ところがどの順番でどれをインスコすればいいのか面倒、、、それを解決するバッチプログラムを作った方がいます。 バッチファイルの記述がフムフム、へぇ〜という感じで自分にはとても勉強になりました。興味ある方はどぞ 創造の柱 http://blog.livedoor.jp/pillars_of_creation/archives/1831755.html このスレで聞くべきなのか分かりませんが、Windowsで数千個のPDFを一括処理したいので、取りあえずここで聞いてみます。 PDFをAcrobatで開いた時のプロパティ(「文書のプロパティ」で、"表示"、"ページレイアウト"、"倍率"を設定できますが、 1つ1つ手作業で設定するのはさすがに無理です。 Javaの様なプログラミング言語でも、他のアプリでも何でもいいんですが、この文書のプロパティを一括で設定する方法って何がありますか? それってAcrobatのデフォルトの表示方法を変えればいいんじゃない? 変更前後のAcrobatのレジストリをエクスポートしてdiff比較してどこが変わってるか確認するのが最初にやることだろうね >>707 Acrobat側の表示方法を変えるのじゃ無く、PDF側で変えたい そもそもPDF側に表示方法が保存されてるものなの? 結局Acrobat側の問題じゃない? 「pdf コマンドライン ページレイアウト」でググったら cpdf (Coherent PDF Command Line Tools) を紹介するサイトが出てきた これ、見開きを縦スクロールにしたり単ページにしたりできて面白い "倍率" が 2017/10 の時点で無理らしいけど ID消して質問してるのがすげー腹立つな 本当に解決を望んでるなら逆にコテ付けるぐらいできんのか windowsってことだけどpdfいじるならMac OSのautomatorじゃね?知らんけど 今でもたまに使うけどUTF8系のスクリプトとの相性がめっちゃ悪いな いちいちコードページ指定するとなんかウィンドウが切り替わって重いし cmdをchcp 65001 (UTF8)で常用するって現実的じゃないよね? MSはレガシーのために保守してるだけだろ powershell使え 例えば、こんなバッチをutf-8で作成して実行する。 できたtest.txtを見たら1行しかない。なんでだ。 @echo off chcp 65001 call :test > test.txt exit :test echo テスト echo テスト このスレで、utf-8 のバッチファイルにするなら、 行末は半角英数な文字にしとけ というのを学んだ、>>262 からの流れ なんでなのかはいまだに知らない 2つめのechoがエラーになってるね echo テスト echo テスト と間に空白行を挟めば正常だがどういう理屈なのか分からん %2つというのは、何らかのエスケープですか? また、forを使うときにfor %iなどとしますが、%の意味がよくわかりません フォルダ内のファイルを連番つけてリネームする方法はわからないでしょうか forを使用してインデックスを連番として付与する感じだと思うんですが ファイルはこんな感じです 犬.txt 猫.txt 猿.txt >>720 %は互換性や拡張などのおかげで大変ややこしい事になっている 説明するには小一時間かかるのでここでは控える事にする >>720 %は変数を定義する時に使うよ %iで「iという変数」になるよ バッチプログラムで使う時は%%iにする必要があるよ https://www.pg-fl.jp/program/dos/doscmd/for.htm 「%」のページも読んだ方が良いよ >>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 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 コマンド [コマンド パラメーター] もしくはコマンドプロンプトに出力された文字列を出所問わず取得したい ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる