tag:crieit.net,2005:https://crieit.net/tags/%E8%A6%9A%E6%9B%B8/feed
「覚書」の記事 - Crieit
Crieitでタグ「覚書」に投稿された最近の記事
2022-01-28T19:12:24+09:00
https://crieit.net/tags/%E8%A6%9A%E6%9B%B8/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
tag:crieit.net,2005:PublicArticle/17958
2022-01-28T18:32:09+09:00
2022-01-28T18:32:09+09:00
https://crieit.net/posts/aka-win-sysconf-1
OSの設定をPowershellで変える(言語編)
<h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1>
<p>多国語の対応とかしてると確認のためにいちいちシステム言語を切り替えて云々が発生してうっとおしいのでバッチにしてしまえ、たぶんPowerShellでできるはずだ、ということで調べた結果を垂れ流す。<br />
なお、システム設定いじくるので管理者として実行してあげる必要がある。<br />
それも面倒なので権限昇格するようにバッチで行う。(そのうち別記事で書く)</p>
<h1 id="サポート言語の追加"><a href="#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E8%A8%80%E8%AA%9E%E3%81%AE%E8%BF%BD%E5%8A%A0">サポート言語の追加</a></h1>
<p>[Windows設定]→[時刻と言語]→[言語]のページの下の方の[言語の追加]。</p>
<h2 id="Get-WinUserLanguageList/Set-WinUserLanguageList"><a href="#Get-WinUserLanguageList%2FSet-WinUserLanguageList">Get-WinUserLanguageList/Set-WinUserLanguageList</a></h2>
<p>Get~で現在のサポート言語のリストをとってくる<br />
Set~でサポート言語リストをセットする<br />
ので<br />
1.Getする<br />
2.追加する(言語コードをAdd)<br />
3.Setする<br />
でいける</p>
<p>例えばドイツ語なら</p>
<pre><code>$CurrList = Get-WinUserLanguageList
$CurrList.Add("de-DE")
Set-WinUserLanguageList $CurrList -Force
</code></pre>
<p>-Forceは自動化したいから。ないと確認メッセージが出ます。</p>
<h1 id="地域設定(形式)"><a href="#%E5%9C%B0%E5%9F%9F%E8%A8%AD%E5%AE%9A%28%E5%BD%A2%E5%BC%8F%29">地域設定(形式)</a></h1>
<p>[Windows設定]→[時刻と言語]→[地域]のページの2こめくらい。</p>
<h2 id="Get-Culture/Set-Culture"><a href="#Get-Culture%2FSet-Culture">Get-Culture/Set-Culture</a></h2>
<p>ただ言語デフォルトに変更したいだけならSet-Cultureで言語コードを渡せばいい。<br />
だけど言語デフォルトでありがちな罠の小数点(たまにカンマの国がある)を変更したいなら<br />
1.Set 言語デフォルト<br />
2.Get<br />
3.編集<br />
4.Set 編集したの<br />
という手順になるが、どうも1の直後に2を呼ぶと反映されてなかったのでps1ファイルを分けた。</p>
<pre><code># ChangeCulture_1.ps1
Set-Culture "de-DE"
</code></pre>
<pre><code># ChangeCulture_2.ps1
$Cult = Get-Culture
$Cult.NumberFormat.NumberDecimalSeparator = "."
Set-Culture $Cult
</code></pre>
<h1 id="システムロケール"><a href="#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB">システムロケール</a></h1>
<p>[Windows設定]→[時刻と言語]→[地域]→[関連設定:日付、時刻、地域の追加設定]→[地域]→[管理]タブ→[Unicode対応ではないプログラムの言語]<br />
※遠い、正直コントロールパネル出した方が早く着く</p>
<h2 id="Get-WinSystemLocale/Set-WinSystemLocale"><a href="#Get-WinSystemLocale%2FSet-WinSystemLocale">Get-WinSystemLocale/Set-WinSystemLocale</a></h2>
<p>確認したいならGetで。Setで言語コードを入れれば終わり。</p>
<pre><code>Set-WinSystemLocale "de-DE"
</code></pre>
<p>再起動は必須なのでお好みに合わせて<br />
Restart-System<br />
をスクリプトに含めるなり、そこは手でやるなりご自由に。</p>
<p>カンタン!</p>
RedCol