X



【.cmd】 バッチファイルスクリプト %13 【.bat】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
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/
0003デフォルトの名無しさん
垢版 |
2018/11/21(水) 15:10:24.99ID:ROx7bOng
>>1
いちおつ


ところで、最近、プロンプトの色が変わってしまったんだが直し方教えてください
くすんだ感じになってしまう

color 9f

とか明るい色が顕著
自分で加えた変更の何が影響したのかわからず、途方に暮れてます
0006デフォルトの名無しさん
垢版 |
2018/11/21(水) 15:54:50.45ID:waeO4Jak
powershellはここの板に別スレがあってここで取り扱う必用は無い
一方wshはもはや専用スレは無くこのスレに含めた形で残っている
0007デフォルトの名無しさん
垢版 |
2018/11/21(水) 23:59:36.40ID:VxDAgoaS
>>3 自己レスです

レジストリの
HKEY_CURRENT_USER\Console にある ColorTableXX で指定された
色 00BBGGRR がソレだったので何かが変だった訳でもなく、忠実に
この値を読んでいただけでした

黒をわざわざ 0c0c0c にしていたり、全テーブル 00 から 15 まで
全て変更が入っていたので、いつの間に変更したのかという疑問が
残りますが……
0008デフォルトの名無しさん
垢版 |
2018/11/22(木) 05:37:11.56ID:HUZaaTR+
>REG QUERY "HKCU\Console" /f ColorTable*

HKEY_CURRENT_USER\Console
ColorTable00 REG_DWORD 0x0
ColorTable01 REG_DWORD 0x800000
ColorTable02 REG_DWORD 0x8000
ColorTable03 REG_DWORD 0x808000
ColorTable04 REG_DWORD 0x80
ColorTable05 REG_DWORD 0x800080
ColorTable06 REG_DWORD 0x8080
ColorTable07 REG_DWORD 0xc0c0c0
ColorTable08 REG_DWORD 0x808080
ColorTable09 REG_DWORD 0xff0000
ColorTable10 REG_DWORD 0xff00
ColorTable11 REG_DWORD 0xffff00
ColorTable12 REG_DWORD 0xff
ColorTable13 REG_DWORD 0xff00ff
ColorTable14 REG_DWORD 0xffff
ColorTable15 REG_DWORD 0xffffff
0009デフォルトの名無しさん
垢版 |
2018/11/22(木) 06:45:17.58ID:y7NAvoby
>>6
> powershellはここの板に別スレがあってここで取り扱う必用は無い
別にここで取り扱えという話じゃなくて「使用も検討しましょう」って話な
PowerShell の話題が出たら誘導すればいいだけだし

> 一方wshはもはや専用スレは無くこのスレに含めた形で残っている
wshの専用スレがないのは需要がないからだろ
そんなものに対して使用を検討する必要なんてないと思うぞ
0010デフォルトの名無しさん
垢版 |
2018/11/22(木) 07:28:54.55ID:Q9Jr5DcP
>>8
デフォルト値ありがとうございます

実際にOSインストールしなおしての確認はしてないのですが
Win10_1809Oct_Japanese_x64.iso の install.wim の
install.wim\3\Users\Default\NTUSER.DAT
ハイブファイルのロードをしてみると変化していた方の配色と一致してました

OSクリーンインストール後、しばらく変化に気づいていなかっただけ、
という事のようです
少し透かしていたから 000000 と 0c0c0c の違いに気づくのもほぼ無理ゲー、
だったのも加味して……

スレ汚し失礼しました
0011デフォルトの名無しさん
垢版 |
2018/11/22(木) 08:20:54.79ID:HUZaaTR+
俺も以前に経験あるが何で勝手に変わるのか未だに不明
デフォにしたけりゃ"HKCU\Console"消して起動したらいいんだけど
0012デフォルトの名無しさん
垢版 |
2018/11/23(金) 06:41:38.84ID:Yr5PhtU+
>>8 だが
俺も"HKCU\Console"消して起動したら
ColorTable00 が 0x0 から 0xc0c0c になったよ
今はこれがデフォルトなんだな
0013デフォルトの名無しさん
垢版 |
2018/11/23(金) 07:03:12.22ID:Yr5PhtU+
dir | more でEnter押すと1行ずつ出てくるんだけど
前からこんな動作だったっけ?
dir /p みたいにページごとにスクロールしないのか?
ちなみにWin10Pro 1809 17763.107 だ
0014デフォルトの名無しさん
垢版 |
2018/11/23(金) 07:31:03.82ID:Yr5PhtU+
すまんhelp見たら
<ret> 次の行を表示します。
になってた。

あとスレチだが gpg -d がエラー出る...
0015デフォルトの名無しさん
垢版 |
2018/11/23(金) 13:03:06.27ID:H8vDP5fG
このスレってテンプレに「 次スレは>>970踏んだ人が立てましょう 」とかないんだね。
毎回同じ人が立ててるのかな?
0016デフォルトの名無しさん
垢版 |
2018/12/02(日) 11:33:28.29ID:WVaKBjKU
ffmpegで動画容量を減らしています
この先何度も使いそうなのでドラック&ドロップなどで簡単にしたいのでバッチファイルの作り方を教えていただけませんか
また,バッチファイルでなくとも他に良い方法などありましたらぜひお願いします

ffmpeg -i "sample.mp4" -b:v 500k -pass 1 output.mp4

ffmpeg -i "sample.mp4" -b:v 500k -pass 2 output.mp4

普段はこれを実行しています
0017デフォルトの名無しさん
垢版 |
2018/12/02(日) 14:26:12.73ID:uIlAasYL
シェルスクリプト・PowerShell もあるけど、
安全性のため、ダブルクリックでは動かない

ダブルクリックで動くのは、バッチファイルだけ
0018デフォルトの名無しさん
垢版 |
2018/12/03(月) 10:52:45.51ID:mYQmjn55
>>16
オイラはSendToにバッチファイル(のショートカットでもOK)入れて右クリックの送るから使ってる
C:\Users\ユーザ名\AppData\Roaming\Microsoft\Windows\SendTo

2-passは使ったことないけど、とりあえず >>16 の処理をするようになってるはず
適当なファイル名を拡張子batで保存して使ってちょ
書き込み時にインデント消えちゃうかもしれないけど、3行目の&&の前だけは先頭に空白1文字以上入れてちょ

for %%f in (%*) do (
ffmpeg -y -i "%%~ff" -b:v 500k -pass 1 -f mp4 NUL ^
&& ffmpeg -i "%%~ff" -b:v 500k -pass 2 "%%~df%%~pf%%~nf_output%%~xf"
)
pause

自動でウィンドウ閉じたければ最後のpauseはいらない
出力ファイル名は入力ファイル名_outputにしてるけど、お好みで変えればよい
複数ファイルも順番に処理するよ
0019デフォルトの名無しさん
垢版 |
2018/12/04(火) 18:23:57.45ID:YV7FMG5g
typeコマンドってパイプかますと出力が変わるんだな...
以前はこんなじゃなかったような気がするが?

>type a
abc漢字def

>nkf -SjO a b

>nkf -Js b
abc漢字def

>type b
abc4A;zdef

>type b | more
abc$B4A;z(Bdef
0020デフォルトの名無しさん
垢版 |
2018/12/04(火) 20:16:59.52ID:Mme7W69z
"C:\hoge.exe"というプログラムを再起動したくて

 taskkill /im hoge.exe /f
 start C:\hoge.exe

という2行のバッチを書いたら、hoge.exeがまだ終了しきってなくて起動しませんでした。
hoge.exeの終了にかかる時間が3秒だったり20秒だったりとまちまちなので
タスクリストから居なくなったことを確認してから起動したいのですが
どう書けばよいのでしょうか?
0022デフォルトの名無しさん
垢版 |
2018/12/05(水) 10:02:24.61ID:miUFx5r6
>>20
こんな感じでどうだろうか?

taskkill /im hoge.exe /f

:check_run
timeout /t 1 /nobreak >nul
tasklist | find "hoge.exe" >nul && goto check_run

start C:\hoge.exe
0024デフォルトの名無しさん
垢版 |
2018/12/05(水) 15:22:10.57ID:GaZgkwnu
今help見たら、まだ直ってねえ...
tasklist/?のフィルター名IMAGENAMは間違いだ...
for /f "skip=1" %%i in ('tasklist /fi "imagename eq hoge.exe"') do goto check_run
002720
垢版 |
2018/12/05(水) 22:04:34.15ID:82viBDdQ
みなさんレスありがとうございます!

明日職場で試してみますね。

恥ずかしながら自宅PCが古すぎてtasklistコマンドとかが無いので
(WinXP Homeです。Win7が故障中なので…)

どうもありがとうございました!
0030デフォルトの名無しさん
垢版 |
2018/12/06(木) 06:30:42.74ID:U/lGMKnD
XP Proにはあるんだが
XP HomeではPowerShellのGet-Processで代用できるらしいよ
PowerShell1.1以降らしいから、PowerShell2.0をインストールしないといけないけど
0031デフォルトの名無しさん
垢版 |
2018/12/06(木) 15:26:32.29ID:iJNEICpM
Sysinternals Suite にある、pslistを始めとするコマンド群を利用すれば、
XPでも同等のことは出来る
0032デフォルトの名無しさん
垢版 |
2018/12/06(木) 21:28:59.92ID:HLPPFLjR
XPの駆除には苦労した。
Vistaの切られぶりには辟易。
管理者って損な役回りだよなぁ…。

今は7の駆除中。
0033デフォルトの名無しさん
垢版 |
2018/12/06(木) 23:38:01.47ID:UfR2YFj9
>>18
ありがとうございます
レス内のものは上手く行きませんでしたが別でうまく行くものを作るためのヒントになりました
0035デフォルトの名無しさん
垢版 |
2018/12/07(金) 12:17:44.85ID:cJMcluJv
俺には何が原因か分からない
画面コンソール入力するたびに最下段にスクロールするし
スレチだけど
gpg -d で画面表示させるとエラー
gpg -h で画面表示させると文字化けまくり
cmd の表示関係が最近おかしい...
0037デフォルトの名無しさん
垢版 |
2018/12/07(金) 21:49:55.05ID:cUniS7mm
>>36
削られてるオプションもあるけど「出来ること」に関してはほぼその認識で合ってるんじゃないかな。
ただ、xcopy が対話指向なのに対して robocopy はバッチ指向になってる。(言い換えればログ指向)
コマンドを置き換えれば良いというものではない。場合によってはログが五月蠅い。

ま、今時、ネットワーク越しやバッチ処理でのコピーに xcopy は御法度レベルだから xcopy なんか忘れちゃってもいいと思う。
0038not 36
垢版 |
2018/12/07(金) 23:31:50.72ID:J47iFz0r
>>37
>ネットワーク越しやバッチ処理でのコピーに xcopy は御法度レベルだから xcopy なんか忘れちゃってもいいと思う。
そうだったのか、情報ありがとう
調べたらxcopyを使ったバッチファイルがあった、なおそ
0039デフォルトの名無しさん
垢版 |
2018/12/08(土) 20:14:50.36ID:Zhb2FJyz
xcopyはほぼフォルダ丸ごとコピー用途に使ってたから
/mirオプションで済むrobocopyの方が覚えやすくて助かるw
コピー自体も高速らしいし
004037
垢版 |
2018/12/08(土) 22:52:01.33ID:i9Z2WdJR
>>38
xcopy はコピー中にネットワークが切れたりするとファイルがシレっと壊れるのだよ。
ノートPCがバッテリーアウトでハイバネーションに入るような時に起こりやすい。

対話式に目で動作を見ながらの分にはいいけど、それ以外の用途にはお勧めしないのだ。
0042デフォルトの名無しさん
垢版 |
2018/12/08(土) 23:33:03.66ID:fChhgbp6
ネット越しだと、SSHが使えるrsyncがいいんだけど、
Windowsで使うにはcygwinが必要になるのでやや使いづらいかも

そこで、クラウドでも使えるrsyncという触れ込みのrcloneがいいかな
タイムスタンプだけが変更された時でも、実体をコピーすること無く、タイムスタンプだけを変更するなど、
それなりに賢い処理がされるようだ
もちろんローカルファイル同士でも使える

バッチによる基本的なバックアップ用途の使い方しかしていないけど、とにかく多機能でおすすめ
GoogleドライブやOneDriveなんかのクラウドへのバックアップも、バッチ処理で簡単にできる
004339
垢版 |
2018/12/09(日) 10:35:27.52ID:lZKvlyRa
>>41
過去にrobocopyのが速いみたいな記事を見た気がしたんだが
今探しても見当たらないので記憶違いかもしれぬ…
0044デフォルトの名無しさん
垢版 |
2018/12/12(水) 12:03:09.26ID:wwhUpKQ/
Windows 10 19H1 で notepad が
BOM無しUTF-8がデフォルト になるそうだな...
いっそのこと コマンド プロンプトも変えてくれ
0045デフォルトの名無しさん
垢版 |
2018/12/13(木) 07:50:54.80ID:3pDLloxA
バッチファイルの第一引数をファイル名にしたとして
ファイル名に&とか^が入るときどうやって処理すればいいの?
代入するとエスケープされて消えちゃうのよ。
0046デフォルトの名無しさん
垢版 |
2018/12/13(木) 09:07:24.92ID:J8CqZcRY
結局、BOM の有無を気にする開発者がいなかった。
欧米人には関係ないから

ただ、Explorer では、BOMが無いと、UTF-8・sjis の区別がつかないから、文字列で検索できなくなるから、
漏れは、Windows10・WSL・Ubuntu16.04 で、grep を使っている
0048デフォルトの名無しさん
垢版 |
2018/12/13(木) 16:46:34.51ID:H7Y/MSWd
>>45 バッチファイルに直接D&Dで起動用のバッチ
というか他の起動方法なら引数を引用符で囲むだけだし

@ECHO OFF
IF "%~1"=="1" SHIFT /1 & GOTO MAIN
SET "A=%CMDCMDLINE:"=*%"
SET "A=%A:~0,-1%"
FOR /F "tokens=2* delims=*" %%I IN ("%A%") DO SET "B=%%I" & SET "C=%%J"
SET E="%B%" 1
:NEXT_ARG
SET "A=" & FOR /F "tokens=*" %%I IN ("%C%") DO SET "A=%%I"
IF NOT DEFINED A %E%
IF "%A:~0,1%"=="*" (SET "D=*") ELSE SET "D= "
FOR /F "tokens=1* delims=%D%" %%I IN ("%A%") DO SET "B=%%I" & SET "C=%%J"
SET E=%E% "%B%" & GOTO NEXT_ARG

:MAIN
SET /A N=0
:LOOP
IF "%~0"=="" PAUSE & GOTO :EOF
ECHO ARG%N%=%0
SET /A "N+=1" & SHIFT & GOTO LOOP
0049デフォルトの名無しさん
垢版 |
2018/12/14(金) 07:43:35.08ID:0Ppktz+s
ありがとうございます。
0050デフォルトの名無しさん
垢版 |
2018/12/15(土) 01:06:37.50ID:1s8Yv8lB
dir ってオプション(スイッチ)の順番で表示が異なるのを発見
CD /D C:\
dir /AH /A-D
dir /A-D /AH
0053デフォルトの名無しさん
垢版 |
2018/12/16(日) 12:34:58.23ID:2Wn8M764
仕様がカオスになってるよね。
はやくLinuxcommandも標準対応して欲しい
0054デフォルトの名無しさん
垢版 |
2018/12/17(月) 00:07:47.83ID:C+acxNdu
>>53
DOSってMS最古だから、ビルベイツ謹製のコードか仕様が残っていて
今の社員は恐れ多くて変えられない
ということにしておこう
0057デフォルトの名無しさん
垢版 |
2018/12/17(月) 19:54:34.22ID:zeK+PGUB
>>43だけどやっぱわからん!
sendtoにバッチファイル入れといてフォルダを指定します。
指定したフォルダの名前をechoで表示したいんだけど&^がフォルダ名に付けられているとフォルダ名表示が出来ない。

batファイル &というフォルダを右クリック送るをした時

@echo off
echo "%~f1"  これは表示できる
set fname="%~f1"
echo "%fname%" &や^が消えてしまう

どうやったら代入ができるの?エスケープに置き換えも一文字分しかできないし。
0061デフォルトの名無しさん
垢版 |
2019/01/07(月) 13:47:43.45ID:ZTiiH/I2
バッチファイル中の*.*で、そんなファイルはないとエラーが出た
もう一度実行するとこれまでどおり問題なしに実行

windows更新の影響かセキュリティソフトのせいかも知れないが、
ウィルスがコマンドをすり替えている可能性もあるから、バッチ中のコマンドはパスも含めて
たとえばnotepadでなくC:\Windows\notepad.exeの方が安全だなと思った
0064デフォルトの名無しさん
垢版 |
2019/01/07(月) 17:05:59.89ID:ZNh/EsxI
色んなソフト入れると %PATH% が膨れ上がる
使わないパスが30個とか..
気味が悪いのでバッチの先頭に
PATH C:\WINDOWS\system32;C:\WINDOWS;
と書くようにしてる
0065デフォルトの名無しさん
垢版 |
2019/01/07(月) 20:11:25.89ID:xW7Pde1m
既に存在しないフォルダが環境変数PATHに設定されてるとコマンド検索がそこで止まってしまう
こんなのを使って時々確認するといい。
powershell $env:path -split ';'^|%{$_ ,(test-path $_ -patht cont ^)}
0066デフォルトの名無しさん
垢版 |
2019/01/11(金) 19:37:34.13ID:WNI2j4XF
遅延環境変数OFFでやると面倒だ
ONにするとパス名などの文字列の扱いが複雑化して読み取れないのが出る
0067デフォルトの名無しさん
垢版 |
2019/01/12(土) 00:39:03.28ID:IAz54C40
PowerShell で、$env:path -split ';' と打つと、

C:\WINDOWS\system32
C:\WINDOWS

Intel を除いて、これらが先頭に来る
0069デフォルトの名無しさん
垢版 |
2019/01/14(月) 09:23:20.28ID:e5YcHVOA
@echo off & set "p=%path%"
:v
for /f "delims=; tokens=1*" %%i in ("%p%") do set "p=%%j" & echo "%%i"
if defined p goto :v

おらの環境
"C:\Program Files (x86)\Common Files\Oracle\Java\javapath"
"C:\ProgramData\Oracle\Java\javapath"
"C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common"
"C:\Program Files (x86)\Intel\iCLS Client\"
"C:\Program Files\Intel\iCLS Client\"
"C:\WINDOWS\system32"
"C:\WINDOWS"
0070デフォルトの名無しさん
垢版 |
2019/01/14(月) 09:53:16.85ID:e5YcHVOA
マイクロソフトがどこまでチェックしているか知らんが
コマンド追加したら干渉する可能性はあるな
0071デフォルトの名無しさん
垢版 |
2019/01/20(日) 00:11:28.57ID:xs+avKSw
C:\HOGE
├─aaa
│ ├─old
│ │   aaa1.bat
│ │
│ └─src
│     aaa1.bat

├─bbb
│ ├─old
│ │   bbb1.bat
│ │
│ └─src
│     bbb1.bat

└─ccc
  ├─old
  │   ccc1.bat
  │
  └─src
      ccc1.bat


↑のoldフォルダとその中身を一括で削除したいのですが、コマンドでは難しいでしょうか?
0073デフォルトの名無しさん
垢版 |
2019/01/20(日) 00:15:44.50ID:xs+avKSw
↑たびたびすみません。
正確に言うと「HOGE配下に存在する"old"という名前のフォルダとその中身を全て削除する」です。
0080デフォルトの名無しさん
垢版 |
2019/01/20(日) 10:28:21.11ID:xs+avKSw
>>76
どうもありがとうございます!バッチリ削除できました。

>>78
私も>>78さんのコメントを読んで例えば"old2"という名前のフォルダがあったらこれも消えてしまうのかも?と思ったのですが、そんなことはありませんでした。
でも見た目でそのような疑問を覚える人もいるかもしれないなと思い、特に不要ではあるのですが"old"のあとに"\"を付けることにしました。
ありがとうございます。
0081デフォルトの名無しさん
垢版 |
2019/01/20(日) 10:36:33.72ID:xs+avKSw
でもrdはディレクトリ削除コマンドなんだから最後に"\"を付けるのは不自然か…
0082デフォルトの名無しさん
垢版 |
2019/01/20(日) 10:54:52.71ID:YWDkxQqJ
>>78 なぜ?
>>79 ワイルドカードじゃないとオプション /D は無意味
これでもいいが
FOR /R %%I IN (OLD) DO RD/S/Q "%%I" 2> NUL
0083デフォルトの名無しさん
垢版 |
2019/01/20(日) 11:08:28.37ID:pk2ilGy6
>>82
>ワイルドカードじゃないとオプション /D は無意味

ちゃんとフォルダのみをフィルタするよ、試してみてね
0084デフォルトの名無しさん
垢版 |
2019/01/20(日) 11:18:39.20ID:YWDkxQqJ
そうかな?
RD の前に echo 付けて見たら?
ファイルでも RD OLD がでるぞ
FOR のヘルプをよく見てね
0085デフォルトの名無しさん
垢版 |
2019/01/21(月) 21:18:15.33ID:9WBiq3dN
ざっくり言うと、
EternalForceBlizzard.bat C:\hoge
とかいうバッチが欲しいという中二に対して「俺なら!」「俺なら!」とやってた流れ…かな。

>>82
どうでもいいけど全部大文字とかやめれ。
内容は知らんが死ぬほどダサい。
0086デフォルトの名無しさん
垢版 |
2019/01/21(月) 21:58:45.27ID:rFmuVz+a
今後は小文字にするよ。気が変わるかもしれんが。
forの括弧内のファイルは存在しなくてもスキップしない
例外はワイルドカードで対象はファイル
/dだと対象はフォルダ
ただそれだけの話だ
0087デフォルトの名無しさん
垢版 |
2019/01/22(火) 11:52:34.58ID:dXptnPwJ
findstrの結果に文字列を連結したいのですがうまくいきません
どうしたらよういでしょういか?

cd /d %~dp0
type test1.txt | echo"りんご" & findstr "りんご" >> out.txt
0089デフォルトの名無しさん
垢版 |
2019/01/22(火) 15:31:22.37ID:dXptnPwJ
>88
ありがとうございます。

[りんご]
[りんごを含んだ文]
[りんごを含んだ文]
[りんごを含んだ文]

といった感じにでました。

[りんご][りんごを含んだ文]
[りんご][りんごを含んだ文]
[りんご][りんごを含んだ文]

という感じはならないでしょうか?
0090デフォルトの名無しさん
垢版 |
2019/01/22(火) 15:58:11.82ID:CTNOEPFx
call :a "りんご" test1.txt > out.txt & goto :eof
:a
for /f delims^=^ eol^= %%i in ('findstr %1 %2') do echo.%1 %%i
0091デフォルトの名無しさん
垢版 |
2019/01/22(火) 16:44:03.03ID:dXptnPwJ
>90
おお!、うまくいきました。ありがとうございます!。
エクセルの&のように簡単なのかと思ったら以外と複雑な処理で驚きです。
0092デフォルトの名無しさん
垢版 |
2019/01/22(火) 17:08:05.17ID:nMQEwTi4
単に行数を少なくするだけの&の使い方で
デバッグもメンテの面でもいい事はないんで行を分けて書いたほうがいい
0094デフォルトの名無しさん
垢版 |
2019/01/22(火) 18:02:51.94ID:nMQEwTi4
>>93
別に>>90に文句言ってるわけじゃなくて
質問者が&に感心してたので、質問者にアドバイスのつもりで書いただけ
0095デフォルトの名無しさん
垢版 |
2019/01/22(火) 18:15:04.06ID:CTNOEPFx
言いたい事は分かります。
はっきり言って自分用のバッチはこんな書き方はしません。
行数を抑える為に繋いでるだけなんで。
バランス見て改行します。すみません。
0096デフォルトの名無しさん
垢版 |
2019/01/22(火) 18:27:13.64ID:nMQEwTi4
って思ったら、質問者は&に感心してたわけじゃなくて
逆に&で簡単に書けない点が不満なんだな
0097デフォルトの名無しさん
垢版 |
2019/01/22(火) 19:15:10.41ID:ak2Ch+AT
Basic言語では&は文字列結合演算子だが
バッチスクリプトは出自からBasicじゃないので&は別の意味(ステートメントメント区切り)となる
文字列結合演算子自体が存在しない
0098デフォルトの名無しさん
垢版 |
2019/01/23(水) 13:46:03.43ID:HgbeZ9kI
昨日の質問者です、たびたびすみません

複数ワードを処理しようとして
call :a "りんご" test1.txt > out.txt
:a
for /f delims^=^ eol^= %%i in ('findstr %1 %2') do echo.%1 %%i

call :a "みかん" test1.txt > out.txt
:a
for /f delims^=^ eol^= %%i in ('findstr %1 %2') do echo.%1 %%i

としたところ、うまくいったのですが
これが5項目くらいになると
dos窓に「別のプロセスが使用中です」と表示されてしまいます。

なにかメモリ的なものがいっぱいになるのでしょうか?
回避方法はありますでしょうか?
0099デフォルトの名無しさん
垢版 |
2019/01/23(水) 15:17:41.73ID:HwNiCy+r
意味不明だが?

@echo off
call :a "りんご" test1.txt > out.txt
call :a "みかん" test1.txt >> out.txt
goto :eof
:a
for /f delims^=^ eol^= %%i in ('findstr %1 %2') do echo.%1 %%i
0100デフォルトの名無しさん
垢版 |
2019/01/23(水) 15:33:11.44ID:HwNiCy+r
今時、メモリ不足とか滅多に無いよ。
バッチで80byte文字列の一万個の配列変数とかやったことあるけど
問題なかったよ。
0101デフォルトの名無しさん
垢版 |
2019/01/23(水) 16:10:02.06ID:HgbeZ9kI
>99さんの書式にするとうまくいきました

おそらく私が

:a
for /f delims^=^ eol^= %%i in ('findstr %1 %2') do echo.%1 %%i

をいっぱい書いてしまったからかもしれません。
0102デフォルトの名無しさん
垢版 |
2019/01/24(木) 07:52:40.56ID:ElV7iNpQ
文字列:形式の「ラベル」はバッチファイル内でユニークにしてください。
今回のa:は共通サブルーチンなので、バッチ内で1つで良く、コードの最後に置きましょう。

サブルーチンを使う場合、メインルーチンのラストにはgoto :eof
を書くようにしてください。これが無いとメインが終わった後にまたサブルーチン処理が行われます。
0103デフォルトの名無しさん
垢版 |
2019/01/24(木) 07:58:36.47ID:ElV7iNpQ
またバッチ内で複数のサブルーチンを使いたい場合はそれぞれのサブルーチンの後にexit /bのコマンド行を付けてください。
exit /bによってメインルーチンに処理が戻ります。
これ無いと下の行に処理が遷移してしまいます
0105デフォルトの名無しさん
垢版 |
2019/01/24(木) 11:16:25.14ID:tFfJW+eT
cmdの基礎を勉強しろ
あまりにも質問のレベルが低いとレスがつかないと思え
0106デフォルトの名無しさん
垢版 |
2019/02/16(土) 02:44:12.08ID:Aqg/y48e
for %%I in (*.txt) do (
echo #%%I
)

*.txt だけでなく *.txt2 などもあれば表示する
.txt などの拡張子が3文字の時だけ4文字目以降を無視する
拡張子が2文字の時は問題なし
バグか仕様か
0107デフォルトの名無しさん
垢版 |
2019/02/16(土) 14:24:30.26ID:dbRt9asv
dir もね

他にもMS-DOS用の短い名前に反応したり
ワイルドカードは、いやらしい動作をするね
0111デフォルトの名無しさん
垢版 |
2019/02/16(土) 21:48:09.10ID:6/sri1HY
>>107
dirまでそうでしたか
知らなかったのは私だけで、みんな知ってたのですね

DOSの特別実装仕様ということにしておこう
0112デフォルトの名無しさん
垢版 |
2019/02/17(日) 08:58:17.36ID:2q4tHixb
*.txt2 のファイル名を dir/x で見ると
*~1.TXT とか *~2.TXT になってるから
dir *.txt
dir *txt
dir *xt
dir *t
で一致するということね
0113デフォルトの名無しさん
垢版 |
2019/02/17(日) 10:18:01.03ID:vf3NvI2M
やっても良いPCなら OS インストール直後に
>fsutil 8dot3name set
で set 1 をして 8.3名作成を無効化するけど

>fsutil 8dot3name strip
を実際にはしたことがない俺チキン
0115デフォルトの名無しさん
垢版 |
2019/02/18(月) 23:00:03.97ID:xTG5esR6
以下のように「C:\hoge」の下の全ファイルのファイル名(拡張子は除く)を
"aaa"に書き換えたいのですが、どのようなコマンドを書けば良いのでしょうか?


■書き換え前

C:\hoge
│ あああ.txt
│ いいい.xlsx

├─hage
│ ううう.xml
│ えええ.docx

└─hige
おおお.jpeg
かかか.gif


■書き換え後
C:\hoge
│ aaa.txt
│ aaa.xlsx

├─hage
│ aaa.xml
│ aaa.docx

└─hige
aaa.jpeg
aaa.gif
0116デフォルトの名無しさん
垢版 |
2019/02/18(月) 23:02:17.45ID:xTG5esR6
すみません、higeの下のファイル名がずれてしまいました。
正しくは↓です。


■書き換え前

└─hige
  おおお.jpeg
  かかか.gif


■書き換え後

└─hige
  aaa.jpeg
  aaa.gif
0118デフォルトの名無しさん
垢版 |
2019/02/18(月) 23:08:58.74ID:rXc7x2eo
for文とmv組み合わせでしょ
サイト2個検索した方が聞くよりはやくできるとおもうけど
なんで質問したの?
0120デフォルトの名無しさん
垢版 |
2019/02/19(火) 09:50:06.91ID:Hb9ZoB2m
話変わるが
for に /r を付けたら
%~nxi の引用符が何故かとれない

>for %i in ("abc") do @echo %~nxi
abc

>for /r %i in ("abc") do @echo %~nxi
"abc"

>for /r %i in ("abc*") do @echo %~nxi
abc
0121デフォルトの名無しさん
垢版 |
2019/02/19(火) 10:03:42.75ID:/Qrw8ZSg
管理者として実行したいアプリ、さらに優先度を低で起動させる方法ありますか?
さらにそれをスタートアップに登録したいんです
0123デフォルトの名無しさん
垢版 |
2019/02/19(火) 10:57:12.10ID:Hb9ZoB2m
start /LOW のコマンドのショートカットを
スタートアップのフォルダに入れりゃいいんじゃね
ショートカットの設定は管理者にして
0124117
垢版 |
2019/02/19(火) 20:46:10.94ID:kZ82VOHH
>>118
ネットで探したのですが、バッチファイルをやり始めて日が浅いので使うコマンドの見当も付きませんでした。
今日職場で必要だったので聞いてしまいました。

>>119
助かりました。
どうもありがとうございます。
0126デフォルトの名無しさん
垢版 |
2019/02/20(水) 08:00:48.35ID:vs0GH/UB
AzureAD、Office365を使うなら(Office365についてはGraphの使いこなしも必須)。バッチやVBSの代替としても必須。
「Powershellが出来る」だけではなくPowershellも活用し、なんの業務をしてたか?がスキルとなる基本的にはインフラ屋のスキルの一要素
0128デフォルトの名無しさん
垢版 |
2019/02/21(木) 18:42:23.51ID:WAQ7+H44
環境変数の中に=があると
変数参照が変な事になってくるな...

>set a=b=c

>echo %a%
b=c

>echo %a=b%
c
0129デフォルトの名無しさん
垢版 |
2019/02/21(木) 19:45:58.39ID:bhin4IwL
イコールは^つけないと特殊な動作するはず
0133デフォルトの名無しさん
垢版 |
2019/02/21(木) 22:19:20.44ID:WAQ7+H44
バッチでやって見た
set a=b^=c
echo %a%
echo %a=b%

結果
b=c
c

set "a=b=c" でも同じ
Microsoft Windows 10 Pro
10.0.17763 N/A ビルド 17763

>set a
a=b=c
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\ore\AppData\Roaming
0134デフォルトの名無しさん
垢版 |
2019/02/21(木) 23:16:08.70ID:WAQ7+H44
>>133
たった今、品質更新プログラムのインストールしました。
KB4487044 (OS ビルド 17763.316)
なんと正常になったようです

結果
b=c
ECHO は <OFF> です。
0135デフォルトの名無しさん
垢版 |
2019/03/01(金) 16:41:47.85ID:7J1MA7z+
1.batファイルで
start ***.bat
を実行してその***.batの中に
call ***.exe
があるんだけど
最初に実行するbatファイルでどうにか ***.exeを最小化で起動できますか?
0137デフォルトの名無しさん
垢版 |
2019/03/12(火) 10:13:24.40ID:2ZxzO4Nc
forで行取得して並列で処理してるんですが、一度にすべて実行するのでPCの負担が大きいです。
さらに回数指定するには、どうすればできますか?
0138137
垢版 |
2019/03/12(火) 11:09:28.51ID:2ZxzO4Nc
すみません。説明不足でした。
初めにforでテキストを取得しsetに割り当て、全てをコマンドとして生成して並列処理しています。
並列で3回ずつ実行し終了をループしたいです。
0140デフォルトの名無しさん
垢版 |
2019/03/12(火) 14:22:43.31ID:JT0qCUVC
FORでサブルーチンをCALLするようにして、
3回呼び出されたら実行するようにするとかかな
これ以上は元のバッチを見ないと何とも
0141デフォルトの名無しさん
垢版 |
2019/03/12(火) 14:35:25.41ID:ollYoz5v
並列処理ということは、非同期呼び出しを使ってるわけだから
その呼び出した処理の終了をどうやって感知するかが肝
多分プロセスの存在チェックでいけると思うがそういうのが過去ログにあったと思う
0142デフォルトの名無しさん
垢版 |
2019/03/12(火) 20:57:10.17ID:kFHhQjU8
んでもそんな高度な事がしたいならVCあたりで作っちゃいかんの?
0143デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:11:57.06ID:MfJOghkN
-- A.bat --
:loop
if "%~1" == "" goto end

call B.bat "%~1"

shift
goto loop
:end

-- B.bat --
--
if exist "%~dpn1_hoge.txt" (
set XXX=--option "%~dpn1_hoge.txt"
)
--

A.batに複数ファイルをD&DしたときにB.batのif existで指定したファイルがA.batに入力したファイルに1つでも存在すれば他の入力ファイルにも同じ処理が実行されてしまいます
これを回避するにはどうすればいいでしょうか?
0144デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:20:05.87ID:Gms0hgp4
毎回リセットしとけば?
b.batの先頭でset xxx=を書くとかb.batをsetlocal〜endlocalするとか
0145デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:26:03.45ID:Gms0hgp4
すまん良く読んでなかった
ファイルね
b.batで生成するのかな?
削除しちゃっても問題ないのならa.batの先頭でdelしちゃえば?
0146デフォルトの名無しさん
垢版 |
2019/03/14(木) 00:37:26.49ID:MfJOghkN
B.batは動画のエンコードに使っているバッチファイルの中身の一部で %~dpn1_hoge.txt があった場合はツールに追加のオプションを指定するようにしている感じです
0147デフォルトの名無しさん
垢版 |
2019/03/19(火) 11:54:10.54ID:hD2ftWP/
set day=3/19(火)
if 1==1 (
echo %day%
)

すみませんどなたか教えてください。
曜日の半角括弧のせいでif文が閉じられてしまうんだけど
どうやってエスケープすればいいんでしょうか?
0150デフォルトの名無しさん
垢版 |
2019/03/19(火) 12:57:54.34ID:dDtGuicR
>>147
こういう方法もある
変数dayの中に、二重引用符がなければ

set day=3/19(火)
if 1==1 (
for /f delims^=^ eol^= %%i in ("%day%") do echo %%i
)

これだとdayに & | > < ^ ( ) 等やばそうな文字が入っても大丈夫
0152147
垢版 |
2019/03/19(火) 13:11:02.99ID:hD2ftWP/
set day=3/19(火)
if 1==1 (
echo %day:~0,6%^)%
)

これでいけました。
>>150のも今後の参考にさせてもらいます。ありがとうございました
0154デフォルトの名無しさん
垢版 |
2019/03/19(火) 20:28:12.65ID:xvBmkr0d
>>147
echo出力だけなら環境変数を ""でくくった上で遅延展開する方法もある。
これだとほとんどすべての記号がそのまま出力される。例外として「!」は「^!」で、「%」は「%%」で、「^」「^^」などは要エスケープ。

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set "day=3/19(火)"
if 1==1 (
echo !day!
)
0159デフォルトの名無しさん
垢版 |
2019/03/21(木) 23:03:18.28ID:HPyHK69o
遅延モードでのエスケープの動作が面白い
setlocal enabledelayedexpansion
set "a=^x ^^ ^!"
set "b=^x ^^ ^y"
set "c=^x ^^ ^y" !
echo a=!a!
echo b=!b!
echo c=!c!

a=x ^ !
b=^x ^^ ^y
c=x ^ y
0160デフォルトの名無しさん
垢版 |
2019/04/10(水) 22:17:03.83ID:dRPi9Fbo
コマンドプロンプトで以下のpowershellコマンドを実行すると曜日が英語で表示されるのですが、
ここで表示された"Wednesday"を呼び出し元であるコマンドプロンプト側の変数に取得するのは難しいでしょうか?
曜日の判定に使いたいのです。

  C:\>powershell "(get-date).DayOfWeek"
  Wednesday
0163デフォルトの名無しさん
垢版 |
2019/04/17(水) 14:41:43.82ID:SVkPhkuc
読み取り専用属性付加と解除についてお願いします

ATTRIB +R hoge.txt
この場合hoge.txtをバッチファイルにドロップしたときhoge.txtの属性が読み取り専用になりますが

ATTRIB +R *.txt
とすると一つのファイルをドロップしただけでディレクトリ内の全てのテキストファイルの属性が変わってしまいます
バッチファイルへドロップしたファイルのみ属性を変えたいのですがこういうことは可能でしょうか?
0164デフォルトの名無しさん
垢版 |
2019/04/17(水) 15:11:44.94ID:SVkPhkuc
>>163です
バッチファイルにファイル名を指定してしまうと同一名のファイルしか処理できませんが
ファイル名が異なっていてもドロップしたファイルのみ属性変更したいのです
0166デフォルトの名無しさん
垢版 |
2019/04/17(水) 15:59:23.64ID:SVkPhkuc
>>165
ATTRIB +R

これだけでいいのでしょうか
試してみましたが一つのファイルをバッチファイルへドロップすると
ディレクトリ内の全てのファイルが属性変更されてしまいます
0167デフォルトの名無しさん
垢版 |
2019/04/17(水) 16:34:46.90ID:HAjihGMm
>>166
ATTRIB +R %1

引数のファイルだけ属性を変える
引数が無い場合は全てのファイルになるので
ガードは付けた方が良いと思う
0168デフォルトの名無しさん
垢版 |
2019/04/17(水) 17:06:43.84ID:SVkPhkuc
>>167
%1 とすることでドロップした一つのファイルが読み取り属性変更できるようになりました
二つとか三つとか複数ファイルはできないのですよね
皆さんありがとうございました
0170デフォルトの名無しさん
垢版 |
2019/04/17(水) 18:03:53.01ID:mAjziF7r
バッチファイルの図形プログラミング作ったら広告収入入ると思いますか?
0171デフォルトの名無しさん
垢版 |
2019/04/17(水) 18:18:21.55ID:QABBLuNd
俺のところじゃ>>169はエラーになる
for %%i in (%*) do attrib +r %%i
まあファイル名によってはこれもダメだけど
0173デフォルトの名無しさん
垢版 |
2019/04/17(水) 21:07:05.52ID:3cAVwUGz
複数ファイルドロップするなら shift でループが簡単だと思うけど何か落とし穴ある?
0174デフォルトの名無しさん
垢版 |
2019/04/18(木) 19:59:48.99ID:pUSpmyse
ファイルドロップで落とし穴があるとしたら >>45 みたいな引数の時
>>48 を参考にすると

@echo off
set "a=%cmdcmdline:"=*%"
set "a=%a:~0,-1%" & set "e="
set "c=" & for /f "tokens=2* delims=*" %%i in ("%a%") do set "c=%%j"
:x
set "a=" & for /f "tokens=*" %%i in ("%c%") do set "a=%%i"
if "%a:~0,1%"=="*" (set "d=*") else set "d= "
set "b=" & set "c="
for /f "tokens=1* delims=%d%" %%i in ("%a%") do set "b=%%i" & set "c=%%j"
if defined b set e=%e% "%b%" & goto x
for %%i in (%e%) do attrib +r %%i

でもこれファイルドロップでしか使えない
0175デフォルトの名無しさん
垢版 |
2019/04/19(金) 16:41:41.89ID:nzBF9sby
batのコマンドのタイトルバーに
「管理者: 」
の表示を消すこと出来ないのでしょうか?
0177デフォルトの名無しさん
垢版 |
2019/04/19(金) 18:58:50.77ID:FmrBk+Vp
スレチと怒られそうだが

--- change_wnd_title.uws ------
DEF_DLL SetWindowTextA(HWND, STRING):BOOL:user32.DLL
DIM old_title = PARAM_STR[0]
DIM new_title = PARAM_STR[1]
DIM idwnd = GETID(old_title)
IFB -1<idwnd THEN
SetWindowTextA(IDTOHND(idwnd), new_title)
ENDIF
---------

C:\UWSC\UWSC.exe C:\TEST\change_wnd_title.uws "管理者: test" "ABC"
を管理者権限で実行
「管理者:」 と「test」 の間にスペースが2つある点に注意

べつにWin32apiが使えればほかのスクリプトでもいいが
すでに配布が終了している(?)UWSCをすすめるのは
とてもにコンパクトで気軽に試しやすいため
以下のレスにあるDL先は公式リンク
使うのはFree版でよい
http://egg.2ch.net/test/read.cgi/software/1533818531/3
0178デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:14:57.50ID:5yrPogsy
>>175
例えば d:\hoge\a.bat を実行するなら

ショートカットの新規作成でコマンドは
cmd /c start "ABC" /d "d:\hoge" a.bat
ショートカットのプロパティで
実行時の大きさは「最小化」
詳細設定で「管理者として実行」

このショートカットを実行すると
a.bat が管理者として実行されて
タイトルは ABC のみになる
0179デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:49:09.78ID:5yrPogsy
>>178
念のため書いておくが
バッチの中で
title xxx
と書くと「管理者:xxx」
となるので台無し
バッチの title コマンドは消せ
それが出来ないなら俺は知らん
0180デフォルトの名無しさん
垢版 |
2019/04/19(金) 23:47:56.76ID:UTkV4PFm
あのさ
もう設計書はあるからバッチ作ってって言われて設計書見たんだが
「%0\..\xxx\yyy.batをコールする」とか書かれてて腰折れそうなんだけど…
0181デフォルトの名無しさん
垢版 |
2019/04/20(土) 00:03:36.64ID:oEi+Bse9
やりたい事が書いてあるかどうかだな
設計書作る手間で自分でかけとも思うけど 

外注なら設計書から作りましょうねと諭して工数確保だな
0182デフォルトの名無しさん
垢版 |
2019/04/20(土) 00:08:13.21ID:vpsjY4OY
>>181
まあやりたい事分かるからこっちで直して
これでいいですよね?って聞くつもりだけど
細かく書いといて間違えてるのやめてほしい…
0184179
垢版 |
2019/04/20(土) 04:50:04.97ID:HO8cTApa
たぶん>>121の奴だろ
胡散臭い
0197デフォルトの名無しさん
垢版 |
2019/05/19(日) 00:27:10.87ID:p20+5ZYI
Win10で、.(ドット)から始まる4文字以上のフォルダを再帰的に削除したいのですがうまくいきません

for /d /r %%d in (.????*) do rmdir /s /q "%%d"

フォルダ名をスペースおきに書くと削除できますがワイルドカードを使って処理できないものでしょうか
0200デフォルトの名無しさん
垢版 |
2019/05/19(日) 11:40:23.60ID:C4jenAHt
>>197

for /d /r %%i in (.*) do set "a=%%~fi" & call :x "%%a%%"
pause & goto :eof
:x
set "b=%~nx1"
if not "%b:~4,1%"=="" rd /s /q %1
0201197
垢版 |
2019/05/19(日) 12:35:02.55ID:p20+5ZYI
>>198-199
>>200
ありがとうございます!

rmdirをechoに置き換えて確認してみましたところ、>>200 様ではフォルダ名を取得できませんでした
>>198-199 様で対象にしたいフォルダ名を取得できましたのでこちらを使わせていただきます
ありがとうございました
0202デフォルトの名無しさん
垢版 |
2019/05/19(日) 13:00:03.54ID:C4jenAHt
>>201
なにを言ってるのか意味不明だな?
>>200 の rd を echo rd に変えたのなら問題ないだろ

>>198 を使うなら /f "delims=" にしろよ?
あと、>>198 だと \.12\abc とかも消えるぞ
0204デフォルトの名無しさん
垢版 |
2019/05/20(月) 07:05:59.13ID:/nt8UTBS
for /f "delims=" %%i in ('dir/adh/s/b .*') do (
set "a=%%~nxi" & call set "a=%%a:~4,1%%"
if defined a if exist "%%i" rd/s/q "%%i")
0205デフォルトの名無しさん
垢版 |
2019/05/26(日) 10:45:56.66ID:nyCVecKy
7-Zipスレからこちらに誘導されてきました

バッチファイルを実行して
指定したフォルダを7z圧縮し別の指定した場所へ保存する方法教えてください
0209デフォルトの名無しさん
垢版 |
2019/05/26(日) 17:24:55.92ID:iePtiDR/
>>205
7-Zip のパスは自分の環境に合わせる

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files (x86)\7-zip;%path%
set /p i=圧縮するフォルダのフルパス=
set "i=%i:"=%"
set /p o=書庫を作成するフォルダのフルパス=
set "o=%o:"=%"
set /p n=書庫名(拡張子なし)=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause
0210デフォルトの名無しさん
垢版 |
2019/05/26(日) 18:42:28.21ID:nyCVecKy
>>209
ありがとうございます

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set /p i=Z:\TE=
set "i=%i:"=%"
set /p o=Z:\zz=
set "o=%o:"=%"
set /p n=a=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause

7-Zip のパス
C:\Program Files\7-Zip

ZドライブTEフォルダを圧縮
Zドライブzzフォルダに作成
書庫名aにしてみましたが動作しませんでした
誤った箇所ありますでしょうか
0211デフォルトの名無しさん
垢版 |
2019/05/26(日) 19:22:25.25ID:4n4gfKEy
>>210
書き換えないといけないのは7zipのパスのところだけであとのところはいじっちゃだめ
なので↓をメモ帳に貼り付けて適当な名前のbatファイルに保存が正解

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set /p i=圧縮するフォルダのフルパス=
set "i=%i:"=%"
set /p o=書庫を作成するフォルダのフルパス=
set "o=%o:"=%"
set /p n=書庫名(拡張子なし)=
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause
0213デフォルトの名無しさん
垢版 |
2019/05/26(日) 19:35:30.91ID:nyCVecKy
>>211
>>212
これでできました

@echo off
path C:\WINDOWS\system32;C:\WINDOWS;
path C:\Program Files\7-Zip;%path%
set i=Z:\TE
set o=Z:\zz
set n=a
for %%A in ("%i%") do set "d=%%~nxA" & cd /d "%%~dpA"
7z a "%o%\%n%.7z" "%d%"
pause

自分のような者に教えていただきありがとうございました
0214デフォルトの名無しさん
垢版 |
2019/05/30(木) 23:24:33.44ID:D3n586fF
CMDの画面でこういうのを入力して実行したら
FOR /L %I IN (1,1,20) DO @CALL ECHO %I
画面の上のタイトルに文字が
うじゃうじゃ出て来るのはなぜ?
0215デフォルトの名無しさん
垢版 |
2019/06/01(土) 22:51:37.17ID:cR7U/Ve2
最近の発見
remの前に空白をおける

: でラベルを示すが、:の前後に複数の空白、タブ、全角空白があってもよい
: タブ abc

またラベルの後の空白以降の文字列は無視するのでコメントを書ける
: abc エラーの場合

まあ、あまり使うところないけど
0216デフォルトの名無しさん
垢版 |
2019/06/02(日) 00:30:45.28ID:0ZBCelud
最後のは割と便利そうだけど
現場だとコメントはREM使えっていうコーディング規約に阻まれそうだw
0217デフォルトの名無しさん
垢版 |
2019/06/02(日) 03:07:05.57ID:rFF/uYB6
>>214
そもそも call の引数はバッチファイル名かラベルだ。
それ以外の、内部コマンドや外部コマンドじゃない。
そんな使い方、help のどこにも書いてない。
一見、正常に動作している様に見えるが、
内部では子プロセスが異常終了している。
だからタイトル名に子プロセスの残骸が残る。

call set なども動作はするが邪道。
0218デフォルトの名無しさん
垢版 |
2019/06/04(火) 23:08:45.76ID:YyzuHNes
>>215
REM は「コマンド」だから前に空白が置ける。それは当然として。

ラベルをコメント代わりに使うのは止めとけ。
for や if コマンドの中で「インテンドを使って」コメントに使おうとすると弾かれる。
大人はバッチのコメントは REM で書くものだ。

Intel のドライバーインストーラーのバッチは奇麗だと思うぞ。
0219デフォルトの名無しさん
垢版 |
2019/06/09(日) 19:33:03.04ID:ESLww06V
変数のサイズの最大値って何バイトなんだろう

@echo off
setlocal enabledelayedexpansion
set "a=x"
for /L %%i in (1,1,12) do set "a=!a!!a!"
set "b=x"
for /L %%i in (1,1,13) do set "b=!b!!b!"
if !a!==!b! (echo "a=b") else echo "a<b"
pause

結果は
"a=b"
0221デフォルトの名無しさん
垢版 |
2019/06/10(月) 07:14:20.96ID:24zpPZFc
https://www.atmarkit.co.jp/ait/articles/1510/30/news041.html
内部的には1つの変数当たり最大32767文字
コマンドプロンプトの入力行は最大で8190文字
システム環境変数やユーザー環境変数の最大値は約2000文字(setxコマンドでは最大1024文字)

@echo off &setlocal
set a=x
set b=x
set /a i=2
:LOOP
set a=%a%x
echo %i%
if not %a%==%b% (
set b=%a%
set /a i+=1
goto :LOOP
)
pause
速くて正確ではないけど4093くらいで落ちた
コマンドの制限に掛かるみたいやね
0223デフォルトの名無しさん
垢版 |
2019/06/10(月) 15:28:36.17ID:q9TwxOtc
>>221
こういうのって統一して何バイトって決めないとやばくないのかな
windowsバージョン、英語、日本語、ヒンズー語など言語で微妙に変化すると、
おかしなことがおきたり、ウィルスの侵入口に利用される
0224デフォルトの名無しさん
垢版 |
2019/06/10(月) 18:52:33.54ID:acT05/Jv
遅延展開では変数名1文字なら値は8189文字まで。半角全角は無関係。
変数名が1文字増えると値の最大値は1文字減る
set "a=!b!" の様に二重引用符で囲むと最大値は2文字減る
遅延じゃないと a=%b% 以外のコマンドラインの文字数分が更に減る
変数 a が5000文字の場合
if %a%==%a% echo ng は落ちるが
if !a!==!a! echo ok は落ちない
0225デフォルトの名無しさん
垢版 |
2019/06/10(月) 18:58:22.71ID:OlE51f/u
>>223
そもそもそんなギリギリまで使う方がおかしい
あとウィルスとかのセキュリティの話はまた別の話
0227デフォルトの名無しさん
垢版 |
2019/06/10(月) 20:08:18.95ID:8z0TGIdq
穴だらけなのかもしれないが、外部に開いた穴は無いんで
悪用されるにはその前に侵入を許してしまってる必用がある
まあ侵入されたあとにコマンドプロンプトを使うようなウィルスはあるかは知らないけど
0228デフォルトの名無しさん
垢版 |
2019/06/11(火) 05:43:03.21ID:mwwG6pNT
ワンラインで8kか
フルパス200文字位のファイルを40個D&Dしたらもうパンクか
ヘタレ過ぎる
0229デフォルトの名無しさん
垢版 |
2019/06/11(火) 16:08:50.98ID:AKGG1UAL
初心者故説明不足でしたらご指摘ください。
調べてもわからなく、ご教示いただけないでしょうか。

やりたいこと
Windowsアップデートのインストール一覧のうち
2019年分のみ抽出したい。

やったこと
一覧を取得するコマンドで情報をテキストファイルに出力。
その後findstrで2019分のみを抽出しようとしたけど
抽出出来なかった。

実行コマンド
Windowsアップデート一覧取得
wmic qfe get InstalledOn,HotFixID > aaa.txt

抽出コマンド
findstr "2019" aaa.txt

抽出コマンド実行後、結果が帰って来ませんでした。
なぜ結果が帰って来ないのかが全くわかりません。
どうか、対処法をご教示いただけないでしょうか。
0231デフォルトの名無しさん
垢版 |
2019/06/11(火) 16:30:25.48ID:SBjduyI+
wmicはリダイレクトするとUTF16LEになるから
230みたいに文字コード変換するか、パイプで
wmic qfe get InstalledOn,HotFixID | findstr /n "2019"
0233デフォルトの名無しさん
垢版 |
2019/06/11(火) 16:53:09.70ID:AKGG1UAL
>>230
>>231
ご教示頂きましてありがとうございます!
文字コードは盲点でした。もっと勉強します。
教えて頂いたコマンドで自身の望む結果が帰って来ました。
ありがとうございます!
0234デフォルトの名無しさん
垢版 |
2019/06/13(木) 10:13:44.37ID:P3O2UGUp
Explorerから「送る」SendTo で使うバッチの中の pushd "%~dp1" が失敗するケースて有り得る?
送るから使うって事はアクセス出来てるはずなので失敗する事はないと思うんだけど
pushd "%~dp1"||exit とか失敗した場合の処理書いといた方が良いのかな
0235デフォルトの名無しさん
垢版 |
2019/06/13(木) 12:37:34.91ID:qazE1A0w
>>234
パスの中に全角スペースが入っていて半角スペースが入ってない場合なんかは失敗するんじゃないかな
0236デフォルトの名無しさん
垢版 |
2019/06/13(木) 14:43:51.05ID:rRFcU9uI
>>234
フルパスに半角スペースが無くて、それ以外の文字で区切られた場合、
区切られた位置が親フォルダだったら、
さらにその親に移動するだけで、エラーにもならない
0237デフォルトの名無しさん
垢版 |
2019/06/13(木) 14:50:46.43ID:P3O2UGUp
>>235
その問題、失念してた。ありがとう
パスに半角スペースが無くて、全角sp" "、コロン","、セミコロン";"、ハット"^"、イコール"=" の何れかが有る時だね
半角sp有る無し関係なく引数全部""括るようにすれば良いのにまだこの問題残ってたんだね
意図しない動作ではあるものの最初にデリミタ文字を含むフォルダの親フォルダにカレント移動して pushd 自体は成功する
pushd が失敗する事例を知っていたら教えて欲しい
この問題は対応面倒なのでパスに半角スペースを含めるようにして対処するよ
0238デフォルトの名無しさん
垢版 |
2019/06/13(木) 15:04:31.95ID:rRFcU9uI
引数いくつか知らんが pushd "%~dp2" は失敗するだろ。
引数1個限定なら %2 が有れば exit するとか。
あるいは >>48 を参考に
0239234
垢版 |
2019/06/13(木) 16:36:42.36ID:P3O2UGUp
送るから使う前提で
pushd "%~dp1"||エラー処理
のエラー処理を書く意味あるかな?てのが聞きたかった事なんだ
まあおまじない的にpause&exitしとくよ。ありがとう
0240デフォルトの名無しさん
垢版 |
2019/06/13(木) 17:10:58.72ID:rRFcU9uI
引数全部で
if "%~dp1"=="%~dp2"
if "%~dp1"=="%~dp3"
if "%~dp1"=="%~dp4"
とか確認すりゃ問題ない
0242デフォルトの名無しさん
垢版 |
2019/06/14(金) 15:25:04.04ID:/ScwnRxc
誰もツッコミ無しか
SendTo とか D&D は何もしなくても自動的に
送り側のディレクトリに移動するんだが
0243デフォルトの名無しさん
垢版 |
2019/06/14(金) 15:52:59.01ID:/ScwnRxc
SendTo にバッチ本体じゃなくて
ショートカットを入れたのかね
でもプロパティの作業フォルダを空にすればいい
怪しげな引数を利用するよりマシだろ
0244デフォルトの名無しさん
垢版 |
2019/06/15(土) 09:44:04.71ID:wrdBniJb
7-ZIPの 7za.exe でワイルドカード使ったときにサブフォルダを除外するにはどうしたらいいでしょうか?
-r-を付けてもなぜか効かないんですが

7za.exe a XXX.zip -r- *
0245デフォルトの名無しさん
垢版 |
2019/06/15(土) 12:34:19.95ID:/kIGVJHV
>>244
7zaは経験ないが7zと同じだろう
引数に*としたらサブディレクトリも含む
サブディレクトリを指定したら、それ以下の全部を含む
そこでスイッチは関係ない
ファイルだけ圧縮したいなら

@echo off
path C:\Program Files\7-Zip;C:\WINDOWS\system32;C:\WINDOWS;
if exist archive.7z del archive.7z
set a=
setlocal enabledelayedexpansion
for %%i in (*) do set a=!a! "%%i"
7z a archive.7z !a%!
pause
0247デフォルトの名無しさん
垢版 |
2019/06/15(土) 13:27:41.74ID:/kIGVJHV
>>245はファイル名に!^があると誤動作するので

@echo off
path C:\Program Files\7-Zip;C:\WINDOWS\system32;C:\WINDOWS;
if exist XXX.zip del XXX.zip
for %%i in (*) do 7za a XXX.zip "%%i"
pause

にした方がいいかもね
ちなみにInfo-ZIPのzip.exeでは
zip XXX.zip *
だけでいいが空のサブディレクトリを作成する
0248デフォルトの名無しさん
垢版 |
2019/06/17(月) 08:25:16.99ID:gSWoSWwj
.commandでターミナルを開いてpython3 /hoge/test.pyを入力、エンターを送信してpyファイルを実行したいのですがご教授ください。m(_ _)m

echo python3 /hoge/test.pyとするとターミナルに入力はされるのですが、pythonが実行されません。

ちなみに.batでは、
cd C:\hoge\
cmd /k python test.py
でpythonを実行する事ができました。

.commandで同じ事をするにはどうすればいいでしょうか?
0249デフォルトの名無しさん
垢版 |
2019/06/17(月) 13:48:44.19ID:gSWoSWwj
248です
解決しました。m(_ _)m

echoなんか付けずに

python3 /hoge/test.py
でpythonが実行できました。ありがとうございます。
0250デフォルトの名無しさん
垢版 |
2019/06/17(月) 18:30:49.93ID:/bUEZ7B5
バッチファイルからbeep音を出す

echo ^G >beep.bat
^G は コントロールキーとG

beep.batを実行すると音は出るが、エラーも出るので
type beep.bat
のほうがよい

beep.bat 2>nul
でエラーは消えるはずだが、なぜか音も出ないことがある

こういう基本コマンドがなぜかない
0251デフォルトの名無しさん
垢版 |
2019/06/17(月) 21:28:51.00ID:KEFOQI4b
>>250
beep.bat
でエラーが出るのは当然

beep.bat の中身は 「あ」 と一文字書いてあるのと同じようなものだから
コマンドになってない

だから
echo ^G> beep.dat
echo type beep.txt> beep.bat

とするか

echo @echo ^G> beep.bat
とすれば

beep.bat実行でエラーは出ない

ちなみに@echoとしてechoの頭に@をつける理由は
そうしないと、
実行コマンドが表示される時点で一回音が鳴り
echo が実行されることによって音が鳴るので
結果として2回音が鳴ることになるため
0252デフォルトの名無しさん
垢版 |
2019/06/17(月) 22:13:21.14ID:KEFOQI4b
無料のエディタでも制御文字を扱えるものがあるので
そういったものを使うと便利かと思います

たとえばNotepad++では制御文字を表示することができます
https://www.howtonote.jp/notepadplusplus/install/index10.html
入力は編集-文字コード表から

サクラエディタは制御文字を入力できるのに表示する方法はわかりませんでした
(自分はユーザではなく詳しくないので実際はあるのかもしれない)
http://sakura-editor.sourceforge.net/htmlhelp/HLP000255.html
0253デフォルトの名無しさん
垢版 |
2019/06/17(月) 22:46:13.03ID:kzHmUXK8
トリッキーだが、コントロールコードを直接書かないで実現することもできるね
ここの過去ログ%11にあったけど
for /f "delims=0" %%I in ('cmd /u /c echo 〇') do set BEL=%%I
echo %BEL%
0254デフォルトの名無しさん
垢版 |
2019/06/17(月) 23:09:42.80ID:+j+1wiRe
バッチにバイナリエディタで入力したら
どんな値でも変数に代入出来るのかな?
0257デフォルトの名無しさん
垢版 |
2019/06/18(火) 19:33:08.53ID:KnqBLmEX
>>251
なるほど、どっちもありですね

echo ^G> beep.dat
echo type beep.dat> beep.bat

echo @echo ^G> beep.bat
@echo のこんな使い方は初めて見た、知らなかったです
0259デフォルトの名無しさん
垢版 |
2019/06/23(日) 12:23:35.72ID:Lc+3aX4/
>>258 そこに書いてある

Microsoftはまた、Linux用のWindows Subsystem(WSL)の
パフォーマンスを向上させるために、
完全なLinuxカーネルをWindows 10に搭載することに取り組んでいます。

こっちの方が気になるなあ
0261デフォルトの名無しさん
垢版 |
2019/06/25(火) 00:46:23.52ID:6j3DQJ1O
Windows7からWindows10に変えたら、IME単語登録用ソフトのIMECが動かない。
神は死んだ・・・
0262デフォルトの名無しさん
垢版 |
2019/06/25(火) 19:20:48.71ID:sBqqHKRF
chcp 65001
if "hoge"=="hoge" (
echo あああ
echo いいい
)
pause

上みたいなbatをUTF-8で保存して実行すると
'o' is not recognized as an internal or external command,
と言われてエラーになるんですが何故ですか?
0267デフォルトの名無しさん
垢版 |
2019/06/25(火) 20:18:26.26ID:sBqqHKRF
>>265
レスありがとうございます
それだとエラーは出なくなりました
でもなんでこんな訳のわからない動作をするのかがわかりません
0268デフォルトの名無しさん
垢版 |
2019/06/25(火) 20:34:02.78ID:O4gheXA8
上手く動作しないという事はバグじゃないですかね
それ以上はcmdの作者じゃないので分からん
0269デフォルトの名無しさん
垢版 |
2019/06/25(火) 20:49:18.67ID:yTOc80/J
そもそもUTF-8保存バッチなんてまともに動くの見た事無い。
バッチはUS-AsciiかシフトJIS保存が安全。いくらchcpでコードページが動かせようとも
0271デフォルトの名無しさん
垢版 |
2019/06/25(火) 21:18:10.64ID:O4gheXA8
ユニコードでしか表示できない文字を表示したいならともかく
"あああ" とか "いいい" じゃ全く意味が無いな
0272デフォルトの名無しさん
垢版 |
2019/06/26(水) 07:19:54.19ID:/FHvjGPn
やはりbatをUTF-8で動かすと色々不安定みたいですね
素直にShift_JISで書くことにします
0275デフォルトの名無しさん
垢版 |
2019/06/26(水) 14:39:32.78ID:wh3oZ78w
シフトJISで表せない文字の例

@echo off
chcp 65000 > nul
set a=+nddRZwDA-
chcp 932 > nul
set a1=%a:~0,1%
set a2=%a:~1,1%
set a3=%a:~2,1%
echo 森%a1%外の「%a1%」
echo %a2%田百閧フ「%a2%」
echo アクセント符号付きのアルファベット「%a3%」
pause > nul
0277デフォルトの名無しさん
垢版 |
2019/06/26(水) 20:16:33.91ID:wh3oZ78w
ユニコードのバッチでいいなら必要ないな
echoは行末に半角スペース付けると多分ok
setは二重引用符で囲めばいい
0278デフォルトの名無しさん
垢版 |
2019/06/27(木) 00:26:23.36ID:65pELY4n
会得したところで今後の人生に役に立たない、もしくは自分の仕事を受け継いだ「標準的な知識の」人間に理解できないことはしない方がいい。
一子相伝の拳法とかじゃねーんだから。

バッチスクリプトに限らず、仕事でそういうことを意識できない奴は、大抵、後から見て自分自身でも読めないコードを書くものだ。
0279デフォルトの名無しさん
垢版 |
2019/06/27(木) 00:27:58.62ID:65pELY4n
このスクリプトは自分で終わり…
とかいう書き捨てスクリプトなら大いにやって良いと思う。

使い終わったらちゃんと捨てとけよ。
0280デフォルトの名無しさん
垢版 |
2019/06/27(木) 04:32:59.89ID:41DSIiqO
この 低レベルに合わせる事こそ唯一の原則 みたいな風潮すごいイヤ
こんなとこまで啓蒙しなくていいよ気持ち悪い
0281デフォルトの名無しさん
垢版 |
2019/06/27(木) 04:53:05.65ID:6UZ42pkx
>>279 板汚し失礼した。使わないが捨てる。
よく考えたらutf-8のバッチで変数に代入した後、
sjisのバッチに移ればいいだけだった。
utf-8のバッチは不安定だが代入だけなら大丈夫だろう。
なんで気がつかなかったんだろう。

>>280 ありがとう。
0282279
垢版 |
2019/06/28(金) 00:34:45.44ID:khpSyJhs
>>280
低レベルに合わせるわけじゃねーよ。

現代的なスクリプト言語を学んできたような人間に対して
「バッチスクリプトだけで通じる特殊で小賢しいハック」
を読ませたり書かせたりするべきじゃない、自分だけに留めとけ、結局誰得になる、って話が何故分からないかな?

今日も
「文字列にASCIIの制御コードを挟めばテスト環境でこの処理通ったんでいいでしょ」
なんつったアホンダラを叱りつけたところだ。
「そのコードが何を意味してるか分かる?」と聞いたら「空白です」だとよ。そりゃ、制御コードは「お前のエディタでは」見えないよ。アホか。
制御コードがテスト環境と違う実環境でどう解釈されるか分かったもんじゃないから却下した。

実際、実環境でこっそりテストしてみたらやっぱり処理はコケた。
0283279
垢版 |
2019/06/28(金) 00:39:45.58ID:khpSyJhs
で、バッチにもイディオムがある。
「AをしたいときはBと書け」ってやつ。
そういうものは、たとえ現代的なスクリプト言語とは感覚がかけ離れていてもバッチを書くなら「嫌でも」学習せねばならない。

つまり、
・言語や環境が想定している範囲内ならやってよし。むしろやれ。
・範囲外ならやるな。やるなら自己責任で他人に迷惑を掛けない程度に。
ということ。

これはどんな言語やシステムにも言えること。
0284279
垢版 |
2019/06/28(金) 00:51:59.74ID:khpSyJhs
もっと言うと、何かを開発するときにまず最初にやることってのが
「この言語や環境はどこまで想定しているのかを調べる」
だったりする。

自分のやりたいことに沿ってくれるかくれないのか。
くれないなら処理の一部だけやらせるに留めるなり、最初から使わないなり、そういう選択をする。
言語や環境に縛りがある場合なら、責任者の言質を取るなり、書面で誓約を取ってから作る。

見ず知らずの他人が意味も訳も分からないトリッキーなコードをメンテさせられて苦しむのを想像できないならいくらでもトリッキーにやればいい。
「このコード書いた奴、死ねばいいのに」って言われても俺には関係ない、くらいの根性腐った奴ならそうすればいい。
0285デフォルトの名無しさん
垢版 |
2019/06/28(金) 04:47:52.79ID:+wrrcV+u
だからキモイって
創価学会員並みにキモイ
狂信者の啓蒙活動と同じ
こんなところではなくおまえの会社でやってろ
0286デフォルトの名無しさん
垢版 |
2019/06/28(金) 07:00:46.98ID:n6DQpX/4
しかしWin環境はテキストのBOMマーク推奨なのに、for /fで読み出しするとBOMをわざわざ表示するのバカだよな。
過去の検討不足がまんま固定してる
0287デフォルトの名無しさん
垢版 |
2019/06/28(金) 07:22:18.87ID:utv5/5Cv
面倒くさい奴が一人いるな
何を書こうが勝手だが、ここはお前の職場じゃないぞ
0289デフォルトの名無しさん
垢版 |
2019/06/28(金) 23:56:34.27ID:b/1HFBuK
>>284
> 「この言語や環境はどこまで想定しているのかを調べる」

それはかなり大変なので、2、3回やってもうまくいかなかったら別の言語に乗り換えるという便法が別の解決策
0291デフォルトの名無しさん
垢版 |
2019/07/04(木) 08:37:48.34ID:yoyjVAJo
Win10 v1903
メモ帳で新規作成したテキストがtypeで化ける
もはやSJISは既定値ではない
cmdは旧態依然
0294デフォルトの名無しさん
垢版 |
2019/07/04(木) 21:43:07.98ID:y34WtIiv
以前は実行中のバッチファイルを編集保存、行を追加したり減らしたり、すると
エラーになってたと思うんだけど、何かエラーにならなくなった?
Windows10 1903 からの変更?
たまたまなのかな?
0295デフォルトの名無しさん
垢版 |
2019/07/04(木) 21:57:41.98ID:y34WtIiv
>>294 自己レスです
すいません、気のせいでした、たまたま起きないように見えただけで
普通にエラーが起きました
0296デフォルトの名無しさん
垢版 |
2019/07/05(金) 00:07:51.66ID:BL7Y7b8G
実行中の行やその直後の行を追加したり削ったりすれば、
同じ処理が繰り返しになったり、必要な処理がスキップされる形になって
挙動がおかしくなるな
0300デフォルトの名無しさん
垢版 |
2019/07/06(土) 08:01:28.83ID:NPkITZNc
>>298
PowerShellは色々トリッキーなところあるからなぁ
もう少し普通のスクリプト言語で良かったのに…
0304デフォルトの名無しさん
垢版 |
2019/07/06(土) 10:59:51.87ID:OJAqpfME
>>303
そもインタープリターは行単位でのみ読み込み解釈実行する仕様。

行内容を変えても反映されないんじゃインタープリターにならない
0305デフォルトの名無しさん
垢版 |
2019/07/06(土) 11:04:50.99ID:NPkITZNc
>>304
> そもインタープリターは行単位でのみ読み込み解釈実行する仕様。
逐次解釈は別にメモリーからでもいいだろ

> 行内容を変えても反映されないんじゃインタープリターにならない
そもそも行内容変えたらおかしくなるって話なんだがw
0306デフォルトの名無しさん
垢版 |
2019/07/06(土) 11:12:26.69ID:OJAqpfME
>>305
1の行の処理が終わってから2の行を読み込み解釈するのがインタープリター
メモリ先に読み込んだんじゃ意味ないの。
行内容変えてバグ混入させてバグったなら仕様通り
0308デフォルトの名無しさん
垢版 |
2019/07/06(土) 11:54:17.26ID:NPkITZNc
>>306
読み込み元がファイルかメモリーかなんて関係ないだろ
昔のBASICはインタープリターじゃねーのかよw

> 行内容変えてバグ混入させてバグったなら仕様通り
バカすぎる…
0309デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:11:18.65ID:OJAqpfME
本来の仕様・特性を理解しておらず。
メモリに全部読み込んでファイルロックかけちゃえばとか
どっちがアホなんだか
>>296 のようなことをしなければいいだけ
0310デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:13:38.81ID:NPkITZNc
> メモリに全部読み込んでファイルロックかけちゃえばとか
日本語の理解力もないのかよ…
0311デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:20:37.36ID:OJAqpfME
仕様通りの動作に「仕様を変えるべきだ」というなら「どうぞ、自分で制作しておやりなさい」としか
ディスク上のプロフラムファイルを処理しろと指示しておいて、実行中にプログラムファイル弄る方がバカでしょ?
0312デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:45:33.27ID:SnF6bIfm
横から失礼します。
例えば、バッチじゃないけど、
中間コード生成するのは、
インタプリタじゃないの?
0313デフォルトの名無しさん
垢版 |
2019/07/06(土) 12:53:22.08ID:NPkITZNc
> ディスク上のプロフラムファイルを処理しろと指示しておいて、実行中にプログラムファイル弄る方がバカでしょ?
うんうん、
> 行内容を変えても反映されないんじゃインタープリターにならない
とか言ってたバカに言ってやれよww
0314デフォルトの名無しさん
垢版 |
2019/07/06(土) 13:25:39.62ID:OJAqpfME
>>313
絶望的に頭悪いな
行内容を変えても反映されないんじゃインタープリターにならない
未実行の行内容をにバグ混入させればバグるのは仕様通り。インタープリタだから。
>>299だと行内容変えても帰る前の動作を続けるかファイルが変えられなくなる。
0315デフォルトの名無しさん
垢版 |
2019/07/06(土) 13:31:06.82ID:NPkITZNc
> 実行中にプログラムファイル弄る方がバカでしょ?
なのに内容変えたら反映しろとか頭おかしいw
もう自分が何を指摘されてるかもわかってないんだろうな
0316デフォルトの名無しさん
垢版 |
2019/07/06(土) 14:13:50.98ID:OJAqpfME
動作がバグらないように行内容をいじる方法もあるからなー
バカには気づけないのかもな
0318デフォルトの名無しさん
垢版 |
2019/07/06(土) 14:27:43.94ID:ZOT0kh7c
title Win8.1のcmdはPowershellを呼び出すとタイトルが変わってしまう
timeout 5
powershell sleep 5

Powershellを呼び出してもタイトルが変化しない方法ありませんか?
0319デフォルトの名無しさん
垢版 |
2019/07/06(土) 15:18:42.27ID:Mj6xLmMK
なんか色々とっちらかってるけど

入力に対して逐次実行を行い内容を出力するための実行エンジンがインタプリタ
まとめて実行する方法がバッチ
バッチを書くための言語の種類がスクリプト
なのでインタプリタ上で動くスクリプトで記述されたバッチが多いのは事実だけど
バッチスクリプトだからって必ずしもインタプリタ上で動作するわけではない

あまり言われることはないけどC言語なんかも手順をまとめて記述するという
意味ではバッチ
そのバッチを効率よく動かすためにハードウェアにネイティブなコードなどに
変換するのがコンパイラ

なので>>312が言うような中間コードを生成するのは処理的にはバッチのコンパイル
C#がやJAVAが典型的だけどバッチとして書かれたスクリプトをコンパイラで
中間コードに変換して.netエンジンとかJAVAエンジンで動かすけど、これらの
エンジンはインタプリタとして作成されているので直接コマンドを逐次実行する
ことも出来るようになっている

インタプリタが何を持って逐次実行の基準にしている(一般的にテキスト入力な
インタプリタはキャリッジリターンだけど)かはインタプリタの実装しだいなので、
バッチの内容がバッチ実行中に書き換わった際に動作が変わる/変わらないって
いうのは実行エンジンがインタプリタであるとかないとか言うのと関係ない

Linuxのシェルスクリプトはshっていうインタプリタで動いてるけど、バッチ
スクリプトは「'(バッククォート)」で囲まれた文字列はコマンドとして実行でき、
文字列は動的に書き換えできるのでバッチファイルを書き換えながらインタプリタで
実行できるバッチスクリプトって言うものも存在する

逆にC#みたいな中間コードを実行するインタプリタシステムは一般的にまとめて
コードを読み込んで実行するので、実行中にファイルを書き換えても読み込まれた
コードが変わるわけではないのでそのまま実行できる
0322デフォルトの名無しさん
垢版 |
2019/07/06(土) 17:04:06.81ID:l+THgL+v
>>321
多分、その通り。
>>320は、自分以外みんなバカというセンスのかたなのでしょう。
 (320著『自分以外みんなバカ』)
0323312
垢版 |
2019/07/06(土) 17:45:47.25ID:SnF6bIfm
>>319
レスありがとうございました。
0324デフォルトの名無しさん
垢版 |
2019/07/06(土) 18:13:58.11ID:yCp3HJnn
>>321-322
そりゃ、
> あまり言われることはないけどC言語なんかも手順をまとめて記述するという意味ではバッチ
みたいなアホなことを言う奴を理解しろと言われてもなぁw
0326デフォルトの名無しさん
垢版 |
2019/07/07(日) 00:42:47.20ID:YVv/+K6C
貴重なメモリをバッチなんかに使われたくない
ましてやファイルハンドル or FCBを消費するなんて考えたくもない
0327デフォルトの名無しさん
垢版 |
2019/07/07(日) 17:57:51.72ID:sK6+FwWI
書いたスクリプトをそのままCMD画面に貼り付けて実行できるのが素晴らしすぎる
これもインタープリタゆえのメリット
0328デフォルトの名無しさん
垢版 |
2019/07/17(水) 22:50:53.76ID:2IS3Ei7C
指定したURLをIEで開くバッチファイルを作りたいのですが、以下のいずれの書き方でもうまく起動しませんでした。
どのように記述すれば良いのでしょうか?


start "" """C:\Program Files\internet explorer\iexplore.exe"" https://www.yahoo.co.jp/";

start "" "'C:\Program Files\internet explorer\iexplore.exe' https://www.yahoo.co.jp/";

start 'C:\Program Files\internet explorer\iexplore.exe' https://www.yahoo.co.jp/

cmd /c start "" """C:\Program Files\internet explorer\iexplore.exe"" https://www.yahoo.co.jp/";

cmd /c start "" "'C:\Program Files\internet explorer\iexplore.exe' https://www.yahoo.co.jp/";

cmd /c start 'C:\Program Files\internet explorer\iexplore.exe' https://www.yahoo.co.jp/
0329デフォルトの名無しさん
垢版 |
2019/07/17(水) 22:52:08.85ID:2IS3Ei7C
↑書き忘れましたが、IEを起動したらバッチファイル自体はすぐに終了して欲しいです。
0332デフォルトの名無しさん
垢版 |
2019/07/22(月) 20:50:29.11ID:64jFVFKi
質問です
chcp を設定後に日本語テキストファイルを type しても
なぜか数行ごとに部分的に文字化けします
正しく表示させる方法はありますか
ファイルをコード変換するしかないでしょうか

20932 (EUC-JP)
50220 (JIS)
65000 (UTF-7)
65001 (UTF-8)
0333デフォルトの名無しさん
垢版 |
2019/07/23(火) 00:29:27.63ID:NmYCCAI2
正常に表示できる部分もあるのか?
コマンドプロンプトのフォント設定はレジストリをいじればできるようだが
chcp したとしても
各コードに合わせた日本語フォントがないと思う

ファイルをコード変換には nkf などを利用すればよい
もちろんcp932に変換できない文字がありえる点には注意
0334デフォルトの名無しさん
垢版 |
2019/07/23(火) 01:19:58.32ID:dqAnc0cb
横から失礼。多分フォントの問題じゃないなあ。再現してみる。

@echo off
del a.txt
set "a=ああああああああああああああああああああああああああああああああああ"
chcp 65001
for /l %%i in (1,1,10) do echo %a% >> a.txt
start notepad a.txt
type a.txt
pause
goto :eof
0335デフォルトの名無しさん
垢版 |
2019/07/23(火) 13:00:19.24ID:dqAnc0cb
>>332 typeの代替えバッチ

@echo off & set /a b=1
for /f "delims=:" %%i in ('type "%~1" ^| findstr /n /r /c:"^$"') do call :x %%i
set /a a%b%=0,b=1,c=1
for /f delims^=^ eol^= %%i in ('type "%~1"') do call :y & echo.%%i
goto :eof
:x
set /a a%b%=%1,b-=-1 & exit /b
:y
set /a d=a%b%
set /a c-=-1 & if %c%==%d% echo.& set /a b-=-1 & goto y

動作文字コードは>>332の4種類とcp932とBOM付UTF-16LE
内部コマンドのtypeの文字化けの原因は不明
得体の知れないバッチが嫌ならnkfでどうぞ
0336332
垢版 |
2019/07/23(火) 19:39:52.27ID:3qcsVE62
みなさんレスありがとうございました
>>335 のバッチを実行したら正しく表示されました
なにか不具合があれば nkf で変換します
0341デフォルトの名無しさん
垢版 |
2019/08/10(土) 16:26:14.51ID:O+qo9jJ2
・ループはなるべくラベルgotoで作る
・処理はまとめてCALLで呼び出す
と変な仕様に悩まされなくて済む
0342デフォルトの名無しさん
垢版 |
2019/08/12(月) 01:15:40.10ID:qDWW1IB8
>>341
つーか >>337 は FOR コマンドの中に「REM コマンドの代わりとして」ラベルを入れたっぽいよね。

REM コマンドは確かにダサい。クソみたいにダサい。
が、完全な代替手段はないことが今日までの先人たちの研究で分かっている。
「○○な場合正しく動かない」というケースから逃れられない。
素直に REM しとけ、って話なのさ。
0343デフォルトの名無しさん
垢版 |
2019/08/12(月) 01:43:33.99ID:asx4qCxc
>>341
そうですね
バッチ作成30年の知恵

バッチ前言語というのをつくり、バッチに変換するツールがあるといいのに
0347デフォルトの名無しさん
垢版 |
2019/08/15(木) 07:36:02.85ID:mKbuBo/x
今、気付いたけど
for/Lのカウントの区切り文字は半角スペースでもいいんだな
0349デフォルトの名無しさん
垢版 |
2019/08/15(木) 18:55:50.85ID:8DKeAJZl
>>348
エスケープすると長い記述を改行分割できる。
下記なら動くのではと想像
@echo off
for /l %%i in (1,1,3) do (^
^
echo %%i
)
pause
0350デフォルトの名無しさん
垢版 |
2019/08/15(木) 18:58:32.85ID:8DKeAJZl
こうかも。
違いはechoの前の半角スペースの有無
@echo off
for /l %%i in (1,1,3) do (^
^
echo %%i
)
pause
0351デフォルトの名無しさん
垢版 |
2019/08/15(木) 20:14:09.75ID:bAdklReO
>>350
横からだが、だとしても ”(” の直後には不要でしょう
わざわざ地雷踏みにいってるとしか思えない
0352デフォルトの名無しさん
垢版 |
2019/08/15(木) 20:20:13.66ID:hL4sD0l+
>>349
そういうことじゃなく、
そんなところにエスケープさえしなければ動く、ということ
空改行があっても同じ

@echo off
for /l %%i in (1,1,3) do (

echo %%i
)
pause


そもそも、エスケープが必要なのは以下のような書き方の場合

@echo off
for /l %%i in (1,1,3) ^
do (

echo %%i
)
pause
0354デフォルトの名無しさん
垢版 |
2019/08/16(金) 19:53:07.91ID:tgbth6lv
何が正解か良く分からないけど「echo」が消えているのではなく
「echo %%i」が実行された結果「%i」って文字列が出力されて
いるんじゃないかな
0357332
垢版 |
2019/08/17(土) 18:15:26.70ID:etNorZr1
はろー♪
@echo off
(^

rem echo Hello, World!)
pause
0358デフォルトの名無しさん
垢版 |
2019/08/17(土) 21:41:43.17ID:nWccZbx0
>>357
cmd のパーサーが馬鹿なだけ。
そういうトリッキーな小賢しい書き方を探しても誰も幸せになれない。
0360デフォルトの名無しさん
垢版 |
2019/08/20(火) 20:01:18.85ID:S2+8M2EA
C:\Users\hogehoge\AppData\Local\Microsoft\Windows\InetCache

にIEのキャッシュファイルがあって、コマンドで削除したいのですが

del /f /q C:\Users\hogehoge\AppData\Local\Microsoft\Windows\InetCache\*

を管理者権限のコマンドプロンプトで実行しても消えてくれません。
どうすれば消せるのでしょうか?
環境はWin10です。

ちなみに上記の「del /f /q」を「dir」に変えて実行すると、何もファイルが表示されませんでした。
エクスプローラでは表示されるのに…
0363デフォルトの名無しさん
垢版 |
2019/08/30(金) 17:07:15.01ID:C82bQLaF
任意のテキストファイルの各行(1〜N)を、
変数のARRAY[1〜N]にそのまま代入できますか?
テキストは空行あり、文字化けは無しで。
0365デフォルトの名無しさん
垢版 |
2019/08/30(金) 19:43:28.54ID:hATE1ff9
>>363 確認の表示が不要なら消してくれ
 
@echo off & set /A N=0 & if "%~1"==":GETS" goto GETS
for /F "delims=" %%I in ('call "%~0" ":GETS" "%~1"') do (
set /A N+=1 & set %%I)
setlocal enabledelayedexpansion
for /L %%I in (1,1,%N%) do echo ARRAY[%%I]=!ARRAY[%%I]!
goto :eof
 
:GETS
set o="tokens=* delims=0123456789"
for /F %o% %%I in ('findstr /N "^" "%~2"') do (
set /A N+=1 & set s=%%I
setlocal enabledelayedexpansion
echo ARRAY[!N!]=!s:~1!
endlocal)
0367デフォルトの名無しさん
垢版 |
2019/08/31(土) 00:24:30.62ID:dLbvCDhA
発見
call は遅い
自バッチ内であっても繰り返しの中では使わないほうがよい
0369デフォルトの名無しさん
垢版 |
2019/08/31(土) 07:34:22.10ID:KhyCGx+x
ループの中では、call setも遅いな
call先はバッチが基本なので
%path%のフォルダ内にset.batが存在しないか
ループの中で毎回、無駄に検索して時間のロスに
0371デフォルトの名無しさん
垢版 |
2019/08/31(土) 15:06:36.69ID:ny+pXiR9
クリーンに再実装しようとしてもうまく行かないし、Windows Terminalのオプソ化に期待
0373デフォルトの名無しさん
垢版 |
2019/09/17(火) 21:00:42.57ID:Syn6UaDZ
ポータブルデバイスにフォルダ移動したいのですがどのコマンドを使えばよろしいのでしょうか?

宜しくお願いします。
0378デフォルトの名無しさん
垢版 |
2019/09/19(木) 21:49:07.77ID:oZTJ7ty8
>>377
MTP接続しているデバイスの端末(スマホ)のフォルダをCドライブにコピーしたいのです。

何度もありがとございます。
0379デフォルトの名無しさん
垢版 |
2019/09/20(金) 18:54:32.90ID:YblgUZDU
>>378
MTPにWindowsからアクセスする場合にはWDP (Windows Portable Device)という
仕組みを使ってアクセスする必要があるらしいのでPowerShellとかVBSみたいな
COMオブジェクトに対応しているスクリプト言語を使うかプログラミングしないと
無理みたいだけど
0382デフォルトの名無しさん
垢版 |
2019/09/20(金) 23:15:32.97ID:Va/jwPXC
スレチだけど、横から失礼。
今USBで繋いだスマホのファイルをPCのexplorerで見てたら、
どうしても表示されないファイルが一部あるんだよ。
表示を更新してもダメだ。何なんだろ、これ。
スマホ側でzipに圧縮したら転送できたんだが。
0383デフォルトの名無しさん
垢版 |
2019/09/21(土) 09:52:34.32ID:obXFPJy6
>>382
MTPは本来画像とか音声とか映像ファイルを共有するための規格なんだけど
それでは不便なので実装者が拡張して他のファイルも見えるようにしているらしい

でWindowsのexplorerで削除できないファイルってのは何種類かあるけど表示
できないってのは覚えがないのでスマホ側の実装の問題じゃないかな
0386デフォルトの名無しさん
垢版 |
2019/09/21(土) 12:39:19.92ID:aqL81KxG
>>385
zip圧縮後、繋ぎ直したらzipは表示されたが元ファイルは非表示、
なので更新というより壊れてたみたいね
0390デフォルトの名無しさん
垢版 |
2019/10/01(火) 22:20:01.40ID:vtcCH4Ws
vbsスクリプト使用者に対話型でURLを入力させようと思い
inputboxを使用していましたが254文字以降は切り捨てられるようで
切り捨てられた場合にcmdを呼んでコマンドプロンプトで
TYPE CONで入力させ標準出力からとろうと思いました。
コマンドプロンプトから
TYPE CON
で文字入力していくと510文字しか打てません
COPY CON
で文字入力していく場合も510文字しか打てません
ただこちらは改行して2回目以降の文字入力は254文字までしか打てません
コマンドプロンプトはwindowsの仕様だともっと入力できたはずだと思うんですけど
TYPE COPYコマンドが原因なのでしょうか?
上限が512-2 256-2なのが気になります
0394デフォルトの名無しさん
垢版 |
2019/10/01(火) 23:41:17.62ID:vtcCH4Ws
いえVBSで環境変数からでも取れるんでどちらでもいいんですが
この方法は毎回ファイル書き込みはいるのなら避けたいですね
0395デフォルトの名無しさん
垢版 |
2019/10/03(木) 06:03:26.81ID:qiM7wE73
>>390

findstr ^^

ではどうですか?
入力の最後は改行とCtrl+Z
8000文字は入ったが、それ以上は試していない
0396デフォルトの名無しさん
垢版 |
2019/10/03(木) 19:45:19.23ID:+nOn2TPH
>>395
ありがとうございます。たしかにfindstr ^^ 試すと長く入力できますね
ただスクリプトが動く動きません(type con copy con以外)
たぶんexecで標準入出力を横取りしてるからなのかなと思ったんですけどならtype conはなぜ動くのかという気もします
//Prompt.vbs
Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.exec("cmd /c title " & Replace(Replace(Text,vbCr,""),vbLf,"") & " && type con")
'Set oExec = WshShell.exec("cmd /c findstr ^^")
Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox Prompt("test dayo","")
0398デフォルトの名無しさん
垢版 |
2019/10/03(木) 21:20:07.70ID:+nOn2TPH
powershellもちょっと試してたんですけどこっちもキーボード入力がはいってるように見えないです
powershellはcommand移行の注釈がいまいちわからなくてそれが原因なのかなとも思ったんですけど
(""の場合は前に&をつけるとかどうとか)

Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
'Set oExec = WshShell.exec("cmd /c title " & Replace(Replace(Text,vbCr,""),vbLf,"") & " && type con")
'Set oExec = WshShell.exec("cmd /c findstr ^^")
Set oExec = WshShell.exec("powershell -NoExit -NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command $a=read-host; write-host $a")

Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox Prompt("test dayo","")
0399デフォルトの名無しさん
垢版 |
2019/10/04(金) 05:33:06.84ID:igWxDR2f
>>398
いまいちVB.NETがどういう環境で使えるのか分からないし
PowerShellの実行を許可してない環境でも動くのかも分からないが
VB.NETのinputboxには256文字の入力制限が無い模様

Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.exec("powershell -NoProfile -ExecutionPolicy Unrestricted -C add-type -AssemblyName microsoft.VisualBasic; [Microsoft.VisualBasic.Interaction]::InputBox('URLを入力してください', 'URL入力');")
Prompt = oExec.stdout.ReadLine()
End Function

'msgbox Prompt("test dayo","")
WScript.Echo Prompt("test dayo","")
0400デフォルトの名無しさん
垢版 |
2019/10/04(金) 06:57:13.54ID:2Xve1BBy
>>396
良く分からんが、こんなのでどうですかね?
-------foo.bat
@findstr ^^ < con
-------Prompt.vbs
Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.exec("foo.bat")
Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox Prompt("test dayo","")
0401デフォルトの名無しさん
垢版 |
2019/10/04(金) 08:44:14.07ID:2Xve1BBy
バッチ不要だな
Set oExec = WshShell.exec("cmd /c findstr /R . < con")
最後に1023文字しか表示されないなReadLineのせいか?
0402デフォルトの名無しさん
垢版 |
2019/10/04(金) 12:18:00.19ID:mgLzdBVB
ありがとうございます
Function Prompt(Text,Default)
WScript.Echo(Text)
Set WshShell = CreateObject("WScript.Shell")
'Set oExec = WshShell.exec("cmd /c title " & Replace(Replace(Text,vbCr,""),vbLf,"") & " && type con")
Set oExec = WshShell.exec("cmd /c cmd /c findstr /R . < con")
Prompt = oExec.stdout.ReadLine()
oExec.terminate
End Function
msgbox LEN(Prompt("test dayo",""))
でやると8190でるのでmsgboxの表示制限っぽいです
上限が512から8190まで増えました♪
0406デフォルトの名無しさん
垢版 |
2019/10/05(土) 07:49:09.72ID:XliNsfqD
ありがとうございます
HTAも便利そうですね
アドレスバー,リンクをドラッグドロップで取り込めるのがいいなと
0408デフォルトの名無しさん
垢版 |
2019/10/09(水) 19:08:15.06ID:tUBbtl1D
文字列の画面表示の桁数はバッチで取得できますか?
半角1で全角2での合計みたいな
0409デフォルトの名無しさん
垢版 |
2019/10/10(木) 19:46:16.73ID:NVkes/cJ
>>408

@echo off & if "%~1"=="1" goto x
set c=call "%~0" 1 ^^^| findstr /o /r .*
set o="skip=1 delims=:" & set /p s=文字列=
for /f %o% %%i in ('%c%') do set /a b=%%i-2
echo 桁数= %b% & pause & goto :eof
:x
setlocal enabledelayedexpansion
echo.!s!
echo.

入力はシフトJISで表示できる文字のみです。
CP932で正常に動作します。たぶん。
0411デフォルトの名無しさん
垢版 |
2019/10/11(金) 07:29:52.81ID:D9aa0x5a
>>409,>>410
ありがとうございました!
コードページは932でしたので問題ないです
これで複数のデータを右詰めで揃えて表示できました
タブ入りだと表示がズレますが自分で対処します
0412デフォルトの名無しさん
垢版 |
2019/10/18(金) 19:14:42.75ID:MUFbi2Ng
特定の2つのフォルダ内を一括削除するbatの作り方がわかりません…。
1つだけならば出来るのですが2つ指定するにはどうすればいいのでしょうか 
お願いします
0417デフォルトの名無しさん
垢版 |
2019/10/18(金) 23:57:13.31ID:uNKAmOCu
for /f %%i in ('dir /b^|find "foo"') do pause

fooが無かった場合pauseしてくれないのですが解決策ありませんか?
実際はfooの有無で分岐させるのですがとりあえずpauseで書いてます
0420デフォルトの名無しさん
垢版 |
2019/10/19(土) 00:34:28.69ID:nJ40H8MU
forのループは条件が一致しないとすり抜けて
1回も通らないで次のステートメントにいっちゃうから無理
無理矢理やろうとすると、ダミー項目を与えて必ず一度はforループを実行するようにして
その中でダミー項目だったら〜と条件判定することになる
0421デフォルトの名無しさん
垢版 |
2019/10/19(土) 00:43:02.67ID:nJ40H8MU
こんな感じ
for /f %%i in ('dir /b^|find "foo"^|^|echo none') do (if "%%i" equ "none" echo ありません)
0423デフォルトの名無しさん
垢版 |
2019/10/19(土) 01:05:43.14ID:lUUAms6Y
なるほど||つかう手もあるんですね
for入れ子にしてるから||でいきますありがとう
0424デフォルトの名無しさん
垢版 |
2019/10/19(土) 01:26:01.92ID:nJ40H8MU
forの後で、%errorlevel%で判断できるかと思ったけど
forのコマンドは子タスクで実行されるから環境を親タスクに引き継がないんだね
こういうことはパイプの右側でも起きるけど
0425デフォルトの名無しさん
垢版 |
2019/10/19(土) 07:15:14.93ID:azMLqhGk
for /f "delims=" %%i in ('dir/b *foo* 2^>nul ^|^| echo *') do (
if "%%~i"=="*" (echo ないよ) else echo %%i
)
0431デフォルトの名無しさん
垢版 |
2019/10/27(日) 14:29:49.16ID:Lik42TLZ
cmd.exe /c start ってネットワークドライブのファイル開けないんでしたっけ?

cmd.exe /c start t:\test.txt ってやると
アクセスが拒否されました。って表示される。c:\以下なら大丈夫

cmd.exe /c start file:\\t:\test.txt ってやれば開けるからいいんだけど
0433デフォルトの名無しさん
垢版 |
2019/10/27(日) 19:45:47.81ID:QHyOIS3t
startが内部コマンド
0435デフォルトの名無しさん
垢版 |
2019/10/27(日) 22:46:50.23ID:8uvk7ayg
>>434
ぐぐれかす
0436蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/27(日) 23:17:38.75ID:cNZwDfUU
>>434
内部コマンドは実行可能なモジュールではなく、cmd内部でのみ実行可能だから。
内部コマンドはcmdで解釈・実行される。
0437デフォルトの名無しさん
垢版 |
2019/10/28(月) 01:22:07.40ID:YqbFbBrf
>>434
バッチでは cmd /c は不要ですね。
cmd /c があれば子プロセスになります。
どっちも結果は同じ。エディタが起動します。
「ファイル名を指定して実行」の入力なら、
cmd /c start は不要かと思います。
でも、あっても間違いではないです。
0439438
垢版 |
2019/10/28(月) 02:18:17.09ID:bqlyCkZ6
ネットワークフォルダをドライブに割り当てた問題かと思えば
関係なさそうだ。でも不思議だ

cmd.exe /c start \\server\folder だとフォルダが開ける
cmd.exe /c start \\server\folder\subfolder でも問題ない

cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される
でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける
0441438
垢版 |
2019/10/28(月) 03:54:57.58ID:bqlyCkZ6
アクセスが拒否されました
0442デフォルトの名無しさん
垢版 |
2019/10/28(月) 07:04:53.54ID:YqbFbBrf
>>438 すみません。私には分かりません。
cmd/c を省略、 さらに start を省略しても同じアクセス拒否ですか?
0443デフォルトの名無しさん
垢版 |
2019/10/28(月) 08:16:04.60ID:kjzN6NI8
>>439
>cmd.exe /c start \\server\folder\test.txt だとアクセスが拒否される
>でもエクスプローラーのアドレスバーに ↑ を入れるとメモ帳で開ける

このコマンドには、メモ帳を起動すると書いていないから、起動できないだろ

拡張子から、起動するアプリを取得できないだろ?

そういう情報は、レジストリに入っているから、
バッチファイルから、そこへアクセスできるか?
0444443
垢版 |
2019/10/28(月) 08:20:10.88ID:kjzN6NI8
普通に「notepad パス付きファイル名」なら、起動できるだろ?
0447デフォルトの名無しさん
垢版 |
2019/10/29(火) 12:51:26.56ID:SHkVBveq
file:\\C:\Program Files (x86)\TeraPad\TeraPad.exe


>>446
>>443 は.txtの関連付けはメモ帳とは限らんと言ってる


notepad.exe がネットワークドライブのファイル名を処理できるかは知らんが
notepad file:\\t:\test.txt
みたいなのではダメだろうな
start file:\\t:\test.txt
なら良さそうだが
0449デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:09:40.06ID:YQKoC2Uo
コマンドプロンプトの文字コードがよくわからん。
なんでchcp 932なのにUnicodeが表示できてるんだ?
chcpの設定とは無関係に画面はUnicodeで変換してるんか?
0450デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:26:49.20ID:SHkVBveq
バッチはSJIS
リダイレクトするとSJIS
画面はユニコード
set はユニコード特有文字でも入る(cmd画面で入力なら)
cmdの内部処理はユニコード
0451デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:34:20.85ID:spBBwL/I
Unicodeはいいが文字コードは何なんだ?
UTF-8なのか?UTF-16なのか?
0453デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:40:11.15ID:spBBwL/I
>>452
と思うやろ?

typeコマンドは文字コード変換してるかもしれんなと思って
copy ファイル名 CON なら、そのまんま表示されるだろうと
思ってやってみたら、

UTF-8は問題なく表示されて、UTF-16は文字化けしてるんだよ。
Windows 10で仕様でも変わったんか?
0455デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:53:47.92ID:spBBwL/I
わからんのかーいw
0457デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:15:50.84ID:spBBwL/I
やっぱり仕様が変わってた。

Windows 7だとchcp 932の時、
copy test.txt CON で正しく表示できるのはShiftJISだけ
UTF-8でもUTF-16LEでも文字化けする。

Windows 10だと逆に、UTF-8(BOMなし)、UTF-16LEは
正しく表示できるが、ShiftJISは文字化けする。
0459デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:27:54.02ID:spBBwL/I
Windows 7でもdirコマンドでShiftJISにない文字は表示できてるから
最終的にはUnicodeなんだろう(おそらくUTF16だと思うが)
その途中になんかあるんだろうな。

Windows 10でcopy CONつかってるのに、UTF-8とUTF-16の両方が
文字化けしないのが不思議だ・・・って思ったら、
あれ?UTF-16文字化けしてた。んん?間違ってtypeで表示してたか。
これなら理解できる。
0461デフォルトの名無しさん
垢版 |
2019/10/29(火) 14:52:33.20ID:spBBwL/I
>>460
今の最新の公式リリース
0462デフォルトの名無しさん
垢版 |
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なし) だと正しく表示される
0463デフォルトの名無しさん
垢版 |
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));
}
0464デフォルトの名無しさん
垢版 |
2019/10/29(火) 17:46:22.44ID:4a4kNF+Q
一つわかった気がする。

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

だからchcp 932のままコマンドプロンプトでUnicode文字を使うことができるけど
バッチファイルにするとそれができない。
0465デフォルトの名無しさん
垢版 |
2019/10/29(火) 17:46:59.43ID:wQOUEDyj
テキストストリームだけしか通さないから何らかの変換が入ってるのかも知れないね
copy /b hoge.txt con
指定されたデバイスに書き込めません。
0 個のファイルをコピーしました。
0467デフォルトの名無しさん
垢版 |
2019/10/29(火) 18:10:48.74ID:4a4kNF+Q
そんな馬鹿な・・・。Windows 10でもShiftJISじゃないと表示されなくなっただと?
何度も確認したはずだぞ???
0469デフォルトの名無しさん
垢版 |
2019/10/29(火) 19:04:08.72ID:SHkVBveq
少し前にここで同様の話題が有ったが UTF-8(BOM無し) のテキストは
たとえ chcp 65001 しても type で一部分文字化けする

findstr ^^ foo.txt

で正常に表示されるはず(chcp 65001 で)
0471デフォルトの名無しさん
垢版 |
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がなにかコマンドプロンプトの状態を変えてやがる。
なんだこれ?コマンドプロンプトに英語モードとかあったっけ?
0473デフォルトの名無しさん
垢版 |
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の値は変わらんのに、コードページを変えることができてしまっているかのようだ。
0474デフォルトの名無しさん
垢版 |
2019/10/29(火) 21:33:51.82ID:ltL5L5Cn
Windows 7にPowerShell6をインストールしてやってみたけど、
pwsh -Command [Console]::OutputEncoding = [Text.Encoding]::UTF8 で
コードページが変わるな。Windows 7はまともに動かないので画面がバグるw
0476デフォルトの名無しさん
垢版 |
2019/10/30(水) 07:47:21.02ID:WNRoeYsC
おれもコードページ弄って色々やったが上手くいかなかった
typeは一部ダメ、moreは全くダメ、findstrはリダイレクトするとダメ、
copy〜conは utf-7とjis が一部ダメ、
for〜do echoでやると空行が抜けてダメという具合
0478デフォルトの名無しさん
垢版 |
2019/10/30(水) 11:07:44.00ID:iT3/p0k9
>>476
なんとなく画面に表示する部分にバグがあるから
バッチファイル内で閉じて画面に表示しなければ、chcp 65001で動くような気がする。
あとWindows 10ではそこらへんが直ってるので同じように考えるのは早計
0479デフォルトの名無しさん
垢版 |
2019/10/30(水) 11:25:55.22ID:iT3/p0k9
Windows 7でこれが文字化けせずに動いた
chcpで画面はクリアされるが、正しく出力される。

↓UTF8 + CRLFで作成

@echo off
chcp 65001
set A=ユニコード文字
chcp 932
echo %A%
0482デフォルトの名無しさん
垢版 |
2019/10/30(水) 12:17:27.39ID:4eNYSN+t
chcpやってモード変更したとしても
既に開いたハンドルは開いたときのモードのままだろうからね
0483デフォルトの名無しさん
垢版 |
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
0484デフォルトの名無しさん
垢版 |
2019/10/30(水) 12:29:13.59ID:iT3/p0k9
ちなみに >>483 はchcp65001した状態でバッチファイルを実行すれば
バッチファイルの中でchcpせずに動く

あとファイルの文字コードはUTF8な
0485デフォルトの名無しさん
垢版 |
2019/10/30(水) 12:32:44.17ID:iT3/p0k9
>>482
そうとは限らない。

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

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

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

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

@echo off
chcp 65001
if "hoge"=="hoge" (
echo "あああ"
echo "いいい"
)
0487デフォルトの名無しさん
垢版 |
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
0488デフォルトの名無しさん
垢版 |
2019/10/30(水) 12:46:49.70ID:iT3/p0k9
まあバッチファイルでchcp 65001を使うのはやめたほうがいいと思うけど
ワークアラウンドでどうにか対応できなくはないかもしれないw
0489デフォルトの名無しさん
垢版 |
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なら問題ないんだけどね
0490デフォルトの名無しさん
垢版 |
2019/10/30(水) 13:41:42.20ID:zJjGNXoj
それは
>これは、$OutputEncoding が Default だと US-ASCII になっているので、S-JIS 文字列を渡そうとしてもリダイレクト時に日本語がうまく扱えないからです。
>結論から言うと、$OutputEncoding を S-JIS に変更して clip.exe にリダイレクトすれば文字化けしません。
これが関係するのかな?
0491デフォルトの名無しさん
垢版 |
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)を渡せないのだけれど、
どうしたらいいですか?
0493デフォルトの名無しさん
垢版 |
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では
?になるのにたいしてこっちは文字化けする
0494デフォルトの名無しさん
垢版 |
2019/10/30(水) 14:13:56.47ID:iT3/p0k9
ここはPowerShellのスレじゃないんだがw

$OutputEncoding と [Console]::$OutputEncoding は別もんなんか!?
[Console]は[Console]::WriteLine とか使うときだけかな?
0496デフォルトの名無しさん
垢版 |
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
0497デフォルトの名無しさん
垢版 |
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
0499デフォルトの名無しさん
垢版 |
2019/10/30(水) 14:27:47.60ID:iT3/p0k9
[Console]::OutputEncoding は chcp 相当のことをしていて、
コンソールのコードページを変更しているのに対して、
$OutputEncoding は出力の文字コード変換の制御をしてるっぽい
0500デフォルトの名無しさん
垢版 |
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でバッチファイルを書いた時のパース処理は別の話)
0503デフォルトの名無しさん
垢版 |
2019/11/03(日) 23:33:41.85ID:/0rS8sv9
質問なのですが、以下の内容を実行するバッチプログラムを作りたいのですが、どなたかご教示頂けないでしょうか。

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

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


宜しくお願いします。
0505デフォルトの名無しさん
垢版 |
2019/11/04(月) 09:25:52.62ID:0uHh5Wp4
宜しくお願いします。と書けば誰かがやってくれるとでも?
xcopy robocopy move for if set call dir findstr
この辺使えりゃ出来るから自分で調べろ
"バッチ バックアップ" とかでググれば腐るほど例が出るだろ
0506デフォルトの名無しさん
垢版 |
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 を使うとか
0507デフォルトの名無しさん
垢版 |
2019/11/04(月) 13:46:43.19ID:UHaJ6Kuw
> Ruby で、クリップボード内の複数行文字列の、各行の先頭・末尾から、
> str = `powershell Get-Clipboard`

Rubyでできないなら、もう全部powershellで書いちゃえよw
0508506
垢版 |
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
0510デフォルトの名無しさん
垢版 |
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
0511デフォルトの名無しさん
垢版 |
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
0513デフォルトの名無しさん
垢版 |
2019/11/05(火) 20:28:07.61ID:ykrQtfUP
%%dだけでフルパスになるから~fは不要。
0515デフォルトの名無しさん
垢版 |
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を使うのかな

あと、ウィンドウを開いている間生きている変数ってファイルへの格納、取り出しって
そんな面倒なことしてるなら表計算ソフトでも使えってか
0516デフォルトの名無しさん
垢版 |
2019/11/05(火) 21:30:33.42ID:HPnxYMOW
>>515
出来なくはないけれど set /a では整数しか扱えずバッチのみでやるのは面倒
やるならPowerShell とか wsh, js かな
単に平均出すだけなら電卓アプリの方が楽
0517デフォルトの名無しさん
垢版 |
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ならこうかな?
0518デフォルトの名無しさん
垢版 |
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 # 合計 / 要素数
0520デフォルトの名無しさん
垢版 |
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
0521デフォルトの名無しさん
垢版 |
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)

上のに真ん中の行追加で
0523デフォルトの名無しさん
垢版 |
2019/11/06(水) 23:04:29.95ID:wTTuQQRz
空白が入ったパスをバッチファイルにわたすために
ダブルクォートで括らないといけないが、
それをやると、変数にダブルクォートが入るのがクソなんだな

しかも、if "%1" == "" とか書くと、引数がダブルクォート
一個だったときにエラーが出るとかいろいろ破綻してる
0524デフォルトの名無しさん
垢版 |
2019/11/07(木) 01:48:00.01ID:4r3ojeSB
>>522
難しすぎというよりは適当仕様すぎ
仕様を安易に何回も拡張した、増築して迷路化した老舗旅館
0528デフォルトの名無しさん
垢版 |
2019/11/07(木) 07:54:19.69ID:isVFtAa0
>>520さんありがとうございます
”これこそが私の求めていたものだ”
そんな慣用句?ローマの名文句?ってあったっけと思ってしまいますた。
000と00の入力処理で使いやすくなっているのがセンスというか実際の使用を考えた親切な仕様だなと思います。
訂正できるのは本当に便利だ。

VBSとRubyで書いてくださった>>517さんと>>518さんにも感謝。
自分の要求仕様がどう解釈・解決されるのか勉強になります。
0529デフォルトの名無しさん
垢版 |
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 で空入力しても 空で上書き初期化されずそのまま残るみたい
0530デフォルトの名無しさん
垢版 |
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 の使い方が誤っています。
0531デフォルトの名無しさん
垢版 |
2019/11/07(木) 12:19:13.92ID:Z6Qb1qTa
Windowsバッチの仕様がダメダメというのはそのとおりだが、
引数が " だけというのは、かなり特殊な想定だよな。
これが大丈夫という言語ってあるのか?

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

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

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

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

いきあたりばったりなんだよなw
本当にここらへんの奴らは適当
0534デフォルトの名無しさん
垢版 |
2019/11/07(木) 12:40:37.56ID:sEmiRyTj
https://thinca.hate
nablog.com/entry/20100210/1265813598

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

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

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

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

1の部分は、Ruby, Selenium WebDriver などで、クローラー・スクレイピングも出来る
0536デフォルトの名無しさん
垢版 |
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だけの話さ
コマンド側でどう引数処理するかだよな
バッチでは普通ダメだね
0537デフォルトの名無しさん
垢版 |
2019/11/07(木) 13:04:39.19ID:sEmiRyTj
ダブルクォートを"""と3個やっても動かないときは、
"""" に増やして動くか
""""" に増やして動くか
""""" に増やして動くか
これぐらいまで試す

あるある
0538デフォルトの名無しさん
垢版 |
2019/11/07(木) 13:26:56.23ID:Z6Qb1qTa
>>536
クォートの先頭にエスケープが必要な場合でも、
後ろの方は何故かエスケープが不要なことがあるんだよな。
*nix系から移植したプログラムで、こういう事がたまに起きる。
いずれにしても、謎仕様…
0540デフォルトの名無しさん
垢版 |
2019/11/09(土) 12:37:18.78ID:9Z+ynpem
もう無理だw

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

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

お手上げ\(-o-)/
0545デフォルトの名無しさん
垢版 |
2019/11/09(土) 13:22:47.16ID:hmJLHo7y
これな、"abc"の方が要注意なんよ
^とか!とか入ってるとやばいかも
setlocalの前に代入して
if !a!==!b! とかやった方がええかもな
0547デフォルトの名無しさん
垢版 |
2019/11/09(土) 14:00:20.08ID:hmJLHo7y
うん多分、変な文字入って無けりゃね
遅延モードだと全角文字のリテラルにも一部副作用が有るかも
0549デフォルトの名無しさん
垢版 |
2019/11/09(土) 14:15:55.11ID:hmJLHo7y
setlocalの外で代入すりゃ問題ない
遅延の中では書くな
あと、if !a!==!b! に " はたぶん不要
0552デフォルトの名無しさん
垢版 |
2019/11/09(土) 15:15:35.38ID:hmJLHo7y
>>550
すまん。おれの勘違いだった
全角文字は関係無かった。無視してください
でも^や!は要注意だけど
0554デフォルトの名無しさん
垢版 |
2019/11/09(土) 20:49:07.09ID:9HGwW/1Y
>>553
ShiftJISだとだめだけど、バッチファイルをUTF8で保存したら大丈だったよ!

ただし、それでも引数で渡すとダメだったけどwww
0555デフォルトの名無しさん
垢版 |
2019/11/09(土) 20:57:33.36ID:9HGwW/1Y
>>553
それも enabledelayedexpansion 使えば大丈夫じゃない?

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


もうやだこの言語(?)
0556デフォルトの名無しさん
垢版 |
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
0557デフォルトの名無しさん
垢版 |
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
これ人間が制御できるものなんか?
0558デフォルトの名無しさん
垢版 |
2019/11/10(日) 09:44:25.06ID:fP398yW4
setlocal enabledelayedexpansion は >>540対策で使えるけど、
それ以外はもっと制御が難しいかも・・・

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

今回は頑張ったけど、もうやらない。
0560デフォルトの名無しさん
垢版 |
2019/11/10(日) 20:23:39.65ID:u8+xJCBj
for in って for %%i in (*) みたいにワイルドカードが含まれていればファイルを検索する機能で
for %%i in (a b c) みたいにワイルドカードが含まれてない場合は
ファイルがあるなしに関係なく、a、b、cを繰り返す機能ってことであってますか?
0561デフォルトの名無しさん
垢版 |
2019/11/14(木) 15:51:47.87ID:MT98n7t2
多重フォルダの中身を
一番上のフォルダにまとめるスクリプトってどうやるの?

できればフォルダをドラッグ&ドロップしたいんだけど
0563デフォルトの名無しさん
垢版 |
2019/11/18(月) 20:56:52.03ID:/+k2TWLn
なんかこんなバッチファイルがあったけどうまく動かない
for /f "usebackq tokens=1" %%A in (`tasklist /fi "imagename eq SKRWATCH*" /fo "table" /nh`) do
if "SKRWATCH.EXE"=="%%A" (echo %%A & exit) else (START /D C:\Users\user1\Downloads\skrw021 SKRWATCH)
0564デフォルトの名無しさん
垢版 |
2019/11/18(月) 21:18:40.00ID:45qFz0UJ
>>563
うまく動かないでは状況が不明(エラーxxxが表示とか具体的に)
・tasklistは動くのか?(tasklist /?)
・そのままコピペしてるのなら動かなくて当然
 (doの前に全角空白があるし、doの後も改行されてる
  起動するパスがexeと空白で区切られてるがタイプミスか)
・対象はそのEXEで間違いないのか、パスに間違いはないか
0565デフォルトの名無しさん
垢版 |
2019/11/18(月) 21:26:40.79ID:45qFz0UJ
>起動するパスがexeと空白で区切られてるがタイプミスか
これはフォルダ指定だから記述に問題はなかったね
0566デフォルトの名無しさん
垢版 |
2019/11/19(火) 00:58:21.49ID:f1OS2g5Q
>問題はなかったね
問題あるから動かねーんだろwwバカじゃね?
いきなりバッチじゃなくてプロンプトでコマンドひとつひとつ動作するか確認してみろやボケ
0568デフォルトの名無しさん
垢版 |
2019/11/20(水) 12:24:50.17ID:2S7bcPNj
テキストファイルの[version]ってタグの上に任意の文字列を追記したいんですけどなにかいい方法ありませんかね?
↓なイメージです

key = value
[version]
0570デフォルトの名無しさん
垢版 |
2019/11/20(水) 13:53:46.39ID:xBPN5HFi
エディタでの置換じゃ無理な処理数なん?
batで文字列操作は事故の元
JSかPSでも使えば?
0571デフォルトの名無しさん
垢版 |
2019/11/20(水) 17:43:27.76ID:jZ8vbKIX
>>569
>>570
やりたいことはローカルセキュリティーポリシーテンプレートを書き換えたいんですよ
seceditってコマンド使うんですけどその書き換えの部分を自動化したいんです
因みにPSでは使えないです
0573デフォルトの名無しさん
垢版 |
2019/11/20(水) 19:53:19.75ID:p2TBD6cq
一行ずつぐるぐる回しながら表示して
[version]だったら、その表示の前に追加すればいいだけじゃん
0575デフォルトの名無しさん
垢版 |
2019/11/21(木) 10:25:48.48ID:Wg+WlOX1
ファイルを一行ずつ読み込んで出力する処理に
ちょこっと手を加えるだけだから簡単だな
0578デフォルトの名無しさん
垢版 |
2019/11/21(木) 12:46:53.45ID:7xPdmDWo
>>572
行頭が数字なのにeolの指示は無意味
delimsを数字にしないとまずいし
他人のバッチを鵜呑みにして理解していないバッチ
0579デフォルトの名無しさん
垢版 |
2019/11/21(木) 15:03:03.19ID:8WRatKwZ
EUCテキストだから、ファイル名をそのままfindstrに突っ込むのは無理だな
0580デフォルトの名無しさん
垢版 |
2019/11/21(木) 16:04:24.91ID:7xPdmDWo
>>579 これでどうかな?
@echo off
chcp 20932
set s="%~1"
set "a=key = value"
set "b=[version]"
call :x > "%~2"
goto :eof
:x
for /f "delims=" %%i in ('findstr /n "^" %s%') do (
set c=%%i
setlocal enabledelayedexpansion
set d=!c:*:=!
if /i !d!==!b! echo.!a!
echo.!d!
endlocal)
0583デフォルトの名無しさん
垢版 |
2019/11/21(木) 22:34:33.13ID:2C4HvUZs
コード変換ソフトがないと、無理かな。
0584デフォルトの名無しさん
垢版 |
2019/11/21(木) 22:42:46.40ID:8WRatKwZ
いやfindstrにファイル名渡さないようにすればそれでいい
'type %s%^|findstr /n ^^'
cmd /u /c hoge.bat in.txt out.txt
0586デフォルトの名無しさん
垢版 |
2019/11/21(木) 23:14:31.55ID:t93OqxgW
>>568
Ruby で作った

text = <<"EOT"
[version]
a
[version]
EOT

re = /^\[version\]$/

text.gsub!( re ) { |matched| "key = value\n#{ matched }" } # 置換
puts text

出力
key = value
[version]
a
key = value
[version]
0588デフォルトの名無しさん
垢版 |
2019/11/22(金) 00:14:32.18ID:UfmR8W/F
>>587
@echo off & if "%~1"==":x" goto x
set "a=key = value" & set "b=[version]" & set s="%~1"
chcp 65000 > nul
cmd/u/c "set/p a=+/v8-<nul"> "%~2"
chcp 932 > nul
cmd/u/c "%~0" :x >> "%~2" & goto :eof
:x
for /f "delims=" %%i in ('type %s% ^| findstr/n/r .*') do (set c=%%i
setlocal enabledelayedexpansion
set d=!c:*:=!& if /i !d!==!b! echo.!a!
echo.!d!
endlocal)
0592デフォルトの名無しさん
垢版 |
2019/11/22(金) 02:47:17.93ID:UfmR8W/F
そうだな。直ぐ消えるので気付かなかった
動作はするようだが
スペース入れた方が無難だね
0599デフォルトの名無しさん
垢版 |
2019/11/26(火) 10:19:19.63ID:NW9y+uW0
用途:エクセルにある複数の画像URLを、指定したフォルダにDLさせたい
コマンドでやりたい理由:
ダウンロードソフトは一つのフォルダに全部DLするか、
一つのURLを開いてから一つづつDL先を指定するか、
URLをフォルダ構造に分解して保存するからDL後探すのが面倒で嫌
DownloadThemALLとか、DL雨とか、Tab Saveとか、Image Downloader…
全部ダメ;

bitsadmin /transfer [name] [URL][DL path]
bitsadmin /transfer [name] [URL][DL path]
bitsadmin /transfer [name] [URL][DL path]
…こんな風に並べて書いたところ、リストの最後らへんの二つぐらいを除いて
PRIORITY:NORMAL FILES:1/1 BYTES:0/0 (0%)
Transfer complete.

でDL開始する前に次の行にいってしまうようです。しかも0バイトの指定したファイルを作ってしまいますw
MS見ると複数やるなら1行に続けろとあるので
bitsadmin /transfer [name] [URL] [DL path] [name2] [URL2][DL path2]
としたが状況変わらず。

どうしたらいいでしょうか。timeoutでは変わりませんでした。
0601デフォルトの名無しさん
垢版 |
2019/11/26(火) 12:23:55.89ID:ImxGWCjG
httpのみでhttps未対応だしリファラやUA見られてても落ちないと思う
ダウンローダーはその辺勝手にやってくれてるんだよ
取り敢えずこれ真似してforでlist読んでやってみれば?
ttps://automationlabo.com/wat/?p=570
0602デフォルトの名無しさん
垢版 |
2019/11/26(火) 12:32:29.83ID:NW9y+uW0
>>601
ありがとう、そこのサイトみてやってるんだ
ちなみに今はHTTPS対応してるようで
ttps://maku77.github.io/windows/cmd/download.html
ttps://qiita.com/uratatsu/items/d77152ca121d0b779464
一件づつコピペだったらできるんだ

ダウンローダーについては気軽にスレで聞いてるけど、
画像ごとにフォルダを指定して一気に保存ができるものはないみたい
昔懐かしいirvineができる的な噂見てやってみたけど、フォルダ指定ができないorz
0603デフォルトの名無しさん
垢版 |
2019/11/26(火) 13:46:11.40ID:ISv3uuWx
しらんけど
前の行の処理が完了する前に次の物が始まるのがまずいなら
Call でいんじゃないの?
0605デフォルトの名無しさん
垢版 |
2019/11/26(火) 14:16:12.39ID:JyI6kWkc
特定に箇所にダウンロードして、ダウンロードが終わったら移動するんじゃダメなの?
なんでダウンロードするアプリにフォルダ指定の機能まで期待するんだろう
頭硬いのかな
0608デフォルトの名無しさん
垢版 |
2019/11/26(火) 14:41:21.48ID:ISv3uuWx
たしかにそれぞれのファイルのフォルダ指定をすること自体がめんどくさそう
ダウンロードフォルダにその人が望む各保存先フォルダのショートカットおいてまとめて突っ込む方が楽そう
0609デフォルトの名無しさん
垢版 |
2019/11/26(火) 14:51:14.37ID:NW9y+uW0
pushd %~dp0
for /f "tokens=1-3" %%A in (list.txt) do (
bitsadmin /TRANSFER FILEDOWNLOAD %%B %~dp0\%%A\%%C
)
echo
listの内容
[dir] [url] [ファイル名]

ダメでした…%%Aで留めれば行けるけど、他のフォルダにいれたいやつを上書きしちゃう
curl…Linuxコマンドだと思ってスルーしていたけど調べてみます。thx

>>605
100も200もあるURLごとのフォルダからぽちぽち移動できるもんならやればいいよ
DownloadThemALLとか、古いFirefoxでしか動かんけどScrapbookとか、あなたが
言うような奴ならごまんとある。
私はそれはやってられんから他の方法探してます。
hogehoge.jp/moemoechan/hogenull/img/image/hoge-hoge-hoge-hoget.jpg
というURLをそのままフォルダにされても、今回の場合は探し出すのが大変なんだよ、
ファイルに行くまでに何回クリックいる?×100だよやりたいならどうぞ私は嫌ですw
(単なるスクラップならせいぜい1サイトくらいだからむしろそれでいい)

つか、あなたのそのやり方やるぐらいなら、URLのリストをいっこづつコピペで
開いてブラウザから保存したいフォルダにD&Dしたほうが何十倍も速いぞたぶん。
だってDLしたあとで探す手間いらないですよね?
0610デフォルトの名無しさん
垢版 |
2019/11/26(火) 14:55:31.49ID:JyI6kWkc
>>609
>だってDLしたあとで探す手間いらないですよね?

なにを探すの?
空のディレクトリに一個だけダウンロードしたらmoveするだけじゃん
しかもダウンロードするファイル名分かってるんだろ?
まとめてダウンロードしてからでも人間が探す必要なんかないじゃん
ダウンロードディレクトリにあるんだから
脳みそ足りて無くない?
0611デフォルトの名無しさん
垢版 |
2019/11/26(火) 14:59:19.90ID:NW9y+uW0
>>607
!!
調べてみます!

まあそりゃねぇ
管理ナンバー URLっていう100個のリストにある画像集める必要があって
素直にそのURLをブラウザで開いてD&Dもしてましたよ…けど開いてる時間すら
面倒になってきまして…
ダウンローダーいろいろ探したけど、ブラウザのダウンロードフォルダ固定とか
ダウンロードする画像ごとにフォルダ指定しろダイアログとか、そーじゃねーよとw
もうそのいちいちダイアログがうぜえwでも振り分けずぜんぶいっしょくたも困る。
で、GoogleスプレッドでIMPORTXMLで画像リスト出していまここって感じ。
599の状態でビャーってなればよかったのだが。(もっといい方法あったらそっちがいいけど!)
0612デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:05:17.28ID:NW9y+uW0
>>610
これが見えないですか。そうですか。
>hogehoge.jp/moemoechan/hogenull/img/image/hoge-hoge-hoge-hoget.jpg
>というURLをそのままフォルダにされても、今回の場合は探し出すのが大変なんだよ、

元々は
123 hogehoge.jp/moemoechan/hogenull/tio/hoge-hoge-hoge-hoget.html
124 hogehoge.jp/moemoechan/hogenull/star/hoge-hoge-hoge-hoget.html
125 hogehoge.jp/moemoechan/hogenull/maru/s/hoge-hoge-hoge-hoget.html
126 hogehoge.jp/moemoechan/hogenull/otto/s/hoge-hoge-hoge-hoget.html
というエクセルのファイルにある各URLのにある画像をそれぞれ分けたい、ということ。
ちなみにこれ4つだからぽちぽちやってもいいんだけどさ…100行あるとしたらどう?w
0613デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:25:21.93ID:XdTMGSyO
batで外部プログラムの実行完了まで待つ呼び出し方法は
start /wait
って上で誰かが言ってるだろ
0614デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:33:34.59ID:ISv3uuWx
ツリー上に保存しなけりゃいいし
ダウンロードフォルダのルートで*でサブフォルダ含めて検索してもすぐまとめて表示されるしなあ
0615デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:49:02.22ID:NW9y+uW0
ツリーに保存しないとダメだからそうしてるんだけど。
この管理番号の画像これですよーと明示できなければならないからリストがあるわけで。
必ず4つ、必ず5つならDL時即時リネーム連番にしてもいいけど…3しかなかったり6あったりする
それを検索するにしても画像リストと照合しながら?工程増えすぎ。元の手順より面倒になってもw

waitはダメでした。
trancefar 〜
wait
trancefar ~
は使い方間違ってますか?
trancefar 〜複数URL
wait
もだめでした…
0617デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:56:32.80ID:ISv3uuWx
いちいち一個ずつ保存先指定するより楽だよ
検索っていっても保存先フォルダことにダウンロードすれば*でやりゃいい
0618デフォルトの名無しさん
垢版 |
2019/11/26(火) 16:10:59.88ID:XdTMGSyO
とにかくダウンロードが正常に終わるようにならないと先に進めないだろ
ダウンロード時にフォルダが決まるならそれで問題解決だし
外部ダウンローダを使うのなら、落としたファイルとurlとの対応が取れるのかが問題
それが可能(例えばファイル名が行番号になってるとか)なら
落とした後にファイルを対応するフォルダに移動すればいい
もちろんbat等の自動化で
0620デフォルトの名無しさん
垢版 |
2019/11/26(火) 16:26:58.84ID:NW9y+uW0
>>617
それ、ブラウザでURL開いて、保存先フォルダ開いてD&Dのほうが早いよ?
今時のブラウザ、コピペと同時に開くんだから。

>>618
それな;

>>616

そういう使い方になるのか!ありがとうございます!
でも空ファイルだったw
Dirとmdで生きてるのでもう脳みそ煮えてますわ…
0621デフォルトの名無しさん
垢版 |
2019/11/26(火) 16:34:10.52ID:NW9y+uW0
>>619
ある。%20とか?とか。
ttps://hoge.hoge.com/foto/img/MARC%20MAX/MARC%20MAX-20191003123-A-12345.jpg?123456
ttps://hoge.hoge.com/foto/img/MARC%20MAX/MARC%20MAX-20191003123-A-12346jpg?1234
こんな感じ。
bitsadmin~を一つだけ書いた場合はちゃんと動作するから大丈夫な・・・
えっ??まさか%%
0624デフォルトの名無しさん
垢版 |
2019/11/26(火) 16:57:32.34ID:XdTMGSyO
>>623
一般的なダウンローダなら、urlの末尾がファイル名になるが
名前の重複も多く起き、その場合、ダウンローダは自動的にリネームする
aaa.jpg, aaa(1).jpgのように
しかも(1)が付くのは早くダウンロードが終わったものでリストの上から順というわけでもない
これとリストにあるurlとの対応をとるのは大変だと思わん?
0625デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:03:32.54ID:JyI6kWkc
>>624
結局一つずつダウンロードする必要があるだろ?
やっぱり何を探せなないのが全くわからんなぁ
0627デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:07:32.81ID:NW9y+uW0
>>622
その方が早いと言ってます。どっちが早いか試してみたら?
https://www.yahoo.co.jp/ ロゴとその左右のアイコン
https://www.rakuten.co.jp/ ロゴから購入履歴までのアイコン
https://www.nikkei.com/ ロゴと、その下の写真3つ
DL先のフォルダ開く、URLひらく、D&D 3工程
URLをまとめてダウンローダーに入れる、ダウンロードフォルダにまとまって入ってるから開く、移動先のフォルダを開く、該当のファイルを検索する D&D 5工程
フォルダごとにURLをダウンローダーにいれる、ダウンロードフォルダにまとまって入ってるから開く、移動先のフォルダを開く、D&D 4工程
0628デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:10:41.82ID:ImxGWCjG
>>621
詰み
&なら "%%~B" とすれば行けたかもだけど
バッチで%〜%のエスケープは出来なくないもののかなり面倒くさい
powershellとか行った方がいい
どうせ自動化するのなら>>612の元listから抽出してDLする方法をPSスレとかで相談してみれば?
0629デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:15:21.53ID:NW9y+uW0
で、私はその3工程ですらめんどくっせーってなって、3工程とも省けんかなと考えた
#今後も同じ作業あるから、今なんとかできてると今後が楽。

ダウンローダーのダウンロード先の問題って、こうなるんだよね
tp://imepic.jp/20191126/620210
ふ、ふかい。(これはFirefoxアドオンのスクラップブック。DownloadAllThemもこういう感じ)
お気に入りのサイト見るだけならアドオンからわかるんだけど、画像を取り出すとなると
エクスプローラーに行く必要がある
0630デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:15:53.07ID:ISv3uuWx
>>627
エクセルに入れてるってんだから
まとめてURL処理してるんでしょ
D&Dをファイル数分しなくちゃならんのを言ってるんだが
まとめてURL処理してるならD&Dは1回でいい
0631デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:18:49.77ID:NW9y+uW0
>>628
うへwわろすwそういうことか!
Powershellはこっち以上に全くわからんな…
画像リストはGoogleスプレッドにぶんなげて作れてはいる
ありがとう
0633デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:23:52.25ID:NW9y+uW0
>>632
transfarされる前に次にいっちゃって、でもファイル作れって言ってるから空のファイルつくりましたって感じに見える
transfar実行画面のBYTE:0/0のところが、いっこづつやったときはにゅーーーって動いてファイル捕れるんですが
ここが0/0のままで次を始めてしまう
Wait入れようが、Pauseいれようが、そこは同じですね
0634デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:42:23.81ID:NW9y+uW0
>>631
エスケープさせてできました!!
コマンド自体もスプレッドシートに関数くんでやってるので、どこかの時点で%
を置き換えてやることにします。
ヒントありがとうございました。
みなさまもたくさんヒントありがとうございました。
0635デフォルトの名無しさん
垢版 |
2019/11/26(火) 17:50:12.00ID:XdTMGSyO
>>634
""で括ってやれば?
ダメならちょっと上のsetlocal enabledelayedexpansionを参考に

pushd %~dp0
for /f "tokens=1-3" %%A in (li.txt) do (
if not exist "%~dp0\%%A\." mkdir "%~dp0\%%A"
start "" /wait bitsadmin /TRANSFER FILEDOWNLOAD "%%B" "%~dp0\%%A\%%C"
)
0638デフォルトの名無しさん
垢版 |
2019/12/09(月) 14:56:56.31ID:0+3TB6cR
トレンドに#業務ハックというのが上がってた。フーン
ここにいるわるいオジサン達は徹底的に省力化して、あとは仕事するフリして過ごすようなことは
まさかしていませんよね?
0639デフォルトの名無しさん
垢版 |
2019/12/10(火) 05:01:38.65ID:CfjKoCjD
無理そうな気はしつつも質問

苗字<tab>名前<tab>年齢<tab>住所
田中<tab>太郎<tab>27<tab>大阪
山田<tab>花子<tab><tab>東京
佐藤<tab><tab>35<tab>

こんな表のテキストファイルを<tab>を区切り文字として列指定して読み込みたいんだけど
tokens=2,4
にしても連続した<tab>は一括りに扱われて山田と佐藤は対象の列がずれちゃうよね
これはもうvbsやVBAじゃないと無理ぽかな
0641デフォルトの名無しさん
垢版 |
2019/12/10(火) 07:44:27.57ID:CfjKoCjD
半角スペースは文字列として扱いたいから<tab>だけを指定してるけどダメよー
0642デフォルトの名無しさん
垢版 |
2019/12/10(火) 09:16:41.59ID:3V5uc2tI
>>639
tabの間にスペースを入れてみた。
これは前処理なので、あとはお好きにどうぞ

@echo off
set "t=<tab>"
call :x > test2.txt
pause & goto :eof
:x
for /f "delims=" %%i in (test1.txt) do ( set a=%%i
setlocal enabledelayedexpansion
set a=!a:%t%%t%=%t% %t%!
set a=!a:%t%%t%=%t% %t%!
echo.!a!
endlocal)

<tab>にはタブを入力
0643デフォルトの名無しさん
垢版 |
2019/12/11(水) 01:05:38.94ID:hz4JPg2Q
おお、値の無い列には半角スペースを入れてしまうわけか
こりゃ気付かんかったサンクス
0646デフォルトの名無しさん
垢版 |
2019/12/13(金) 04:06:09.26ID:t9dRWycX
>>645
レジストリ値弄れば出来たと思う。
昔職場の環境統一するのに使ってた。
詳細はRegshotとかで差分とって。
バッチからはRegコマンドで設定するかRegEdit /s で読み込むかのどちらか。
0649デフォルトの名無しさん
垢版 |
2019/12/19(木) 16:55:31.02ID:l8jrOhSU
こういうの実行するとサブフォルダのファイルでは空行ではなくピリオドが出力されるんですが何故ですか?
まあ実用上の問題は無いんですが

@echo off
for /r %%i in (*.*) do (
echo "%%~nxi"
echo.
)
pause
0652デフォルトの名無しさん
垢版 |
2019/12/19(木) 17:18:33.06ID:l8jrOhSU
>>650
はい、カンマを使うと問題が起きないことは確認していたのですがピリオドだと何故こうなるのか気になりました
0655デフォルトの名無しさん
垢版 |
2019/12/23(月) 21:26:36.07ID:qZ1/nSQb
startコマンドでAPを起動後、「F11」をバッチファイルから入力するには、どう記述すればいいのでしょうか?
0656デフォルトの名無しさん
垢版 |
2019/12/25(水) 01:34:54.95ID:vipj7N9s
echo class Program{static void Main(){System.Windows.Forms.SendKeys.SendWait("{F11}");}}>temp.cs
FOR /F %%i IN ('dir /b /s %WINDIR%\Microsoft.NET\Framework\csc.exe') DO set cscexe=%%i
%cscexe% temp.cs
temp.exe
0661デフォルトの名無しさん
垢版 |
2019/12/27(金) 00:09:22.71ID:CW1qzWXe
%1がフォルダ名の場合、サイズを示す%~z1は0以外の数字になる
何を表しているのか不明
0664デフォルトの名無しさん
垢版 |
2020/01/02(木) 17:54:09.99ID:LCDlLvJS
for の %~tI のみたいに簡単にディレクトリの作成日時を取得する方法教えてください
dir /tc 何か | findstr findstr /e /c:"<DIR> ."
みたいにして取り出して整形するのは何か間違えている気がしてならないので
0665デフォルトの名無しさん
垢版 |
2020/01/02(木) 20:56:32.19ID:gZNl6+48
%~t1 とかで出てくるのは更新日時じゃなかった?
作成日時ならそれでいんじゃね?
for /f "skip=3 tokens=1-3,5,6 delims=/: " %a in ('dir /tc %windir%') do (
echo %a%b%c%d%e
goto :LOOPOUT
)
:LOOPOUT
pause

日時はシステム依存で表示形式変わるので整形したい形に適宜tokensやdelims、echoのとこ弄るといい
何に利用するのか知らないけど powershell なら秒まで取得出来るしバッチより痒いところに手が届く
0667デフォルトの名無しさん
垢版 |
2020/01/03(金) 08:18:43.19ID:6GenP8Ub
ありがとうございます
何か一発でディレクトリ作成日時を取り出すなら PowerShell 使おう、
って話になるんですね、ミリ秒単位までいけるみたいですし
0668デフォルトの名無しさん
垢版 |
2020/01/03(金) 09:56:56.50ID:+cYn5CAB
forfiles でフォルダの更新日時も得られる、ただしファイルが多いと遅い
forfiles /M ファイル名 /C "cmd /c echo @fname @fdate @ftime"

dirだと得られない秒もOK、仕様がばらばら、バッチは不思議
0669デフォルトの名無しさん
垢版 |
2020/01/03(金) 13:02:11.21ID:fh28MJ7p
気まぐれに試してみたらskip=2と3の結果が同じでskip=4だった
ifでちゃんと絞った方が良さげ
for /f "tokens=1,3,4* delims= " %a in ('dir /ad /tc %windir%') do @if "%d"=="." @echo %a %b
0671デフォルトの名無しさん
垢版 |
2020/01/04(土) 07:59:26.77ID:T5YxFwCT
. と .. はディレクトリ作成時に同時に作成されルート以外の全ディレクトリに存在する特殊な .link のようなモノ
だから .. の(作成|更新)日時は自ディレクトリと同じ
.. は親ディレクトリを指し示すが親ディレクトリとは別のモノ
なぜと問われても、そういう仕様だから、としか
0672デフォルトの名無しさん
垢版 |
2020/01/04(土) 09:10:30.39ID:/SGph6WX
>>671
ピリオドは区切り文字であり、
ワイルドカードの?の文字数のカウントに含まれず。
ピリオドが先頭だと、最初のトークンは空文字列となり、
?は一文字以下の文字列を表すので、それに合致するわけかな。
ちなみに >>670 はそれより前のレスとは無関係
0675デフォルトの名無しさん
垢版 |
2020/01/06(月) 09:51:26.33ID:8LUwvv7f
先頭にドットがあると要注意だよな
ワイルドカードがドットを無視する場合があるから

>copy nul .txt
>copy nul txt
>dir/b
.txt
txt
>del txt*
>dir
ファイルが見つかりません
0676デフォルトの名無しさん
垢版 |
2020/01/08(水) 10:00:17.73ID:cX66OF4O
簡単な処理だからbatでいいかと思って書き始めたら思ったより複雑になって、なんでbatで書いちゃったんだろってなるのいい加減やめたい
0677デフォルトの名無しさん
垢版 |
2020/01/09(木) 05:17:30.74ID:yWGnEtOx
@echo off
for /L %%a in (1,1,666) do set /a a+=%%a
for /L %%a in (2,2,666) do set /a a+=%%a
echo %a%
pause
for /L で遊んでたらなんか凄いの見付けた
0679デフォルトの名無しさん
垢版 |
2020/01/17(金) 04:34:01.53ID:AQjsaOZ5
ドラッグ&ドロップ したファイル名を表示させようと思ってんだけど
win10です

テスト.bat
-----------------------

@echo off

for %%f in (%*) do (
echo %%f
)
pause
--------------------------

だとドラッグドロップしても画面が速攻消えてうまく起動しないんだけど(

ちなみに
@echo off
echo %1
pause
だけだとちゃんとフルパスで表示されます
%%と%の違いってなんですか?
0680デフォルトの名無しさん
垢版 |
2020/01/17(金) 05:40:03.52ID:FVJQifjo
引数が最低1つ以上の場合
:LOOP
echo "%~nx1"
shift
if not "%~1"=="" goto :LOOP
pause

引数が0個の可能性がある場合
:LOOP
if "%~1"=="" pause &exit /b
echo "%~nx1"
shift
goto :LOOP
0682デフォルトの名無しさん
垢版 |
2020/01/17(金) 08:39:02.58ID:FVJQifjo
>>679
その方法だとファイル名やPathに&とか全角spとかダメ文字含む+半角spが無くて
引数がクオートされていない場合に上手く行かない
がこの場合引数欠けるだけだと思うので落ちるのは文字コード(ShiftJIS)と改行コード(CR+LF)を確認
0685デフォルトの名無しさん
垢版 |
2020/01/18(土) 06:36:29.01ID:77YAYmoS
>あー>>680のやり方の方がいいわせか
そうじゃない。いいも悪いもない。こういう方法もあるよと提示しただけ
バッチはどうやってもバグを内包する。極論動けば何でもいい
バグを発生させないよう限定された条件の元で利用するかバグ避けコードを書くかになる
そういったのを理解した上で簡単な事をやるくらいならいいけど
少し複雑な事をしようとすると確実にあちらを立てればこちらが立たずで行き詰まったり面倒な事になる
面倒を避けたいなら初めからPowerShellとかでやった方がいい
今から覚えるなら尚更
0686デフォルトの名無しさん
垢版 |
2020/01/18(土) 08:02:35.56ID:UuH5oHRt
>>679
ドラッグ&ドロップ したファイル名に
たぶん ) があるんだろう
a(1).txt
とかね
なぜ落ちるか自分で考えてみろ
0687デフォルトの名無しさん
垢版 |
2020/01/18(土) 23:29:59.70ID:jJ2WRqDf
>>686
それな
バッチはこういう罠があるからPSに移行したわ
コメント欄に迂闊に括弧も使えないしこわいこわい
0689デフォルトの名無しさん
垢版 |
2020/01/26(日) 21:47:29.72ID:Nyn5xlpx
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のやつで最初に書かれていたんだけどまったく使わないわなんて思ってそのままでした。
0690デフォルトの名無しさん
垢版 |
2020/01/26(日) 23:31:16.84ID:Jc09ZNe5
そんなことまで無理にcmdでやらんでも・・・

WinMergeすら入れさせてもらえない環境なのか?
0692デフォルトの名無しさん
垢版 |
2020/01/28(火) 22:49:16.68ID:lbmGsP+l
"送る"って意外と不自由なんだな…
バッチファイルでワンクッション入れて(゚д゚)ウマー
0694デフォルトの名無しさん
垢版 |
2020/01/30(木) 20:40:29.71ID:6k+E856c
このバッチで何か入力しても a が消える

@echo off
set /p a=data=
rem %a=%
echo data=%a%
pause
0695デフォルトの名無しさん
垢版 |
2020/01/30(木) 22:45:14.45ID:VR7HU+gm
>693
勉強不足があるかも知れんが
・さっさと画面を閉じちゃう(cmd/kで回避)
・%1に入れてくれない
・ファイル名の後ろにオプションが付けられない
0696デフォルトの名無しさん
垢版 |
2020/01/30(木) 23:26:29.39ID:D5cDwkr0
ワンクッションってそういう意味か
昔からスクリプトを送るに登録することなんて当たり前のことだったけどね
むしろexeしか登録しない人はこのスレにはいないとまで思ってた
0697デフォルトの名無しさん
垢版 |
2020/01/31(金) 11:16:38.40ID:JWfC0/9e
>>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
0698デフォルトの名無しさん
垢版 |
2020/02/09(日) 18:23:32.44ID:62ExnvKA
叩いたらスクリーンセーバーをオフにしたく、killでスクリーンセーバーのscrファイルを終了させるバッチを作ったんだけど、Windows10のタブレットモードで動かすとスタートメニューが起動してしまう。
元々立ち上げてたソフトを表示したいんたけど何か良い方法ないかな?
ソフトを立ち上げっぱなし→スクリーンセーバー起動→条件下でスクリーンセーバーkillバッチ→立ち上げてたソフトに戻る
ってのにしたいのにkillバッチ→スタートメニューになってしまう

あと、バッチを走らせると一瞬黒いcmd画面がでるのでvbs経由で画面を出さないようにしようとしたけどこちらもうまくいかない…
0699デフォルトの名無しさん
垢版 |
2020/02/10(月) 13:13:43.33ID:0DoxGo8j
スクリーンセーバー動いてるのに、
どうやってバッチ叩いてんの?
さっぱりわからん
0702デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:11:28.69ID:DSTYXSth
特定のキー操作で解除するタイプのスクリーンセーバーなのかな?
でもそれならそれでkillするんじゃなくて該当のキーを送ればよいだけな気がするけど
0703デフォルトの名無しさん
垢版 |
2020/02/11(火) 17:51:57.47ID:hksaF/sY
Windows7標準のmklinkでシンボリックリンクを作ると
リンクのタイムスタンプ(作成、更新、アクセスいずれも)は
リンク先ファイルのタイムスタンプに関係なくリンク作成時点のものになり
普通のファイルのようにはタイムスタンプを変更できないようだけど
変更する方法ある?

ハードリンクなら同じものを見ることになるから勝手に揃うけど
使い分けの方針が定まらなくてあまり使ってない
0704デフォルトの名無しさん
垢版 |
2020/02/11(火) 23:47:43.79ID:9k84sg+E
>>703
シンボリックリンクの実体はファイルだからSetFileTimeで変更できるらしいぞ
らしいってのは俺がシンボリックリンクつかったことないからね
0705デフォルトの名無しさん
垢版 |
2020/02/14(金) 23:11:39.08ID:2Mmdz3hG
Windows Vistaは2017年にサポートが終了しましたがWindows Server 2008向けのセキュリティ更新プログラムを手動でインストールすることができていました。
ところがどの順番でどれをインスコすればいいのか面倒、、、それを解決するバッチプログラムを作った方がいます。
バッチファイルの記述がフムフム、へぇ〜という感じで自分にはとても勉強になりました。興味ある方はどぞ

創造の柱
http://blog.livedoor.jp/pillars_of_creation/archives/1831755.html
0706デフォルトの名無しさん
垢版 |
2020/03/24(火) 10:56:05.36
このスレで聞くべきなのか分かりませんが、Windowsで数千個のPDFを一括処理したいので、取りあえずここで聞いてみます。

PDFをAcrobatで開いた時のプロパティ(「文書のプロパティ」で、"表示"、"ページレイアウト"、"倍率"を設定できますが、
1つ1つ手作業で設定するのはさすがに無理です。
Javaの様なプログラミング言語でも、他のアプリでも何でもいいんですが、この文書のプロパティを一括で設定する方法って何がありますか?
0708デフォルトの名無しさん
垢版 |
2020/03/24(火) 19:52:05.20ID:LC2xv/4E
変更前後のAcrobatのレジストリをエクスポートしてdiff比較してどこが変わってるか確認するのが最初にやることだろうね
0710デフォルトの名無しさん
垢版 |
2020/03/24(火) 20:53:17.46ID:k6OnWQi4
そもそもPDF側に表示方法が保存されてるものなの?
結局Acrobat側の問題じゃない?
0711デフォルトの名無しさん
垢版 |
2020/03/24(火) 22:35:05.89ID:tH0Sn0AY
「pdf コマンドライン ページレイアウト」でググったら
cpdf (Coherent PDF Command Line Tools) を紹介するサイトが出てきた
これ、見開きを縦スクロールにしたり単ページにしたりできて面白い
"倍率" が 2017/10 の時点で無理らしいけど
0712デフォルトの名無しさん
垢版 |
2020/03/26(木) 01:20:56.78ID:3WOBAGMl
ID消して質問してるのがすげー腹立つな
本当に解決を望んでるなら逆にコテ付けるぐらいできんのか
0714デフォルトの名無しさん
垢版 |
2020/04/18(土) 11:05:03.45ID:6HUykZ9A
今でもたまに使うけどUTF8系のスクリプトとの相性がめっちゃ悪いな
いちいちコードページ指定するとなんかウィンドウが切り替わって重いし

cmdをchcp 65001 (UTF8)で常用するって現実的じゃないよね?
0716デフォルトの名無しさん
垢版 |
2020/04/18(土) 16:57:49.71ID:VodBEB+r
例えば、こんなバッチをutf-8で作成して実行する。
できたtest.txtを見たら1行しかない。なんでだ。
@echo off
chcp 65001
call :test > test.txt
exit
:test
echo テスト
echo テスト
0717デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:12:48.44ID:fYZW+FI9
このスレで、utf-8 のバッチファイルにするなら、
行末は半角英数な文字にしとけ
というのを学んだ、>>262 からの流れ

なんでなのかはいまだに知らない
0718デフォルトの名無しさん
垢版 |
2020/04/18(土) 17:22:50.42ID:D5FH+wQt
2つめのechoがエラーになってるね

echo テスト

echo テスト
と間に空白行を挟めば正常だがどういう理屈なのか分からん
0720デフォルトの名無しさん
垢版 |
2020/04/21(火) 19:56:52.87ID:vK3trFFL
%2つというのは、何らかのエスケープですか?
また、forを使うときにfor %iなどとしますが、%の意味がよくわかりません
0721デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:11:11.38ID:vK3trFFL
フォルダ内のファイルを連番つけてリネームする方法はわからないでしょうか
forを使用してインデックスを連番として付与する感じだと思うんですが

ファイルはこんな感じです
犬.txt
猫.txt
猿.txt
0722デフォルトの名無しさん
垢版 |
2020/04/21(火) 21:17:03.32ID:FdhLTsrP
>>720
%は互換性や拡張などのおかげで大変ややこしい事になっている
説明するには小一時間かかるのでここでは控える事にする
0724デフォルトの名無しさん
垢版 |
2020/04/21(火) 22:46:58.98ID:HADG6GDb
>>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
0726デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:04:39.20ID:s3lLVMWt
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
0727デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:14:39.66ID:J0u+GdjC
リネームは結構難しい
リネーム後のファイルが再びリネーム対象となる場合がある
0730デフォルトの名無しさん
垢版 |
2020/04/21(火) 23:49:32.13ID:GY5lnYbX
リネームは一覧を一旦ファイルに出力してから回した方が安全だよ
それとファイル名にUNICODE文字が混ざってる場合も考慮するとバッチファイルではやらん方がいいよ
vbsかjsかpowershell
0731724
垢版 |
2020/04/21(火) 23:57:26.74ID:HADG6GDb
>>724
のRuby では最初に、Dir.glob( "C:/Users/Owner/test/*" )
で、そのフォルダ内のすべてのファイルを取得しているから、

各ファイルを、rename していく途中で、
rename後のファイルを、再びrenameすることはない
0732デフォルトの名無しさん
垢版 |
2020/04/22(水) 00:04:16.90ID:vEO7RF6u
>>730
ファイル出力というかfor/fでdir出力の取り込みでいいんじゃね?
UNICODE文字は関係あるかね?
0733デフォルトの名無しさん
垢版 |
2020/04/22(水) 06:52:59.32ID:gobEj/px
>>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の名前は何でもいいが既存の名前を避けてください。
0735デフォルトの名無しさん
垢版 |
2020/04/22(水) 10:16:03.76ID:MJO3kN2U
駄目文字のせいでSJISコードがバグると言うならまだわかるが
その逆って意味がわからないな
MSは全くテストしてないってことか
0736デフォルトの名無しさん
垢版 |
2020/04/22(水) 11:07:12.34ID:/W5c3Vma
>>722-735
どうも
勉強中です
0737デフォルトの名無しさん
垢版 |
2020/04/22(水) 11:53:22.55ID:/W5c3Vma
複数行を一行にまとめる場合は、&でつなぐんでしょうか?
これが改行と同じ意味でしょうかね。
0738デフォルトの名無しさん
垢版 |
2020/04/22(水) 12:07:17.67ID:vEO7RF6u
>>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 コードページ変えればいいだけ
0739デフォルトの名無しさん
垢版 |
2020/04/22(水) 19:08:42.79ID:nR8TNEgs
>>737
複数行をまとめるって、、
文字列の足し算の話?
コマンドを複数行に分割して記述する話?
(継続文字のこと?)
0741デフォルトの名無しさん
垢版 |
2020/04/22(水) 20:05:53.95ID:j1ZYXyL3
>>735
コマンドプロンプトは自体はUNICODE対応
各種コマンドもUNICODE対応

だけどバッチファイルは過去の互換性が必要なので
デフォルトではOSの設定(日本語だとSJIS)の文字コードとして使われる。
その設定はchcpで変えることが出来る

単にコマンド呼び出しをしてるだけならUNICODEとして扱われるが
forでバッチファイルの世界に招き入れたら、
chcpの設定によって文字コードの変換が行われる

テストはしてるだろ。この文字コード変換は仕様なので
バッチファイルでUNICODE文字を扱いたければchcpで
UTF-8に変更しなければならないというだけのこと
0742デフォルトの名無しさん
垢版 |
2020/04/23(木) 06:47:17.74ID:153+oMoq
>>739
バッチファイルではなくて、複数行をコマンドプロンプト上で実行したい場合があったりします
0743デフォルトの名無しさん
垢版 |
2020/04/23(木) 08:24:04.38ID:5iduMLE+
>>742
複数行をコピペじゃ駄目なの?
例えば、この内容をメモ帳に記述しておいて

rem ―- ここから ――
dism /online /cleanup-image /restorehealth
sfc /scannow
rem ―- ここまで ―-

4行をコピペする
0744デフォルトの名無しさん
垢版 |
2020/04/23(木) 09:07:36.24ID:Z6s7Y3Lu
>>742
複数コマンドを1行で実行したいということなら、、、
A & B ... A実行後にBを実行
A | B ... Aの実行結果をBに渡して実行
A && B ... Aが成功したらBを実行
A || B ... Aが失敗したらBを実行

長いコマンドを複数行に分割したいなら、、、
Sentence1 ^<改行>
Sentence2
(サーカムフレックスで継続)
0745デフォルトの名無しさん
垢版 |
2020/04/23(木) 12:04:05.59ID:qTwHi2aC
()で囲めばいい。

(timeout /t 300
cd d f:\hoge
for %f in ( *.jpg ) do (
 ・・・
)
)

正式名称が何かは知らないが勝手にブロックと呼んでる。
0748デフォルトの名無しさん
垢版 |
2020/04/23(木) 15:25:29.03ID:153+oMoq
>>743コピペでももちろんいいですが、知っておきたかったです
0752デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:05:24.10ID:FVxXRtXH
連番をつけるコードでまだ躓いています
hoge.txt
hogehoge.txt

hoge(1).txt
hogehoge(2).txt
としたいです
echo off & for %i in (*.txt) do (ren %i ???)
このはてな部分に連番を指定するためにインデックスを指定しないといけないと思うんですが、%i自体にはファイル名が入っていると思います。インデックスは取れるんでしょうか?
0753デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:36:58.48ID:FVxXRtXH
バッチでset /aなどのオプションがありますが、/aは計算を伴う場合に使うそうです。
この/aに意味はあるのですか?
何らかの単語の略だと覚えやすいんですが。
0754デフォルトの名無しさん
垢版 |
2020/04/26(日) 18:40:50.40ID:Pfsg7A5O
その程度ぐぐれば出てくるでしょ
インデックスのカウント用変数が必要+変数の遅延展開
丸括弧のエスケープが必要
aはarithmeticの略
0755デフォルトの名無しさん
垢版 |
2020/04/26(日) 20:15:42.23ID:cczyU4e/
@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
0757デフォルトの名無しさん
垢版 |
2020/04/26(日) 22:18:32.20ID:DxwpR+0O
普通に do call :x "%%~i" でいいと思うんだが何故いちいち set a=%%i とかしてるの?
何か理由あるん?
0759デフォルトの名無しさん
垢版 |
2020/04/28(火) 05:49:29.43ID:ceHl0duT
シェルスクリプトってお手軽省略表記にこだわりすぎるあまり
エスケープ処理が複雑化しバグりやすくなって本末転倒だよな
0761デフォルトの名無しさん
垢版 |
2020/04/28(火) 13:01:40.55ID:DKHJb1hS
他の言語でもエスケープは必要なことはあるし同じこと
ただbatのように自身を置換して逐次実行するするようなことは
eval系の命令を使う場合なのでほぼ無いに等しいので意識されないだけ
0762デフォルトの名無しさん
垢版 |
2020/04/28(火) 16:44:00.76ID:3RXW9/E3
要するに分かりにくい
ここで初心者にイロハから質問されてもレスがしにくい
リネームソフトでも使え
0763デフォルトの名無しさん
垢版 |
2020/04/28(火) 17:37:46.72ID:7TaGv6sC
>>759
シェルスクリプトでエスケープ処理が複雑なんて
したことがないんだがどういうケース?

むしろバッチファイルのほうがややこしすぎる
バッチファイルでダブルクォートはいつつけるか言える?
スペースが含まれたファイル名とか

バッチファイルでこれの出力結果は
echo "C:\Program Files"

↓これです。(ダブルクォート含む)
"C:\Program Files"
0768デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:35:28.46ID:C/yTg51l
>>766
俺の定義ではバッチファイルはシェルスクリプトだ

config.sysに
shell=command.com /e:1024
とか書いてたからな
0769デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:39:22.04ID:C/yTg51l
ちなみにMS-DOSにはエスケープ文字なんて無い
0770デフォルトの名無しさん
垢版 |
2020/04/28(火) 20:40:45.75ID:f4hk4dsD
>>768
意味わかんないから調べたが、
今では全く通用しない話じゃねーかよ。

てめーの定義を押し付けんな。
0772デフォルトの名無しさん
垢版 |
2020/04/28(火) 22:38:03.31ID:0mXw36Cx
>>769
Delims句でイコールを区切り文字にしたいときはサーカムフレックスでエスケープする必要があるときがあるけどね。
0775デフォルトの名無しさん
垢版 |
2020/04/29(水) 06:34:57.98ID:bLWOmnfL
UNIXとかでshやbashがログインシェルとかインタラクティブシェルになるのと同じだよ
shやbash=cmd
シェルスクリプト=バッチファイル
シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前
0777デフォルトの名無しさん
垢版 |
2020/04/29(水) 07:15:11.82ID:sus1L+2H
>>775
> シェアが段違いのWindowsのバッチファイルがシェルスクリプトよりずっと複雑なのは当たり前

シェアならLinuxのシェルスクリプトの方が多いよ
今はsystemdに置き換えられつつあるが、起動処理の多くで
シェルスクリプトが使われていた。
各アプリのビルドなどでもシェルスクリプトは使われている。

それに対してバッチファイルは殆ど使われていない。
そもそもWindowsのコマンドは、他のコマンドの出力を読み取って
別のコマンドで処理するように設計されていない
単に呼び出すだけ。だからバッチファイルという名前になってる

例えばcopyコマンドであってもシェルスクリプトであれば、コピーが正常に終了した場合
なにも表示されないのでスクリプトとして使いやすいが
Windowsのcopyは人間用のメッセージがいちいち出る
コマンドの出力を変数に入れるだけでも大変
遅延環境変数の展開を使わなければ変数の中にメタ文字的なものが入るだけで簡単に壊れる

そもそもの設計思想がスクリプトを組むためではなく、単にコマンドを並べるという使い方を
するためだからバッチファイルはシェルスクリプトだけでなく
PowerShellスクリプトやVBScriptよりも使いづらくなってしまっている

一方、PowerShellスクリプトやVBScriptはコマンドをよびだすのが
面倒になってるので両立してるシェルスクリプトにはかなわない
0786デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:46:37.87ID:jiFNKMfo
滅茶苦茶初歩的な質問ですまん

バッチファイルからPythonスクリプト実行してPythonスクリプト側でprintした文字列をバッチファイル側で取得する方法ってある?
0787デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:51:16.63ID:cw3NlGJG
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメーター]
または usebackq オプションの場合:
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメーター]
0788デフォルトの名無しさん
垢版 |
2020/05/07(木) 18:51:30.99ID:jiFNKMfo
もしくはコマンドプロンプトに出力された文字列を出所問わず取得したい
0789デフォルトの名無しさん
垢版 |
2020/05/07(木) 19:01:03.56ID:jiFNKMfo
>>787 ありがとう、いけたわ

logzero使ってるライブラリでこれやろうとすると途中で処理が止まるけど、これは他の問題かもしれんな
0792デフォルトの名無しさん
垢版 |
2020/05/07(木) 19:47:29.96ID:jiFNKMfo
logzeroさらっと調べても設定全く分からんので今回は該当部分の出力だけlogzero.infoからprintにして無駄な出力を省いた
出力取得できたのでまあよし
0793デフォルトの名無しさん
垢版 |
2020/05/07(木) 20:17:47.30ID:2gF3mugX
>>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
0794デフォルトの名無しさん
垢版 |
2020/05/12(火) 09:27:08.95ID:hWMQZbFi
>コマンドプロンプト入門 Kindle版

2020年にこれを出すとはチャレンジャーすぎるな
0795デフォルトの名無しさん
垢版 |
2020/05/12(火) 16:03:14.69ID:PeLhefIP
amazonで、確認すると、2019/09の出版みたいですね。
どうせなら、power shellの本出したほうが良かったかも。
0796デフォルトの名無しさん
垢版 |
2020/05/12(火) 18:45:23.48ID:NJ7uTfC9
ファイル名に「b」を含むファイルをコピーするときに
たとえば
abc.txt というファイルがあって

copy *b*.txt def.txt
がオッケーで
copy *b* def.txt
がエラーなのはなぜですか?

*は0文字以上の文字列なので
両方とも成功すると思っていたのですが
0798デフォルトの名無しさん
垢版 |
2020/05/12(火) 19:55:35.27ID:UaCqmgBQ
>>796
普通にできるけどどんなエラーが出るの?

ちなみにその書き方だと *a* が複数ある時は連結されてしまうけどな
0800デフォルトの名無しさん
垢版 |
2020/05/23(土) 20:41:18.51ID:H5g1ckea
Windows Terminal で音を鳴らすにはどうすればいいですか

コマンドプロンプトではControl-Gを出力してたんですが
Windows Terminalでは無視してくれやがります
0801デフォルトの名無しさん
垢版 |
2020/05/23(土) 22:23:07.24ID:105ldQbQ
start beep.wav
0802デフォルトの名無しさん
垢版 |
2020/05/23(土) 22:45:59.81ID:H5g1ckea
そんなんだったら

>copy con beep.cmd
echo ^G
waitfor /T 3 waiting
^Z
1 個のファイルをコピーしました。

>start /min cmd /d/c beep.cmd

とするけどもっといい手はないかなと
0807デフォルトの名無しさん
垢版 |
2020/06/03(水) 20:30:01.66ID:HabAm56l
バッチでやるような処理でも
勉強兼ねてpowershell使って処理するようにしたほうがいいですか?
0810デフォルトの名無しさん
垢版 |
2020/06/03(水) 21:04:50.01ID:mm84GRB0
>>809
どういう現場か知らないけど
Widn7 SP1 PSv2 縛り
なんて現場でPS書きたいとか思わないね。

使わせてくれる現場なら使うべきだし、そうでないならバッチをシコシコ書くしかないのよ。
0812デフォルトの名無しさん
垢版 |
2020/06/03(水) 22:11:19.84ID:JNM2fzED
PSでできること=C#でできることだからバッチとは全然できることが違うよ
PSv2でも十分バッチとは天地の差がある
0813デフォルトの名無しさん
垢版 |
2020/06/03(水) 22:22:36.62ID:5eIQQTQm
元の質問が、「バッチでやるような処理でも」なんだけどな
ちゃんと読んでるか?
0814デフォルトの名無しさん
垢版 |
2020/06/03(水) 23:24:38.53ID:Gm6SBE/O
>>809
情報量ならPowerShellの方が上だし
TechnetフォーラムならPowerShellのカテゴリーあるし
ポケットリファレンスの著者である牟田口大介まで出没している

ストアアプリのインストールとかはPowerShell必須だし
バッチのみじゃ書けない物も割と多い

処理の内容は忘れたけどバッチでやれた事を
PowerShellで書いたらキー入力を要求されて
かえってバッチの方が良かった場合もあるけど
そんなパターンは圧倒的に少ないと思う

でもウチの場合、PowerShell使いがいないから
というのが最大の理由で実務はバッチだらけ

良いか悪いかならきちんとメンテナンスが出来る物が良いであるべき

個人の感想ならばPowerShellって
バージョンが上がって非互換が出そうなので避けたい
0815デフォルトの名無しさん
垢版 |
2020/06/04(木) 09:41:35.56ID:Di3Z81qX
9x系(95/98/Me)のWindows用MS-DOSプロンプトとNT系(それ以外)のWindows用コマンド・プロンプトの違いさえ
意識していれば、バッチファイルの利用は難しくないと思う。
VBScript(WSHことWindows Script Host)の場合は9x系とNT系に関係なく、WSHバージョン5.1以降かどうかさえ
気をつけていれば概ね大丈夫だと思う。

それらに比べてPowerShellは、個人的にはハードルが極めて高い。
0816デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:05:12.56ID:iofqxoab
>>813
当然「バッチでやるような処理でも」PSなら十二分にこなせるよ
このスレで話題になるような変なクセや制限もないしね
0817デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:12:12.70ID:iofqxoab
>>814
PSはバージョン指定(-vオプション)すればそのバージョンが実行される仕組みを持ってるから互換性についてもある程度クリーンだよ
0818デフォルトの名無しさん
垢版 |
2020/06/04(木) 15:16:33.10ID:efimIni8
BATの典型的なものとしては
シーケンシャルに
・外部アプリ呼び出し
・ファイルコピーや移動
・メッセージ表示
であって、こんなものをPowerShellで書く必要は無いし、ステップ数も余分にいる
0820デフォルトの名無しさん
垢版 |
2020/06/05(金) 09:26:58.17ID:YNSaAEsR
バッチファイル内で、複数の文字列の一部だけを羅列して、それをまとめて補完したものを変数に入れたい

具体的には
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
)
のようにして、増減や修正を簡単に出来るようにしたい

したいんだけど、なんかうまく動いてくれない


何かヒントもらえますか?
0821デフォルトの名無しさん
垢版 |
2020/06/05(金) 10:14:13.82ID:YNSaAEsR
自己解決
どうやらこんな感じで動きそう

for %%f in (tech prog win newsplus) do (
 call :APPEND %%f
)

:APPEND
set LOGFILES=%LOGFILES% %LOG%\%%f\*.dat
goto :EOF
0822デフォルトの名無しさん
垢版 |
2020/06/05(金) 11:33:35.77ID:xkF+o6Lc
>>820
setlocal enabledelayedexpansion
for %%f in (tech prog win newsplus) do (
 set LOGFILES=!LOGFILES! %LOG%\%%f\*.dat
)

じゃダメなの?
0823デフォルトの名無しさん
垢版 |
2020/06/05(金) 11:53:35.34ID:YNSaAEsR
あれ?出来ますね

実は!で囲むのもやってみた(つもりだった)んだけど
(たぶん、どっか別のちょっとしたところでミスしてて)
その時はうまく動かなかったんですね

失礼しました
0824810
垢版 |
2020/06/06(土) 00:36:10.94ID:ZNTMwsEj
>>817
業務システムのくせに -v の無いPSスクリプトを Win7 上で動かしてるクソシステム、あるよ。改修したくもないけど。
PS は ver.3 で破壊的変更がなされたから、ver.2 に合わせて勉強するだけ無駄だと言われている。
core になって COM も切られたから Word や Excel ファイルへのアクセスも今後どーなんの?的な段階。

また、PS が「管理の自動化」を目指しているのに対して、バッチや WSH は「一般ユーザーの定型操作の自動化」を目指しているから方向性自体が違う。
おまけにバッチとWSHはもう仕様変更が無いという強みがある。

等価なものを個人的に PS でリライトしてみる、はいいと思うけど、本番環境に入れるのはNGかな…。
0825デフォルトの名無しさん
垢版 |
2020/06/09(火) 07:37:38.68ID:xQo5RGeQ
長々と更新してもcmd変わらず放置
不具合あればPS使えということか
バッチに未来は無い
0827デフォルトの名無しさん
垢版 |
2020/06/09(火) 22:16:29.17ID:aAgqnyde
バッチ処理って簡単な定時処理に使ってる人がほとんどだろうし
現状維持でこのまま使えたらそれでいいよ
0828デフォルトの名無しさん
垢版 |
2020/06/14(日) 08:05:01.57ID:Nip9LUw0
教えてください。
引数以外でショートカットの情報をバッチに渡すことはできますか?
バッチ自体のファイル名、パス名を取得する方法はよく見かけますが、、
ショートカットのファイル名や親フォルダの情報をバッチに渡す手段ってやっぱりないですかね?
0829デフォルトの名無しさん
垢版 |
2020/06/14(日) 10:09:40.34ID:Rvue1P4U
ショートカットって何の?起動したバッチファイルのもの?
ショトカ自体は dir *.lnk で取れるけど複数あると特定は面倒臭かったり無理かも
どのlnkからバッチが起動されたか?は作業ディレクトリがそのlnkと同じだとか限定条件下でないと無理じゃないかな
0830デフォルトの名無しさん
垢版 |
2020/06/14(日) 10:41:39.28ID:Nip9LUw0
>>829
やっぱり無理そうですね。
ショートカットのファイル名をショートカットのコマンドラインに渡してバッチに引き渡そうと企んだのですが、、、
%0とか%~dp0とか記述しても記述そのままで%1に渡るだけでした。
何か方法ないのかなと思い、、あきらめます。
ご回答ありがとうございます。
0831デフォルトの名無しさん
垢版 |
2020/06/14(日) 11:24:19.06ID:2FaHAA2B
ショートカットのプロパティで作業フォルダを弄ればいいだろ。
リンク先のバッチで%cd%参照。
ファイル名なんてリンク先に合わせりゃいいだろ。
0833デフォルトの名無しさん
垢版 |
2020/06/14(日) 11:45:22.44ID:2FaHAA2B
プロパティのリンク先に自分のフルパスを追加してもいい
リンク先のバッチで%1参照。
0834デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:14:20.27ID:Nip9LUw0
>>831
仰る通り。
それがメンドーだな、と思っただけです。
プロパティ弄らずにファイル名変更だけで挙動変えようかと、、、
0835デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:15:45.60ID:Nip9LUw0
>>832
そういうの、いろいろありますね。
VBSとかPSとか。
後者をSendToに入れてフォルダ内調査に使ったりしてます。
0836デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:16:13.25ID:Rvue1P4U
ショートカット名を動的に生成してダブルクリックだけでリンク先のバッチへ引数として渡したいって事なんじゃないの?
ショートカット名を一時ファイル代わりにしたかったんだと思ってたけど
0837デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:17:49.77ID:Nip9LUw0
>>833
プロパティ弄るなら、素直に引数指定すれば良さそうです。

みなさんご意見ありがとうございます。
0839デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:20:20.62ID:Nip9LUw0
>>836
ショートカットを別フォルダにコピーするだけで、そのショートカットの親フォルダをバッチに渡すということをしたかったです。
ただのめんどくさがりです。すみません。
0840デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:25:13.85ID:Nip9LUw0
ショートカットの代わりにバッチを呼ぶためのバッチを作ればよいことに今気づきました。
ショートカットのコマンドラインで自分を参照する記述が出来そうもないことも確認できたので収穫でした。
みなさんおつきあい頂きありがとうございます。
0841デフォルトの名無しさん
垢版 |
2020/06/14(日) 12:32:21.09ID:Rvue1P4U
>>839
それなら >>838 で可能
作業フォルダを空欄にしたショートカットを目的のフォルダにコピーしてダブルクリック echo %cd% で取れる
0843デフォルトの名無しさん
垢版 |
2020/06/14(日) 19:57:43.39ID:Nip9LUw0
>>841
おおお、なるほど!
StartInを指定しなければ、CurrentDirectoryは移動しないのか。
リンクファイル名の方は無理そうですが、親フォルダはこれでいけそうです。
感謝!!

VBAのApplication.Callerみたいなのが書ければいいんですけどね。
0844デフォルトの名無しさん
垢版 |
2020/06/14(日) 20:09:16.72ID:2FaHAA2B
作業フォルダが空だと他所のフォルダからD&Dしたらそっちになるけどな。
あと、管理者権限で実行したらC:\WINDOWS\system32になったりする
0846デフォルトの名無しさん
垢版 |
2020/06/14(日) 21:58:02.09ID:Nip9LUw0
すみません。もう1つ質問です。
バッチ自身を最小化して起動するときどうされてますか?
これが理由の1つでショートカット起動していたのですが、代わりにバッチを使うとコンソールが表示されてしまいます。
サイトでよく見かける、@If not "%~0"... というやつは、Win7のためか機能しません。
普段は固定的に行う場合は、ショートカットやVBSをはさみ最小化実行しているのですが、、
うまい方法があれば教えてください。
0847デフォルトの名無しさん
垢版 |
2020/06/15(月) 14:19:29.38ID:YYrFY+5A
無い
0851デフォルトの名無しさん
垢版 |
2020/06/16(火) 06:44:47.17ID:zfRgO9so
PowerShell なら、

# ショートカットファイルのフルパス
$fn = "フルパス"

# ショートカットファイル(.lnk)から、リンク先パス(TargetPath)を読み取る
$link = $wsh.CreateShortcut( $fn )

# 画面に表示する
Write-Host "$( $fn )`nTargetFile: $( $link.TargetPath )"
0852851
垢版 |
2020/06/16(火) 06:47:46.73ID:zfRgO9so
>>851
修正

一番上に、これを入れて

$wsh = New-Object -ComObject WScript.Shell
0856デフォルトの名無しさん
垢版 |
2020/06/16(火) 22:29:49.48ID:woSalLPH
>>851
あれ、まだ続いてましたね。
えーと、リンクファイルの情報を取得するのではなくて、リンク先からリンク元を取得できないか、という相談でした。
結論としては、.LnkのStartInをクリアすることでBatch側から%CD%にて.Lnkの親フォルダは取得可能だが、
.Lnkのファイル名を取得する手段はない、と認識しました。
もしかして、PowerShellなら取得できますか?
0857デフォルトの名無しさん
垢版 |
2020/06/16(火) 22:38:20.68ID:woSalLPH
>>854
Batchを複製すればできますね。
でも仕様を変更したくなったときばらまいたBatchをすべてメンテするのがメンドーなので設計は1カ所にしておきたい。
ショートカットファイルだとリンク先からリンク元のファイル名を取得できない (Pathは取得可)のでこれを別のバッチで代用すれば対応できる。
(現時点、これで代用してます)
でもこんどは起動がショートカットからBatchに変更されたことで最小化起動ができなくなった。
で、バッチを最小化で生起動する方法は、、無い!という結論です。
というところで諦めています。
0858デフォルトの名無しさん
垢版 |
2020/06/16(火) 23:14:22.53ID:yH2E1+y3
おまえ要領を得ないって良く言われるだろ
何を最小化したいの?コンソール画面?バッチから起動したアプリ?
アプリ起動にバッチを介するようになって困っているようだけど
コンソールはすぐ消えるから大して困らんでしょ
その一瞬も困るってこと?
コンソールならバッチへのショートカットのプロパティに[実行時の大きさ]
アプリならstart /min
そのバッチを貼れない理由でもあるの?
0859デフォルトの名無しさん
垢版 |
2020/06/16(火) 23:24:30.52ID:C/0BZ8DU
そんなへんなことするようなものは俺なら要らんと言うな
説明書に手順を書くなり、起動用のps1やvbsでも同梱しとけばいいと思う
0860デフォルトの名無しさん
垢版 |
2020/06/16(火) 23:48:59.36ID:zfRgO9so
漏れなんか、ダブルクリックで、Ruby スクリプトを実行するために、
test.vbs に、起動部分だけを書いてる

CreateObject("WScript.Shell").Run "ruby .\script.rb", 0
0862デフォルトの名無しさん
垢版 |
2020/06/17(水) 03:27:41.75ID:pABU+G65
だから結論はでた、諦めてると言ってるだろ。
返してくれた方がいたので返答しただけ。
ただ一瞬コンソールが表示される挙動がきっちゃないからキライってだけ。
はい、本件Close。
有用な情報提供いただいた皆さんありがとう。
0868デフォルトの名無しさん
垢版 |
2020/06/18(木) 20:51:24.52ID:sqKtSFf3
ここまでの流れで誰も配布するなんて話してないのにお前は何を言ってるんだ?
866の好きにさせとけよ
0869デフォルトの名無しさん
垢版 |
2020/06/18(木) 22:53:59.19ID:EpKOfb9E
>>868
はい、自分用です。ご安心を。
中身もつまらない小物ツールですので。
技術的な情報が知りたかっただけです。
また教えてください。
0870デフォルトの名無しさん
垢版 |
2020/06/19(金) 00:05:08.15ID:HgOFevSP
クローズしたそうだが
コンソール画面を見たくないのなら
レイアウトの位置を右下に詰めろ。
ほとんど見えなくなるぞ
0873デフォルトの名無しさん
垢版 |
2020/06/19(金) 03:17:24.40ID:7A38Sw4m
テキストファイルから空行を除く方法
findstr /R .

ただし空白やタブのある空行は失敗
0874デフォルトの名無しさん
垢版 |
2020/06/19(金) 05:11:07.46ID:HgOFevSP
>>873
タブやスペースだけの行をスキップするには
findstr /r /c:"[^ ]"
^と]の間にタブとスペース入力
バッチではエディタでタブ入力できるが
コマンドプロンプトでタブ入力するには cmd /f:off で
0876デフォルトの名無しさん
垢版 |
2020/06/27(土) 20:08:23.94ID:dZCme2QN
テキストファイルに入ってる文字列を
一行ごとに読み込んで
フォルダを作るバッチをつくったのですが

半角スペースの文字列が分割されてしまいます
これって対応策ありますか?
0879デフォルトの名無しさん
垢版 |
2020/06/30(火) 15:01:18.03ID:SwuJ9TNP
ファイル名全角英字の大文字小文字を同じとみなしていた
A.txt に他フォルダのa.txtを上書きコピーしてもA,txtのままだった
Aaは全角英字
芸が細かい、いいか悪いかは別として
0880デフォルトの名無しさん
垢版 |
2020/06/30(火) 19:03:57.21ID:PSeL/c0z
ワイルドカードの ? の仕様がイマイチ分からない
abc と abc1 のファイルがあったとして

>dir /b abc?
abc
abc1

>dir /b ?abc
ファイルが見つかりません

>dir /b a?bc
ファイルが見つかりません

なぜ見つからないのか
1ないし0個の文字じゃないのか
0888デフォルトの名無しさん
垢版 |
2020/06/30(火) 21:39:19.92ID:clO9Gt1K
ピリオドが絡むとワイルドカードはおかしな動きするよ。

filename_yyyy.mm.dd.dat

みたいなもんが

dir *_????.??.??.dat

で引っかからない。>>887 の言う通り、多分バグ。ピリオド以降を拡張子とみなすみたい。

filename_yyyy-mm-dd.dat

として

dir *_????-??-??.dat

だとちゃんと引っかかるから、俺はファイル名に日付を付けるなら - を使っている。
0889デフォルトの名無しさん
垢版 |
2020/07/01(水) 07:22:43.96ID:sbIkpZ+y
ワイルドカードは色々とおかしい
>echo > "abc" & echo > " abc"
>for %i in ("abc*") do @echo "%i"
"abc"
" abc"
0891デフォルトの名無しさん
垢版 |
2020/07/04(土) 22:02:55.18ID:r0U5W+Xd
PC初心者です。
初めてバッチファイルの作成にチャレンジしています。
ドライブ(丸ごと)→別のドライブのフォルダ、にバックアップを取りたくてrobocopyを使ってミラーコピーをしました。
コピーはうまくいくのですが、コピーする度にコピー先に「Recovery」という名の空フォルダが作成されてしまいます。
これはなぜでしょうか?回避方法はありますか?
0893デフォルトの名無しさん
垢版 |
2020/07/04(土) 22:39:29.92ID:QUXtQ3do
たぶん、A ファイルがあって、それを上書きする時に、
安全確保のために一旦、別のフォルダ・Recovery へコピーしてから、上書きして、
正常に上書きした後に、Recovery内のA を削除している

ただ、すべて正常に済んだ後に、Recoveryフォルダを削除し忘れているのだろう
0894891
垢版 |
2020/07/05(日) 11:17:14.37ID:eLIuBas1
>>893
ありがとうございます。
バックアップ自体は問題なさそうなので、このままで使ってみようと思います。
0895デフォルトの名無しさん
垢版 |
2020/07/05(日) 15:06:46.22ID:1amJ61U+
>>893
>>894
コピー元のドライブに SH 属性(システム属性+隠し属性)で「Recovery」っていう空のフォルダがあるはずなの。
ドライブを丸ごと robocopy すると強制的に SH 属性が付くから、最後に attrib -S -H してやる必要があるし、>>894 はそれをしてると思う。
そしたら「Recovery」が見えるようになった、というだけの話でしょ…これ。
コピー元のルートディレクトリに行って「dir /a」して確認してみ?
0896891
垢版 |
2020/07/07(火) 00:32:35.56ID:TndHy5rX
>>895
「dir /a」して確認してみたところ、仰る通りでした!「Recovery」フォルダは不要なので削除しました。
有難うございました!
0897デフォルトの名無しさん
垢版 |
2020/07/08(水) 04:28:57.30ID:lPT19RKJ
超初歩的な質問いいですか?
@https://i.imgur.com/hyYJbJE.png
Ahttps://i.imgur.com/REf3PXQ.png
Bhttps://i.imgur.com/UIqO0ye.png

@のCというフォルダを中にある1.txt 2.txtごとAにコピーしてBのようにしたい時、どう入力したらいいですか?
すでにBのような状態にある時もコピーして上書きしたいのですが
ググれって言われるのはわかってますが、ディレクトリがどうのこうのとか、robocopyだのxcopyだの説明が糞下手くそであんなの理解できるわけないので
0898デフォルトの名無しさん
垢版 |
2020/07/08(水) 04:57:01.58ID:xPuqy2ih
>>897
せめて、何を試してうまく行かなかった、とか試行錯誤の具体的な
過程があれば説明、答えを教えてくれるひとがいるかも
0900デフォルトの名無しさん
垢版 |
2020/07/08(水) 05:29:09.34ID:plYM8yLW
>>897
要件はそれだけか?
メッセージを表示しないだとか、\A\Cには他ファイルやサブフォルダがあり
それはコピー対象/対象外だとか無いの?
\Cは常に同じなら、事前にフォルダを作っておいて、あとは毎回copyだけを実行するだけ
A,B,Cが実際には半角空白を含んでいたりしたらパスは""で括ること

mkdir C\Users\a\Desktop\B\V\C
copy /y C\Users\a\Desktop\A\C\*.txt C:\Users\a\Desktop\B\V\C

xcopyを使うなら
xcopy /s/e/i/y C:\Users\a\Desktop\A\C C:\Users\a\Desktop\B\V\C
又は
xcopy /s/e/i/y C:\Users\a\Desktop\A C:\Users\a\Desktop\B\V
0901デフォルトの名無しさん
垢版 |
2020/07/08(水) 05:44:34.05ID:lPT19RKJ
>>900
どうもありがとうございました。

自分でも色々やって試しててうまくいかず質問したのですが、
原因が保存した文字コードがUTF-8だったためでした。
ANSIに変えたらうまくいきました。
0903デフォルトの名無しさん
垢版 |
2020/07/08(水) 12:24:18.71ID:lp5P2pBO
dosで使えなくなるだろ
0906デフォルトの名無しさん
垢版 |
2020/07/08(水) 15:01:55.81ID:z330e5aM
robocopyは、ミラーリングで使用したときに、
消される側にフォルダのシンボリックリンクがあると、
リンク先実体フォルダ内のファイルごと消されるというバグが有る。
/xjd /xjf /xj /sl 全部ダメ。
怖くて使えない。
0909デフォルトの名無しさん
垢版 |
2020/07/09(木) 01:19:26.67ID:oG8bZA2s
http://itomo.cocolog-nifty.com/itomolog/2011/06/windows-4df1.html
このサイトを参考に実験フォルダにテキストファイルを量産して*.txtで検索するように書き換えて実行したんだけど
(ファイル名)が見つかりません。って表示が出るだけで上手くいかないけど何か抜けてるのかな?
もちろん対象フォルダには移動している
0911デフォルトの名無しさん
垢版 |
2020/07/09(木) 04:53:54.78ID:gEWbrPAM
Ruby で作った。
ただし、DryRun なので実際には実行されません!

require 'fileutils'

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/*.txt"

num = 5 # 更新時刻の新しいものからの順で、フォルダに残しておくファイルの数

Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ処理する
.sort_by { |full_path| File.mtime( full_path ) } # 更新時刻の古い順で、ソートする
.reverse # 更新時刻の新しい順へ、逆転
.drop( num ) # 新しいものから、num個を処理しない
.each { |full_path| FileUtils::DryRun.rm( full_path ) } # ファイルを削除

表示
rm C:/Users/Owner/Documents/a.txt
rm C:/Users/Owner/Documents/b.txt
0912デフォルトの名無しさん
垢版 |
2020/07/09(木) 06:30:12.62ID:o2t2WZIU
rubyなんて論外、PowerShellですらギリアウト

ギリアウトだがPowerShellのコマンドラインで標準のエイリアスを使う場合
カレントフォルダの *.txt の最新3個以外をリストアップするには
gi *.txt | sort LastWriteTime -Descending | select -Skip 3

削除までやるなら
gi *.txt | sort LastWriteTime -Descending | select -Skip 3 | ri

エイリアスを使わずに書くと
Get-Item *.txt | Sort-Object LastAccessTime -Descending | Select-Object -Skip 3 | Remove-Item
0914デフォルトの名無しさん
垢版 |
2020/07/09(木) 13:30:39.43ID:oG8bZA2s
>>910
初歩的なミスで恥ずかしいですが量産したテキストファイル名に空白が入っている事が原因でした
そこで汎用性を持たせるために空白が入ったファイルも検出したいのですがワイルドカードで検索する方法はありますか?
0920デフォルトの名無しさん
垢版 |
2020/07/15(水) 22:58:28.42ID:SqApoBlS
>>916
MSの英語フォーラムとか
英語版StackOverFlowとか
Redditとか
で尋ねたら?英語で。

本当に知りたいなら英語圏に聞け。英語圏に。
0928デフォルトの名無しさん
垢版 |
2020/07/18(土) 01:59:17.03ID:6qVTTMhl
大体は理想通りに出来たのですが時々不要なpathをremで無効にするとstartコマンドがなぜかC:\hoge\を開いてしまうので回避できないでしょうか?
バッチ初心者なので汚いのはご容赦下さい

SET TARGET_EXE1=C:\hoge\hoge.bat
SET TARGET_EXE2=C:\hoge\huge.lnk
rem SET TARGET_EXE3=C:\hoge\hege.exe


for /l %%i in (1,1,6) do (call :F_NM "%%TARGET_EXE%%i%%")

timeout /t 8 > NUL
exit 0

:F_NM
echo %~nx1
START "" %1
goto :EOF
0933デフォルトの名無しさん
垢版 |
2020/07/18(土) 15:31:48.20ID:GUFQRDdz
>>929
すいません startコマンドのクォーテーションを二重がけにはどんな意味があるのでしょうか?
0934デフォルトの名無しさん
垢版 |
2020/07/18(土) 15:40:41.02ID:VVrReUQE
start /?

最初のは "タイトル"
0937デフォルトの名無しさん
垢版 |
2020/07/19(日) 00:01:19.79ID:nPfUu10f
>>933
ちなみに"start"でもダメ
一般的に内部コマンドは引用符で囲むとエラーになる
昔はstartが外部コマンドだった時もあったが
0939デフォルトの名無しさん
垢版 |
2020/07/31(金) 20:28:20.67ID:uhGaPqk6
面白い書き方見付けた

c:\APP\DoeView>popd

c:\APP>set /p<nul=%date%%time% [pushd:&@pushd doeview >nul 2>&1 && echo ok]||echo fail]
2020/07/31 (金)20:14:34.70 [pushd:ok]

c:\APP\DoeView>set /p<nul=%date%%time% [pushd:&@pushd doeview >nul 2>&1 && echo ok]||echo fail]
2020/07/31 (金)20:14:38.48 [pushd:fail]
0941デフォルトの名無しさん
垢版 |
2020/08/01(土) 01:53:16.42ID:mxUlZpQQ
他のプログラムと標準入出力でやりとりするバッチファイルを作ろうとしています。

:INPUT
set /p INP=
if "%INP%"=="コマンド1" (
処理1
echo 結果1
goto INPUT)
if "%INP%"=="コマンド2" (
処理2
echo 結果2
goto INPUT)

goto INPUT

こんな感じにしたんですが、コマンドが連続で送られてくると取りこぼしてしまうようです。
何か対策は無いでしょうか?
0942デフォルトの名無しさん
垢版 |
2020/08/01(土) 06:07:29.27ID:hnL660kY
他のとやらが標準出力読めるなら
set /p INP=inputok
読めないならこぼさない程度に決め打ちでsleep挟んで送るようにするしか
0943デフォルトの名無しさん
垢版 |
2020/08/01(土) 10:06:48.10ID:KdkXblI6
>>939
なるほど
set /p<nul=%date%%time% [pushd:

@pushd doeview >nul 2>&1 && echo ok]||echo fail]
を & でつないだという訳か。で前半を普通の順番に書き直すと
set /p =%date%%time% [pushd:<nul
で、set /pの変数名を空にすることで、改行をつけないechoの代わりとして使っていると。
後半はpushd doeviewを実行して、成功したらok]、失敗したらfail]を表示してるだけだな。
0944デフォルトの名無しさん
垢版 |
2020/08/01(土) 15:48:10.34ID:mxUlZpQQ
>>942
やりとり相手のプログラムはバッチファイルでもないし自分で作ったわけでもないので調整できません…
やっぱ無理ですかね…
0945デフォルトの名無しさん
垢版 |
2020/08/01(土) 16:20:21.81ID:hnL660kY
copy nul $tmp.txt
hoge.exe >>$tmp.txt
for /f "delims=" %%a in ($tmp.txt) do (
if "%%a"=="コマンド1" (処理1 &echo 結果1)
if "%%a"=="コマンド2" (処理2 &echo 結果2)

)

こういう風に一旦txtに書き出しじゃダメなん?
0946デフォルトの名無しさん
垢版 |
2020/08/01(土) 17:49:00.41ID:y/Re9bvj
>>944
実行速度を気にしないゆっくりでいいのなら、
tasklist に実行するプログラムがあれば待機する

実行するプログラムの終了コード(errorlevel)の癖がわかっているなら
errorlevelで終わったかそうかわかるかも
0947デフォルトの名無しさん
垢版 |
2020/08/01(土) 23:16:08.23ID:mxUlZpQQ
どうも「相手のプログラム」がイメージしづらいようなので、プログラムそのものを貼ります。

将棋所
http://shogidokoro.starfree.jp/index.html

USIプロトコル
http://shogidokoro.starfree.jp/usi.html

USIプロトコル対応の将棋エンジンをバッチファイルで作る、という遊びをしようとしています。
現状将棋エンジンとして登録する(usiコマンドに対してid他を返す)ところまではできますが、
対局しようとするとsetoptionとisreadyが連続で送られてきてisreadyを認識できず、readyokを返せない、等でまともに動きません。
デバッグウィンドウからコマンドを送れば一応動きますが…

>>945
一旦txtに出力するのは考えましたが、具体的な書き方が思いつきません…
将棋所に登録するバッチファイルと、コマンドを処理するバッチファイルの2つに分ける、
とかも考えたんですが、結局その2つのやり取りをどうすれば良いのか…
0948デフォルトの名無しさん
垢版 |
2020/08/02(日) 00:01:49.63ID:SCuZm8dn
>エンジンは常に(たとえ思考中であっても)コマンドの受信ができる必要があります
guiからのコマンドにどういったものがあるのかまではまだ見てないけどバッチ一つじゃ無理だと思う
制御用兼入出力用Aのバッチと思考エンジンBのバッチの最低2つは要るんじゃないかな
Bは候補手をtmpに書き出し続けてguiから時間て言われたらAがtaskkillしてtmp読み取りして返すとか
これでもgui側でコマンド送る最低間隔何秒とかを設定出来無いと取りこぼすかも
思考エンジン部分はバッチで出来るだろうけどコマンドやり取りする制御部分はバッチでは厳しいかも
0949デフォルトの名無しさん
垢版 |
2020/08/02(日) 00:12:10.36ID:SCuZm8dn
> setoptionとisreadyが連続で送られてきてisreadyを認識できず、readyokを返せない
あーこの時点で無理なら厳しいね
バッファ用としてのプログラムを間に挟まないと
で、バッファ挟むくらいならどうせなら制御も…てなるだろうし
0950947
垢版 |
2020/08/02(日) 15:10:30.75ID:pqbO4ExB
>>949
やっぱそうですか…
残念ですが諦めます
ありがとうございました
0951デフォルトの名無しさん
垢版 |
2020/08/07(金) 17:37:19.06ID:ztGuRGFM
フォルダが複数あり、フォルダ内の先頭のファイルネームをフォルダ名としたいです

これを

フォルダ1
├ファイル1
├ファイル2
フォルダ2
├ファイル1
├ファイル2

こうしたいです

ファイル1
├ファイル1
├ファイル2
ファイル1
├ファイル1
├ファイル2


フォルダ名が重複した場合の処理も必要かもしれないです

バッチは読みにくすぎですね
0952デフォルトの名無しさん
垢版 |
2020/08/07(金) 22:11:16.88ID:wnzPeWR5
>>951
そもそもツリー表現が変だと思う。

├フォルダ1
│├ファイル1
│└ファイル2
└フォルダ2
  ├ファイル1
  └ファイル2

tree コマンドの出力をトラップして改変する方向で考えたら楽なんじゃない?
0953デフォルトの名無しさん
垢版 |
2020/08/07(金) 22:17:23.17ID:5wWI/sIC
>>951
エクスプローラーでの表示順と dir コマンドでの表示順は異なるけど
それを考慮する必要あるの?
0954デフォルトの名無しさん
垢版 |
2020/08/08(土) 00:00:00.04ID:c43C7xo+
for /r %%i in (.)で下位フォルダ名取得
  そのフォルダ内の最初のファイル名を取得(ソート指定)
  対象フォルダ名の変更

もしやるならvbs噛ませると思う
0955デフォルトの名無しさん
垢版 |
2020/08/08(土) 05:43:20.34ID:jNP2OM4q
>>953
とりあえずいらないですが、名前順で並び替えた場合、先頭にくるものをフォルダ名としたいです
0958デフォルトの名無しさん
垢版 |
2020/08/08(土) 09:01:08.32ID:nLoi7MqI
どうでもいいと言うならテメーがどっちかに決めろや
どうでもいいと言いながらできてからなんで違うんだ?とか言う奴多すぎ
0960デフォルトの名無しさん
垢版 |
2020/08/08(土) 09:32:21.16ID:d2hZRkL/
仕様を全て決めないと取り掛かれないマヌケ多すぎ
無能は本筋から外れたところで発狂してろ
0961デフォルトの名無しさん
垢版 |
2020/08/08(土) 09:59:17.57ID:jNP2OM4q
>>956
では今回はエクスプローラ側の並び順がいいです
0962デフォルトの名無しさん
垢版 |
2020/08/08(土) 10:22:17.59ID:cJmgrNkw
>>960
吠えるしかできない間抜け乙w

>>961
ならStrCmpLogicalW()を使わないとダメだからバッチではほぼ無理
PowerShellかC#とかでやった方がいい
0963デフォルトの名無しさん
垢版 |
2020/08/08(土) 11:11:14.30ID:6XUmF/b8
とりあえずこんな感じ?(先頭はdir順)
if "%1" neq "" pushd "%~1"
for /d %%i in (*) do call :sub "%%~i"
popd
goto :eof

:sub
for /f "tokens=*" %%j in ('dir /b /on %1') do (
call :rename %1 "%%~j"
goto :eof
)
goto :eof

:rename
ren %1 %2
if errorlevel 0 call :rename-retry %1 %2
goto :eof

:rename-retry
rem ---todo---
goto :eof
0964デフォルトの名無しさん
垢版 |
2020/08/08(土) 11:14:22.00ID:jNP2OM4q
>>962
ではcmdでいいです
あるいはpython環境のほうが楽ですか?
>>963
cmdのコードは理解が難しいですね、、、
0965デフォルトの名無しさん
垢版 |
2020/08/08(土) 12:00:51.68ID:jNP2OM4q
globでやってみます
0966デフォルトの名無しさん
垢版 |
2020/08/08(土) 12:16:11.89ID:XwBZfJ1v
リネーム処理とかはもうPSの方がいいんじゃない?

@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%G in ('dir /ad /b') do (
set N=
for /f "usebackq delims=" %%H in (`dir /a-d /b "%%~G" 2^>nul`) do if not "%%~H"=="" if not defined N set "N=%%~nH"
if defined N (
if not exist "%%~dpG!N!" (ren "%%~G" "!N!") else (
set dt=!date:~0,10!!time: =0!
set dt=!dt:/=!
set dt=!dt::=!
ren "%%~G" "!N!_!dt!"
)
)
)
pause &exit /b
0967デフォルトの名無しさん
垢版 |
2020/08/08(土) 14:01:14.15ID:jNP2OM4q
pythonでは向いてないですか
0970デフォルトの名無しさん
垢版 |
2020/08/08(土) 16:11:06.79ID:Uh3gedSc
dir /ad /b /s > tmp.txt とかで処理対象のディレクトリ名をテキストに落としてから
wshでリネーム用のバッチファイルを作る方が楽かな

wshではテキストを一括読みして変数に入れて
テキストを順次読みしながら↑の変数の内容をバッチファイルのコマンドに変更してく
下位ディレクトリや同一フォルダ名になるときの判定などもしやすい
もし失敗しても、原因を見つけやすいしリカバリーもしやすい
0971デフォルトの名無しさん
垢版 |
2020/08/09(日) 04:55:36.88ID:z2n3MQIn
仕様がないと取りかかれないと言うが
発注者が仕様を曖昧にしておくほうが罪深いだろ
要件定義が甘くて泣きをみるのはいつも現場だ
0972デフォルトの名無しさん
垢版 |
2020/08/09(日) 05:42:25.80ID:KFfdng53
Ruby で、チェックツールを作った

隠しファイル・ディレクトリは、どう扱うのか?
ファイル名に、. がある場合に、どうするのか?

require 'pathname'

p base_dir = Pathname.new( "C:/Users/Owner/Documents/test/" )

folders = base_dir.children.select( &:directory? ) # 直下のディレクトリのみ
p folders.length, folders

files = folders.map { |folder| folder.children.select( &:file? ).first } # 直下の最初のファイルのみ

# nil は、直下にファイルが存在しない、ディレクトリ
nil_cnt = files.count( &:nil? )
p files.length, nil_cnt, files

# compact で、nil の要素を省く
hash = files.compact.each_with_object( { } ) do |file, hash|
filename = file.basename.to_s # ファイル名を、ハッシュに追加していく
if hash.has_key? filename # ハッシュに、既に追加されていれば
hash[ filename ] += 1
else
hash[ filename ] = 1
end
end

# 2 以上のもの、つまり、同じファイル名になったものを表示する
p hash, hash.select { |key, val| val >= 2 }
0976デフォルトの名無しさん
垢版 |
2020/08/09(日) 16:47:47.63ID:0zxLTv88
典型的な無能の発言だな
0977デフォルトの名無しさん
垢版 |
2020/08/09(日) 23:22:34.78ID:TBMXuXvF
>>972
オワコンRubyジジイが出てきたか
困るよね、こういう老害

>>975
進められるけど手戻りして予算オーバーするわけね
お前が無能
0978デフォルトの名無しさん
垢版 |
2020/08/10(月) 01:55:02.34ID:9+h/1Osf
>>977
> 進められるけど手戻りして予算オーバーする

マヌケが要件定義を担当するとそうなるねw
バカな開発チームだと、なぜか「ユーザーが悪い」という認識になるww
0979デフォルトの名無しさん
垢版 |
2020/08/10(月) 03:38:30.58ID:1F6bB0mG
あいまいなのはユーザーが自分でも要求を把握しきっていないためだから
あとでこうしてくれやっぱりああしてくれとコロコロと仕様変更してくるのが常だろ
0980デフォルトの名無しさん
垢版 |
2020/08/10(月) 04:21:21.96ID:mFEy/HZR
> あいまいなのはユーザーが自分でも要求を把握しきっていないため

ブレない軸を導き出せないような無能SEは多いよね
ある程度ブレてもダメージが少ないように開発するのが主流ですよ
0981デフォルトの名無しさん
垢版 |
2020/08/10(月) 11:53:14.80ID:ZLJuvAm6
ある程度ブレても、いいように開発できればいいのですけれどもね。
時折、ニュースでも、開発できなかったということで、クライアント側と、
メーカー側で裁判になっていますから、難しいのだろうと思うのですが。
0983デフォルトの名無しさん
垢版 |
2020/08/13(木) 21:47:50.59ID:5FyzI8Jm
Soft\Soft.ini
12 LastCheck = Mon Aug 3 00:00:00 2020
13 LastUpdate = Mon Aug 3 00:00:00 2020

Soft\Plugins\update.txt
1 Update time: Wed Aug 12 23:59:59 2020

Soft.iniの12行目と13行目「Mon 〜 2020」を
update.txtの1行目「Wed 〜 2020」から置換して
12 LastCheck = Wed Aug 12 23:59:59 2020
13 LastUpdate = Wed Aug 12 23:59:59 2020
のように上書きしたいのですが
batファイルでどのように書けば出来ますか?
0984デフォルトの名無しさん
垢版 |
2020/08/13(木) 22:00:40.82ID:E452L2zK
>>983
情報不足。
・Soft.ini の絶対に12行目と13行目か?んなこたぁねぇだろ。
・update の日付が更新されなかった場合はどうするの?
・ていうか .ini で「=」の左右に半角空白を入れるってどういうアプリだ?

書きようはあるが、for /? と打って自分で調べた方が早いだろ、これは。
どこかの新入社員だとか学生の課題っぽいな…
0985デフォルトの名無しさん
垢版 |
2020/08/14(金) 08:32:48.63ID:SCMnTycc
Ruby では、これで設定できる

require 'inifile'

str = "Wed Aug 12 23:59:59 2020"

ini = IniFile.new( :filename => "test.ini" )

ini[ "abc" ] = { "LastCheck" => str, "LastUpdate" => str }
ini.write( ) # save

結果
[abc]
LastCheck = Wed Aug 12 23:59:59 2020
LastUpdate = Wed Aug 12 23:59:59 2020
0989デフォルトの名無しさん
垢版 |
2020/08/14(金) 14:59:12.49ID:uGqrrAzw
>>983
@echo off
set src=Plugins\update.txt
set ini=Soft.ini
for /f "usebackq tokens=1* delims=:" %%G in (`findstr /c:"Update time" "%src%"`) do set "VER_UT=%%H"
for /f "usebackq tokens=1* delims==" %%G in (`findstr /c:"LastUpdate" "%ini%"`) do set "VER_IT=%%H"
REM 比較するならここで処理
REM echo "%VER_UT%" "%VER_IT%"
ren "%ini%" "%ini%.bak" && copy nul "%ini%" || (echo ERROR &pause &exit /b)
for /f "usebackq tokens=1* delims==" %%G in ("%ini%.bak") do (
if "%%G"=="LastCheck " ( >>"%ini%" echo %%G=%VER_UT%
) else (
if "%%G"=="LastUpdate " ( >>"%ini%" echo %%G=%VER_UT%
) else ( >>"%ini%" echo %%G=%%H
)
)
)
REM 空行消したくなければ findstrで読んで行番号を表示させる
0993デフォルトの名無しさん
垢版 |
2020/08/14(金) 22:43:27.80ID:9FGl+Ien
低能Ruby厨か
0994デフォルトの名無しさん
垢版 |
2020/08/14(金) 23:06:43.67ID:TmzvbeJo
リダイレクトカードオープン!
>>991 から >>995 へのアンカーは >>985 へリダイレクトされる!

が、Ruby爺は人格障害者だった!
精神的ダメージを受けていない!

Ruby爺がVZ爺を召喚しようとしている!
が、自分自身だったので召喚できない!

Ruby爺がダサいコードを唱え始めた!
似非プログラマーは発狂した!
歴戦のプログラマーは何も感じていない!

歴戦のプログラマーの攻撃!
Ruby爺は5のダメージ!
歴戦のプログラマーはRuby爺をやっつけた!

経験値を0exp、ゴールドを0G 手に入れた!

「何だよ無職ニートの爺かよ…」と歴戦のプログラマーは思った。
0995デフォルトの名無しさん
垢版 |
2020/08/14(金) 23:10:45.52ID:SCMnTycc
Windows には、ini ファイルを読み書きできる、コマンド・アプリは無いの?
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 632日 16時間 7分 11秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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