コマンドプロンプトでネットをつなぎなおす（１）

【下調べ】※何分50の手習い。仕事でコマンドプロンプト・windowspowershell初めて使います。緊張

１）コマンドプロンプト「<font color=red>**netsh**</font>」コマンドを利用する

　　　⇒すでにネットで収集したコードを組み合わせた。**完成品**あり

 　　　⇒スタートアップフォルダに入れ、**起動時実施検証済**⇒<font color=red>**期待通りの結果に**</font>

２）Windows Server 2012 では、コマンドプロンプトで ” netsh ” を実行し、次に ” interface ” 等を実行した時点で「Windows の将来のバージョンで、TCP/IP の Netsh機能が削除される可能性あります」と表示されるだとか...　⇒この時点で１）完成品は未使用に格下げしました。
>> http://ssmshibata.wp.xdomain.jp/2013/06/05/netsh-%E3%81%AE%E9%81%8B%E5%91%BD%E3%82%84%E5%A6%82%E4%BD%95%E3%81%AB%E3%80%82/
投稿者ssmshibataさん

⇒現在のnetshでつくったbatファイルから<font color=blue>**powershellで作り直し実施中**</font>

## 1. ネットからコピペでお借りした寄せ集めのMYコード
:::note warn
我、無知の故、動かず　（個々のネットからとってきたコードはうまく動くはず）
:::
:::note alert
コピーして使用しないでください。動きません。
:::
```network(寄せ集め).bat

@powershell "$s=[scriptblock]::create((gc %~f0|?{$_.readcount -gt 1})-join\"`n\");&$s" %*
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }


$adapter = Get-NetAdapter | Where-Object {$_.InterfaceAlias -eq "Wi-Fi"}
 
# アダプターのコンフィグを取得
$conf = $adapter | Get-NetIPConfiguration
# IPアドレスが設定されている場合
If ($conf.IPv4Address.IPAddress) {
 
    # その設定を削除する
    $adapter | Remove-NetIPAddress -AddressFamily "IPv4" -Confirm:$false
}
 
# デフォルトゲートウェイが設定されている場合
If ($conf.Ipv4DefaultGateway) {
 
    # その設定を削除する
    $adapter | Remove-NetRoute -AddressFamily "IPv4" -Confirm:$false
}
 
$adapter | New-NetIPAddress `
 -AddressFamily "IPv4" `
 -IPAddress "172.17.2.XXX" `
 -PrefixLength 24 `
 -DefaultGateway "172.17.2.XXX"
 
 $adapter | Set-DnsClientServerAddress -ServerAddresses "211.129.XX.XX,211.129.XX.XXX"

```
>>解説
出典：https://teratail.com/questions/254067
解説はku__ra__geさん
出典：https://gist.github.com/newgami/de924220b8241561203b902557b83ed8
newgamiさんの解説をほぼ引用
コード出典：https://qiita.com/sakekasunuts/items/63a4023887348722b416
if (!([Security.Principal.WindowsPrincipal]〜-Verb RunAs; exit }まで（上記コード）
コード出典：https://hitoriit.blog/archives/2441
$adapter = Get-NetAdapter | Where-Object {$_.InterfaceAlias -eq "Wi-Fi"}
 から最後まで
こちらも参考に
https://note.com/nerone1024/n/nbef20f6df66a



## 2. 上の行からなぞってコード解説（引用多数）
+ **＠**
　⇒先頭に記載することで、@あり：アットマーク記号記入行も対象
　　@なし：アットマーク記号記入行は対象外、それ以降の行から適用

+ **@echo off**
  ⇒コマンドラインを見やすくするためのコマンド
  
出典：@Sanada-code
>https://qiita.com/Sanada-code/items/5d21d885b732e6fb0d03
 
+ **powershell**
　⇒powershellで書かれたスクリプトを実行します。ここでの場合は５行目の$adapter以下

+ **$sは変数**
変数名では大文字と小文字は区別されず、スペースや特殊文字を含めることができます
変数を宣言する
　PowerShellでは、変数は必ず$記号で始まり、文字、数字、記号、およびスペースを組み合わせて指定します。

+ **=**
  代入

+ **[scriptblock]::create**
Createメソッド----このメッソドは文字列からScriptBlockを作る。スクリプトブロック・クラスの Create() メソッドを呼び出して、後ろに示された文字列からスクリプトブロックを作成。ここでは自身のパス名とファイル名を配列にし、さらにスクリプトブロックに作成します。

基礎知識【スクリプトブロック】
コマンドを事前に格納しておいて実行時に評価させることができる仕組みです。
スクリプトブロックを実行時は「&」か「.」を頭に記入することで実行できます。

+ **gc**  
Get-Contentの省略形（「エイリアス」）[Powershellコマンドレット]
Get-Contentは、ファイルの中身を1行ずつ格納し配列にする

>(参考)https://qiita.com/alchemist/items/e6706cd425f8f5e5032e
>方法3: ファイルの内容を一度文字列として読み込んでから実行する
>最後に、スクリプトの内容をまるごと文字列として読み込んで実行する方法もあります。

>Get-Contentはファイルの内容を各行を１つの文字列とする配列として読み込むので、改行を入れて結合してからInvoke-Expressionで実行します。

```PowerShell_2.0
(Get-Content [ファイル名]) -join "`n" | Invoke-Expression
```

まめ知識【動詞ー名詞でつながったコマンド】powershellの特有のコマンド

+ **%~f0**
 実行したバッチファイル（%0）の絶対パスを取得する
【参考】
+ **%0** 
バッチファイルの自体の名前を参照（このバッチファイルのフルパス）

【基礎知識】[Windows NT 系] [拡張構文]
バッチファイルの引数(%0～%9)を展開する際、「%」文字の直後に「~」文字を入れると引数の展開方法が変わります。「~」と数字0～9の間に以下の文字を指定するとそれぞれ以下のように展開されます。
「 %0 」や「 %1 」などの「%数字」は、引数を表し「 0 」は例外で実行しているバッチファイル自身を表します。
※展開例」では、元の「%1」の値はすべて「"Text Documents\note.201311.txt"」とし、現在のディレクトリを「D:\MyDocument」とします。
「 ~dp 」のように「 % 」と「数字」の間にある「~」や「d」は、「%数字」の内容をどのように加工（展開）して取り出すかを指定しています。

+ 
|指定|概要|
|:-:|:-:|
|%~d0|%0をドライブ文字だけに展開|
|%~p0|%0をパス名だけに展開|
|%~n0|%0をファイル名だけに展開|
|%~x0|%0をファイル拡張子だけに展開|
|%~dp0|%0をドライブ文字とパスだけに展開|
|%~nx0|%0をファイル名と拡張子だけに展開|
|%~nxI0|%0をファイル名と拡張子だけに展開|
|%~fs0|%0を完全なパスと短い名前だけに展開|

+ 

|表記|意味（解説）|展開例|
|:-:|:-:|:-:|
|%1|(拡張法を用いない場合)|"Text Documents\note.201311.txt"|
|%~1|(「~」と数字の間に何も指定しない場合)引数内のダブルクオーテーションマーク「"」を削除して展開します。削除されるのは最初と最後の文字のみです。なお、以下の展開方法でもダブルクオーテーションマークは除去されます。|Text Documents\note.201311.txt|
|%~f1|引数を相対パスのファイル名と見なし、絶対パスのファイル名に変換して展開します。この際指定したファイルが存在しなくても構いません。|D:\MyDocument\Text Documents\note.201311.txt|


+ **・・・あ|・・・い(パイプ)** ※「あ」のうしろにある縦棒のこと
実行結果を次のコマンドへ渡してくれる（「・・・あ」という内容を「・・・い」へ移してくれる）
コマンドではをパイプでつなぐとテキストデータが次のコマンドに送られる。
PowerShell では、テキストデータではなく配列やオブジェクトが送られる。

+ **?**
Where-Objectの省略形（エイリアス）[Powershellコマンドレット]

+ **$_**
パイプラインを介してで受け取ったオブジェクトを参照する（受け取る）ための暗黙の変数

+ 
|比較演算子|意味|例 (true を返す例)|
|:-:|:-:|:-:|
|-eq|次の値と等しい|1 -eq 1|
|-ne|次の値と等しくない|1 -ne 2|
|-lt|次の値未満	1 -lt 2
|-le|次の値以下	1 -le 2
|-gt|次の値より大きい	2 -gt 1
|-ge|次の値以上	2 -ge 1

+ **-gt 1**
このファイルに書いてあるコードの「１より大きい、つまり２行目以降のコード」を指す。
※ここは完全なあやまりで-gt 2で３行目以降が実施対象のpowershellこーぢになります。

■Where-Object スクリプト ブロック(今回はエイリアスで?になっています)は、パイプライン中の現在のオブジェクトを参照するために、特殊変数 $_ を使用。 下はその例です。 数値の一覧があり、3 未満の値だけを返したい場合、Where-Object を使用して、次のように入力して数値を抽出できます。



```例.bat
1,2,3,4 | Where-Object {$_ -lt 3}
```
```結果.bat
1
2
```


if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }まで
の解説

|コード|意味|
|:-:|:-:|
|if ( ! ( ～～～ ) )|もし（～～～）でなければ|
|[Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()|現在の実行権限を取得|
|.IsInRole("Administrators")|管理者権限|
|Start-Process powershell.exe|PowerShellを新しく実行|
|"-File `"$PSCommandPath`"|自分自身のフルパスを指定し、|
|-Verb RunAs|管理者権限で、|
|; exit|管理者権限がない場合には即座に終了します。|

https://qiita.com/sakekasunuts/items/63a4023887348722b416#PowerShell%E3%82%92%E7%9B%A3%E7%90%86%E8%80%85%E6%A8%A9%E9%99%90%E3%81%AB%E6%98%87%E6%A0%BC%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84