【.cmd】 バッチファイルスクリプト %13 【.bat】
レス数が900を超えています。1000を超えると表示できなくなるよ。
PowerShell なら、
# ショートカットファイルのフルパス
$fn = "フルパス"
# ショートカットファイル(.lnk)から、リンク先パス(TargetPath)を読み取る
$link = $wsh.CreateShortcut( $fn )
# 画面に表示する
Write-Host "$( $fn )`nTargetFile: $( $link.TargetPath )" >>851
修正
一番上に、これを入れて
$wsh = New-Object -ComObject WScript.Shell >>851
あれ、まだ続いてましたね。
えーと、リンクファイルの情報を取得するのではなくて、リンク先からリンク元を取得できないか、という相談でした。
結論としては、.LnkのStartInをクリアすることでBatch側から%CD%にて.Lnkの親フォルダは取得可能だが、
.Lnkのファイル名を取得する手段はない、と認識しました。
もしかして、PowerShellなら取得できますか? >>854
Batchを複製すればできますね。
でも仕様を変更したくなったときばらまいたBatchをすべてメンテするのがメンドーなので設計は1カ所にしておきたい。
ショートカットファイルだとリンク先からリンク元のファイル名を取得できない (Pathは取得可)のでこれを別のバッチで代用すれば対応できる。
(現時点、これで代用してます)
でもこんどは起動がショートカットからBatchに変更されたことで最小化起動ができなくなった。
で、バッチを最小化で生起動する方法は、、無い!という結論です。
というところで諦めています。 おまえ要領を得ないって良く言われるだろ
何を最小化したいの?コンソール画面?バッチから起動したアプリ?
アプリ起動にバッチを介するようになって困っているようだけど
コンソールはすぐ消えるから大して困らんでしょ
その一瞬も困るってこと?
コンソールならバッチへのショートカットのプロパティに[実行時の大きさ]
アプリならstart /min
そのバッチを貼れない理由でもあるの? そんなへんなことするようなものは俺なら要らんと言うな
説明書に手順を書くなり、起動用のps1やvbsでも同梱しとけばいいと思う 漏れなんか、ダブルクリックで、Ruby スクリプトを実行するために、
test.vbs に、起動部分だけを書いてる
CreateObject("WScript.Shell").Run "ruby .\script.rb", 0 だから結論はでた、諦めてると言ってるだろ。
返してくれた方がいたので返答しただけ。
ただ一瞬コンソールが表示される挙動がきっちゃないからキライってだけ。
はい、本件Close。
有用な情報提供いただいた皆さんありがとう。 よくわからんけど start /b /min を使うのではだめなのかしら
と独り言 >>858
>その一瞬も困るってこと?
悪いことしたい時に、それでは困るよね? >>865
単なる気分の問題
本件はクローズ。皆さんありがとうね そんな自己満足でひとりよがりなものを配布したりして欲しくはないかな ここまでの流れで誰も配布するなんて話してないのにお前は何を言ってるんだ?
866の好きにさせとけよ >>868
はい、自分用です。ご安心を。
中身もつまらない小物ツールですので。
技術的な情報が知りたかっただけです。
また教えてください。 クローズしたそうだが
コンソール画面を見たくないのなら
レイアウトの位置を右下に詰めろ。
ほとんど見えなくなるぞ 殆どじゃダメなんだよ
神経質な奴に見つけられてしまう テキストファイルから空行を除く方法
findstr /R .
ただし空白やタブのある空行は失敗 >>873
タブやスペースだけの行をスキップするには
findstr /r /c:"[^ ]"
^と]の間にタブとスペース入力
バッチではエディタでタブ入力できるが
コマンドプロンプトでタブ入力するには cmd /f:off で テキストファイルに入ってる文字列を
一行ごとに読み込んで
フォルダを作るバッチをつくったのですが
半角スペースの文字列が分割されてしまいます
これって対応策ありますか? >>876
for /f "tokens=*" %%i in (data.txt) do md "%%~i" ファイル名全角英字の大文字小文字を同じとみなしていた
A.txt に他フォルダのa.txtを上書きコピーしてもA,txtのままだった
Aaは全角英字
芸が細かい、いいか悪いかは別として ワイルドカードの ? の仕様がイマイチ分からない
abc と abc1 のファイルがあったとして
>dir /b abc?
abc
abc1
>dir /b ?abc
ファイルが見つかりません
>dir /b a?bc
ファイルが見つかりません
なぜ見つからないのか
1ないし0個の文字じゃないのか abc??.?? とかも一致するね。たぶん仕様というよりバグ ピリオドが絡むとワイルドカードはおかしな動きするよ。
filename_yyyy.mm.dd.dat
みたいなもんが
dir *_????.??.??.dat
で引っかからない。>>887 の言う通り、多分バグ。ピリオド以降を拡張子とみなすみたい。
filename_yyyy-mm-dd.dat
として
dir *_????-??-??.dat
だとちゃんと引っかかるから、俺はファイル名に日付を付けるなら - を使っている。 ワイルドカードは色々とおかしい
>echo > "abc" & echo > " abc"
>for %i in ("abc*") do @echo "%i"
"abc"
" abc" PC初心者です。
初めてバッチファイルの作成にチャレンジしています。
ドライブ(丸ごと)→別のドライブのフォルダ、にバックアップを取りたくてrobocopyを使ってミラーコピーをしました。
コピーはうまくいくのですが、コピーする度にコピー先に「Recovery」という名の空フォルダが作成されてしまいます。
これはなぜでしょうか?回避方法はありますか? たぶん、A ファイルがあって、それを上書きする時に、
安全確保のために一旦、別のフォルダ・Recovery へコピーしてから、上書きして、
正常に上書きした後に、Recovery内のA を削除している
ただ、すべて正常に済んだ後に、Recoveryフォルダを削除し忘れているのだろう >>893
ありがとうございます。
バックアップ自体は問題なさそうなので、このままで使ってみようと思います。 >>893
>>894
コピー元のドライブに SH 属性(システム属性+隠し属性)で「Recovery」っていう空のフォルダがあるはずなの。
ドライブを丸ごと robocopy すると強制的に SH 属性が付くから、最後に attrib -S -H してやる必要があるし、>>894 はそれをしてると思う。
そしたら「Recovery」が見えるようになった、というだけの話でしょ…これ。
コピー元のルートディレクトリに行って「dir /a」して確認してみ? >>895
「dir /a」して確認してみたところ、仰る通りでした!「Recovery」フォルダは不要なので削除しました。
有難うございました! 超初歩的な質問いいですか?
@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だの説明が糞下手くそであんなの理解できるわけないので >>897
せめて、何を試してうまく行かなかった、とか試行錯誤の具体的な
過程があれば説明、答えを教えてくれるひとがいるかも >>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 >>900
どうもありがとうございました。
自分でも色々やって試しててうまくいかず質問したのですが、
原因が保存した文字コードがUTF-8だったためでした。
ANSIに変えたらうまくいきました。 xcopy よりは、robocopy を使った方が良いのでは?
xcopyは、あまり見ない たしかに、DOSは、Xcopyまでだったか。
pureDOSには、robocopyはないのだな。 robocopyは絶望的に遅い
複雑な条件がないのならxcopyがいい robocopyは、ミラーリングで使用したときに、
消される側にフォルダのシンボリックリンクがあると、
リンク先実体フォルダ内のファイルごと消されるというバグが有る。
/xjd /xjf /xj /sl 全部ダメ。
怖くて使えない。 >>896
空なら大丈夫だと思うけど、場合によってはそこに WinRE (Windows 回復環境)が入ることがある。
(バグやディスク容量の関係)
https://www.atmarkit.co.jp/ait/articles/2002/19/news006.html
だから丸っきり不要ってわけでもないのだよ。 http://itomo.cocolog-nifty.com/itomolog/2011/06/windows-4df1.html
このサイトを参考に実験フォルダにテキストファイルを量産して*.txtで検索するように書き換えて実行したんだけど
(ファイル名)が見つかりません。って表示が出るだけで上手くいかないけど何か抜けてるのかな?
もちろん対象フォルダには移動している >>909
先頭のecho off をいったん外して、変数がどう展開されてるか確認してみたら? 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 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 ああ LastAccessTimeじゃくてLastWriteTime >>910
初歩的なミスで恥ずかしいですが量産したテキストファイル名に空白が入っている事が原因でした
そこで汎用性を持たせるために空白が入ったファイルも検出したいのですがワイルドカードで検索する方法はありますか? https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/set_1
setコマンドのパラメータで/pとか/aとか指定できますがこのアルファベット1文字が何の略か教えてください
pはPromptStringかな〜と予想してるんですがaは全く見当がつかないです if 感染者数==0 (
goto campaign
) else (
goto campaign
) >>916
MSの英語フォーラムとか
英語版StackOverFlowとか
Redditとか
で尋ねたら?英語で。
本当に知りたいなら英語圏に聞け。英語圏に。 >>921
arithmetic(算術) もいいけど algebra(代数)て解釈もあんじゃね? >>923
まじで?
いや普通にarithmeticでしょw Arithmeticって+-*/のことじゃないの? +とか-はarithmetic operatorだね 大体は理想通りに出来たのですが時々不要な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 if not "%~1"=="" START "" %1 if exist "%~1" start "" "%~1" for /l %%i in (1,1,6) do (if defined TARGET_EXE%%i call :F_NM "%%TARGET_EXE%%i%%") >>929->>931
ありがとうございます
not exist definedの違いなど勉強して盛り込んでみます >>929
すいません startコマンドのクォーテーションを二重がけにはどんな意味があるのでしょうか? >>933
%1の引用符なしが%~1
だから"%~1"は二重がけではない "" START ""
に見えたってことなら
if not "%~1"=="" (
START "" %1
)
こうね >>933
ちなみに"start"でもダメ
一般的に内部コマンドは引用符で囲むとエラーになる
昔はstartが外部コマンドだった時もあったが 面白い書き方見付けた
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] 他のプログラムと標準入出力でやりとりするバッチファイルを作ろうとしています。
:INPUT
set /p INP=
if "%INP%"=="コマンド1" (
処理1
echo 結果1
goto INPUT)
if "%INP%"=="コマンド2" (
処理2
echo 結果2
goto INPUT)
…
goto INPUT
こんな感じにしたんですが、コマンドが連続で送られてくると取りこぼしてしまうようです。
何か対策は無いでしょうか? 他のとやらが標準出力読めるなら
set /p INP=inputok
読めないならこぼさない程度に決め打ちでsleep挟んで送るようにするしか >>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]を表示してるだけだな。 >>942
やりとり相手のプログラムはバッチファイルでもないし自分で作ったわけでもないので調整できません…
やっぱ無理ですかね… 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に書き出しじゃダメなん? >>944
実行速度を気にしないゆっくりでいいのなら、
tasklist に実行するプログラムがあれば待機する
実行するプログラムの終了コード(errorlevel)の癖がわかっているなら
errorlevelで終わったかそうかわかるかも どうも「相手のプログラム」がイメージしづらいようなので、プログラムそのものを貼ります。
将棋所
http://shogidokoro.starfree.jp/index.html
USIプロトコル
http://shogidokoro.starfree.jp/usi.html
USIプロトコル対応の将棋エンジンをバッチファイルで作る、という遊びをしようとしています。
現状将棋エンジンとして登録する(usiコマンドに対してid他を返す)ところまではできますが、
対局しようとするとsetoptionとisreadyが連続で送られてきてisreadyを認識できず、readyokを返せない、等でまともに動きません。
デバッグウィンドウからコマンドを送れば一応動きますが…
>>945
一旦txtに出力するのは考えましたが、具体的な書き方が思いつきません…
将棋所に登録するバッチファイルと、コマンドを処理するバッチファイルの2つに分ける、
とかも考えたんですが、結局その2つのやり取りをどうすれば良いのか… レス数が900を超えています。1000を超えると表示できなくなるよ。