tag:crieit.net,2005:https://crieit.net/tags/%E3%83%91%E3%83%83%E3%83%81/feed
「パッチ」の記事 - Crieit
Crieitでタグ「パッチ」に投稿された最近の記事
2022-01-28T19:12:24+09:00
https://crieit.net/tags/%E3%83%91%E3%83%83%E3%83%81/feed
tag:crieit.net,2005:PublicArticle/17959
2022-01-28T19:10:57+09:00
2022-01-28T19:12:24+09:00
https://crieit.net/posts/aka-bat-1
バッチ書くときにしょっちゅう調べなおすこと
<h1 id="パラメータ"><a href="#%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF">パラメータ</a></h1>
<p>%0がバッチ自身で%1-nが引数なのは当然として、%~dp0とかの話。</p>
<div class="table-responsive"><table>
<thead>
<tr>
<th>修飾子</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>%~0</td>
<td>ダブルクォートをとっぱらう</td>
</tr>
<tr>
<td>%~d0</td>
<td>ドライブ文字だけ</td>
</tr>
<tr>
<td>%~p0</td>
<td>ドライブ文字の後のパスだけ(ファイル名は含まない)</td>
</tr>
<tr>
<td>%~f0</td>
<td>フルパス</td>
</tr>
<tr>
<td>%~n0</td>
<td>ファイル名だけ(拡張子は含まない)</td>
</tr>
<tr>
<td>%~x0</td>
<td>拡張子だけ</td>
</tr>
<tr>
<td>%~a0</td>
<td>ファイル属性だけ</td>
</tr>
<tr>
<td>%~t0</td>
<td>ファイル時刻だけ</td>
</tr>
<tr>
<td>%~z0</td>
<td>ファイルサイズだけ</td>
</tr>
<tr>
<td>%~dp0</td>
<td>[応用]ドライブ含むバッチのあるディレクトリ</td>
</tr>
<tr>
<td>%~dpn0.ps1</td>
<td>[応用]同パス同名だけど拡張子がps1</td>
</tr>
</tbody>
</table></div>
<h1 id="対話入力"><a href="#%E5%AF%BE%E8%A9%B1%E5%85%A5%E5%8A%9B">対話入力</a></h1>
<p>/pオプション。気を付けるべきはsetは変数と=の間に隙間あけちゃだめってとこ。</p>
<pre><code>set /p hoge="Input:"
echo %hoge%
</code></pre>
<h1 id="遅延環境変数"><a href="#%E9%81%85%E5%BB%B6%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0">遅延環境変数</a></h1>
<p>詳しい説明はどこかに任せる。<br />
要はifとかforとかの括弧の中は1行として扱われるからその中で変化した変数を扱いたい時にこれを使う。<br />
※なにが”遅延”なのかいまだに理解できていない。<br />
ポイントは最初のおまじないとエクスクラメーションマークでくくることくらい。<br />
最初のおまじないの言葉をよく忘れる。間にスペースがないから覚えにくいのだと思う。<br />
「enable delayed expansion」</p>
<pre><code>setlocal enabledelayedexpansion
if "%hoge%"=="" (
set result="karappo"
echo !result!
)
</code></pre>
<h1 id="権限昇格の技"><a href="#%E6%A8%A9%E9%99%90%E6%98%87%E6%A0%BC%E3%81%AE%E6%8A%80">権限昇格の技</a></h1>
<p>PowerShellさんまじですごい。<br />
Start-Processに-Verbっていうのがあって色々ユーザ視点でできるけどその中に管理者として実行がある。それがrunas。あとは知ってることの組み合わせ。</p>
<pre><code>@echo off
if not "%1%"=="admin" (
PowerShell -command "Start-Process -Verb runas -FilePath %~f0 -ArgumentList 'admin'"
) else (
echo Start Run As Administrator!
pause
)
</code></pre>
<p>上記例では自身を管理者権限で呼び出している。無理やり引数にフラグもたせたけどもっとスマートな方法があるかも。</p>
<h1 id="気が向いたら追記する"><a href="#%E6%B0%97%E3%81%8C%E5%90%91%E3%81%84%E3%81%9F%E3%82%89%E8%BF%BD%E8%A8%98%E3%81%99%E3%82%8B">気が向いたら追記する</a></h1>
RedCol