【.cmd】 バッチファイルスクリプト %13 【.bat】
■ このスレッドは過去ログ倉庫に格納されています
>>118
ネットで探したのですが、バッチファイルをやり始めて日が浅いので使うコマンドの見当も付きませんでした。
今日職場で必要だったので聞いてしまいました。
>>119
助かりました。
どうもありがとうございます。 AzureAD、Office365を使うなら(Office365についてはGraphの使いこなしも必須)。バッチやVBSの代替としても必須。
「Powershellが出来る」だけではなくPowershellも活用し、なんの業務をしてたか?がスキルとなる基本的にはインフラ屋のスキルの一要素 環境変数の中に=があると
変数参照が変な事になってくるな...
>set a=b=c
>echo %a%
b=c
>echo %a=b%
c 俺も最初はそう思ったんだけど...
>set a=b^=c
>echo %a=b%
c ならないんだけど?(win7)
BATだと
ECHO は <ON> です。
ダイレクトだと
%a=b% バッチでやって見た
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 >>133
たった今、品質更新プログラムのインストールしました。
KB4487044 (OS ビルド 17763.316)
なんと正常になったようです
結果
b=c
ECHO は <OFF> です。 1.batファイルで
start ***.bat
を実行してその***.batの中に
call ***.exe
があるんだけど
最初に実行するbatファイルでどうにか ***.exeを最小化で起動できますか? forで行取得して並列で処理してるんですが、一度にすべて実行するのでPCの負担が大きいです。
さらに回数指定するには、どうすればできますか? すみません。説明不足でした。
初めにforでテキストを取得しsetに割り当て、全てをコマンドとして生成して並列処理しています。
並列で3回ずつ実行し終了をループしたいです。 FORでサブルーチンをCALLするようにして、
3回呼び出されたら実行するようにするとかかな
これ以上は元のバッチを見ないと何とも 並列処理ということは、非同期呼び出しを使ってるわけだから
その呼び出した処理の終了をどうやって感知するかが肝
多分プロセスの存在チェックでいけると思うがそういうのが過去ログにあったと思う んでもそんな高度な事がしたいならVCあたりで作っちゃいかんの? -- 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つでも存在すれば他の入力ファイルにも同じ処理が実行されてしまいます
これを回避するにはどうすればいいでしょうか? 毎回リセットしとけば?
b.batの先頭でset xxx=を書くとかb.batをsetlocal〜endlocalするとか すまん良く読んでなかった
ファイルね
b.batで生成するのかな?
削除しちゃっても問題ないのならa.batの先頭でdelしちゃえば? B.batは動画のエンコードに使っているバッチファイルの中身の一部で %~dpn1_hoge.txt があった場合はツールに追加のオプションを指定するようにしている感じです set day=3/19(火)
if 1==1 (
echo %day%
)
すみませんどなたか教えてください。
曜日の半角括弧のせいでif文が閉じられてしまうんだけど
どうやってエスケープすればいいんでしょうか? ^)
バッチ エスケープで検索すりゃすぐわかるだろ >>147
こういう方法もある
変数dayの中に、二重引用符がなければ
set day=3/19(火)
if 1==1 (
for /f delims^=^ eol^= %%i in ("%day%") do echo %%i
)
これだとdayに & | > < ^ ( ) 等やばそうな文字が入っても大丈夫 set day=3/19(火)
if 1==1 (
echo %day:~0,6%^)%
)
これでいけました。
>>150のも今後の参考にさせてもらいます。ありがとうございました >>147
echo出力だけなら環境変数を ""でくくった上で遅延展開する方法もある。
これだとほとんどすべての記号がそのまま出力される。例外として「!」は「^!」で、「%」は「%%」で、「^」「^^」などは要エスケープ。
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set "day=3/19(火)"
if 1==1 (
echo !day!
) ! とか ^ があると
setlocalの前に変数代入した方が楽だな 遅延モードでのエスケープの動作が面白い
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 コマンドプロンプトで以下のpowershellコマンドを実行すると曜日が英語で表示されるのですが、
ここで表示された"Wednesday"を呼び出し元であるコマンドプロンプト側の変数に取得するのは難しいでしょうか?
曜日の判定に使いたいのです。
C:\>powershell "(get-date).DayOfWeek"
Wednesday >>160
for /f "delims=" %%i in ('powershell "(get-date).DayOfWeek"') do set "hoge=%%i" >>161
ありがとうございます!それでバッチリでした。
ってかレスはやっ!( ̄□ ̄;) 読み取り専用属性付加と解除についてお願いします
ATTRIB +R hoge.txt
この場合hoge.txtをバッチファイルにドロップしたときhoge.txtの属性が読み取り専用になりますが
ATTRIB +R *.txt
とすると一つのファイルをドロップしただけでディレクトリ内の全てのテキストファイルの属性が変わってしまいます
バッチファイルへドロップしたファイルのみ属性を変えたいのですがこういうことは可能でしょうか? >>163です
バッチファイルにファイル名を指定してしまうと同一名のファイルしか処理できませんが
ファイル名が異なっていてもドロップしたファイルのみ属性変更したいのです >>165
ATTRIB +R
これだけでいいのでしょうか
試してみましたが一つのファイルをバッチファイルへドロップすると
ディレクトリ内の全てのファイルが属性変更されてしまいます >>166
ATTRIB +R %1
引数のファイルだけ属性を変える
引数が無い場合は全てのファイルになるので
ガードは付けた方が良いと思う >>167
%1 とすることでドロップした一つのファイルが読み取り属性変更できるようになりました
二つとか三つとか複数ファイルはできないのですよね
皆さんありがとうございました バッチファイルの図形プログラミング作ったら広告収入入ると思いますか? 俺のところじゃ>>169はエラーになる
for %%i in (%*) do attrib +r %%i
まあファイル名によってはこれもダメだけど >>169
>>171
みなさんありがとうございます
助かりました 複数ファイルドロップするなら shift でループが簡単だと思うけど何か落とし穴ある? ファイルドロップで落とし穴があるとしたら >>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
でもこれファイルドロップでしか使えない batのコマンドのタイトルバーに
「管理者: 」
の表示を消すこと出来ないのでしょうか? スレチと怒られそうだが
--- 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 >>175
例えば d:\hoge\a.bat を実行するなら
ショートカットの新規作成でコマンドは
cmd /c start "ABC" /d "d:\hoge" a.bat
ショートカットのプロパティで
実行時の大きさは「最小化」
詳細設定で「管理者として実行」
このショートカットを実行すると
a.bat が管理者として実行されて
タイトルは ABC のみになる >>178
念のため書いておくが
バッチの中で
title xxx
と書くと「管理者:xxx」
となるので台無し
バッチの title コマンドは消せ
それが出来ないなら俺は知らん あのさ
もう設計書はあるからバッチ作ってって言われて設計書見たんだが
「%0\..\xxx\yyy.batをコールする」とか書かれてて腰折れそうなんだけど… やりたい事が書いてあるかどうかだな
設計書作る手間で自分でかけとも思うけど
外注なら設計書から作りましょうねと諭して工数確保だな >>181
まあやりたい事分かるからこっちで直して
これでいいですよね?って聞くつもりだけど
細かく書いといて間違えてるのやめてほしい… >>175
隠しておかないと、悪いことしてるのがばれちゃうもんな forfilesは遅いこと
フォルダのファイル数が多いと極端に遅くなる バッチとは違うけど、Microsoftさまの新しいターミナルアプリ「Windows Terminal」
https://forest.watch.impress.co.jp/docs/news/1183011.html
期待しても良いのかしら >>187
windows10のみだと俺は使えないや >>188
そりゃMacやLinuxでも使えるようにする性格のアプリではないだろ >>189
どういう意味なのかな?
俺が読んだかぎりではwindows10のみと判断したんだが >>190
MacやLinuxで使えないから嫌だってお前は言ってるんだよ build 10.0.18362.0以上でVS2017必要みたいね
Win8とかじゃ使えない >>193
サポート終了って言ってるんだから当たり前じゃね? スレチかもなのですが、「コアを吐く」ってどういう意味なのでしょうか? Win10で、.(ドット)から始まる4文字以上のフォルダを再帰的に削除したいのですがうまくいきません
for /d /r %%d in (.????*) do rmdir /s /q "%%d"
フォルダ名をスペースおきに書くと削除できますがワイルドカードを使って処理できないものでしょうか for /f %%d in ('dir /s /b ^| findstr \\\.....') do rmdir /s /q "%%d"
とか? >>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 >>198-199
>>200
ありがとうございます!
rmdirをechoに置き換えて確認してみましたところ、>>200 様ではフォルダ名を取得できませんでした
>>198-199 様で対象にしたいフォルダ名を取得できましたのでこちらを使わせていただきます
ありがとうございました >>201
なにを言ってるのか意味不明だな?
>>200 の rd を echo rd に変えたのなら問題ないだろ
>>198 を使うなら /f "delims=" にしろよ?
あと、>>198 だと \.12\abc とかも消えるぞ 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") 7-Zipスレからこちらに誘導されてきました
バッチファイルを実行して
指定したフォルダを7z圧縮し別の指定した場所へ保存する方法教えてください >>205
7-zipのコマンドラインオプションみましたか? >>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 >>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にしてみましたが動作しませんでした
誤った箇所ありますでしょうか >>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 >>210
コンソール入力するのが嫌なら
set i=Z:\TE
set o=Z:\zz
set n=a >>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
自分のような者に教えていただきありがとうございました CMDの画面でこういうのを入力して実行したら
FOR /L %I IN (1,1,20) DO @CALL ECHO %I
画面の上のタイトルに文字が
うじゃうじゃ出て来るのはなぜ? 最近の発見
remの前に空白をおける
: でラベルを示すが、:の前後に複数の空白、タブ、全角空白があってもよい
: タブ abc
またラベルの後の空白以降の文字列は無視するのでコメントを書ける
: abc エラーの場合
まあ、あまり使うところないけど 最後のは割と便利そうだけど
現場だとコメントはREM使えっていうコーディング規約に阻まれそうだw >>214
そもそも call の引数はバッチファイル名かラベルだ。
それ以外の、内部コマンドや外部コマンドじゃない。
そんな使い方、help のどこにも書いてない。
一見、正常に動作している様に見えるが、
内部では子プロセスが異常終了している。
だからタイトル名に子プロセスの残骸が残る。
call set なども動作はするが邪道。 >>215
REM は「コマンド」だから前に空白が置ける。それは当然として。
ラベルをコメント代わりに使うのは止めとけ。
for や if コマンドの中で「インテンドを使って」コメントに使おうとすると弾かれる。
大人はバッチのコメントは REM で書くものだ。
Intel のドライバーインストーラーのバッチは奇麗だと思うぞ。 変数のサイズの最大値って何バイトなんだろう
@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" >>219
8187 バイトかな?
半端な値だな... 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くらいで落ちた
コマンドの制限に掛かるみたいやね >>221
ありがとう、参考にします
1行当たり8190文字がネックだね >>221
こういうのって統一して何バイトって決めないとやばくないのかな
windowsバージョン、英語、日本語、ヒンズー語など言語で微妙に変化すると、
おかしなことがおきたり、ウィルスの侵入口に利用される ■ このスレッドは過去ログ倉庫に格納されています