ブログ

ネットワークドライブ内のフォルダ名の全角半角スペースを置換してリネームする

Windows PC と NAS の構成で、NAS上で リネームPowerShell を実行する手順です。

手順

  1. NAS上に リネームPowerShell を用意
  2. NAS上で PowerShell実行ポリシー を変えてから実行

ポイント

  • 1度だけのスクリプト実行なら、PowerShell実行ポリシーを変えるのが便利(例:リネームスクリプト)
  • 定期的なスクリプト実行なら、該当PowerShellに自己署名証明書を付けるのが良い(最下部で解説)

1. NAS上に リネームPowerShell を用意

以下をテキストファイルにコピペして、Rename.ps1 として保存。

空白文字を半角アンダーバーに置換するスクリプトです。

それを、NAS上のリネームしたいフォルダたちと並列に置きます。

$mygl=(Get-Location).Path
Write-Output ${mygl} 以下の全てのディレクトリ名、ファイル名に含まれる空白文字を半角アンダーバーに置換します。
$input=Read-Host "よろしいですか?[Y/n]"
if ($input -eq "Y") {
  Get-ChildItem -Recurse | Rename-Item -NewName { $_.Name -replace '\s','_' }
  Read-Host "終了するにはEnterキーを押して下さい..."
  }

 

2. NAS上でPowerShell実行ポリシーを変える

NAS上で Ctrl+ Shft + 右クリック の「PowerShell ウィンドウをここで開く」でPowerShell起動します。

PowerShell で Rename.ps1 を実行すると以下のエラーになります。

ファイル ~ はデジタル署名されていません。このスクリプトは現在のシステムでは実行できません。

PowerShell で Get-ExecutionPolicy -list で現在のポリシーを表示します。

(参考:PowerShell 実行ポリシー

Process が Undefined なっていることが確認できます。

これを Bypass に変更すると、任意のPowerShellファイルが実行可能になります。
(PowerShell を閉じれば Process は Undefined に戻るのでセキュリティ的に安全)

Set-ExecutionPolicy で Process のポリシーを変更します。

再度 Get-ExecutionPolicy -list でポリシーを確認してみましょう。

Process が Bypass になっていますね。

Rename.ps1 を実行すると動作し、リネームの確認が出力されました。

あとは y をEnterするだけでリネームスクリプトが動作します。

Process が Bypass のままではセキュリティリスクがあるので、PowerShell を閉じてポリシーを戻します。

再度 PowerShell を起動して Get-ExecutionPolicy -list して確認します。

Process は Undefined に戻っていますね。

実行ポリシーを変えてPowerShell実行する方法はこれで解説終了です。

必要な人のみ、以下をクリックで展開してみて下さい。

+ 自己署名証明書を付けてPowerShell実行する方法(クリックで展開)

該当PowerShell に自己署名証明書を付ける方法

リネームスクリプトなどではなく、定期的に実行するスクリプトの場合は自己署名証明書を付けるのがオススメ。

実行ポリシーを変更している時間が長いほどセキュリティリスクがあるので。

1. PowerShellスクリプトを用意

NASではなくDドライブ直下に該当PowerShellを用意します。

リネームスクリプトではない想定なので、MyScript.ps1 とします。(D:\MyScript.ps1)

2. MyScript.ps1 に自己署名証明書を付ける

以下をテキストファイルにコピペして、SelfSign.ps1 として保存。

このファイルもDドライブ直下に置く。(D:\SelfSign.ps1)

# 署名用の証明書を作成
$cert = New-SelfSignedCertificate `
        -Subject "CN=PowerShellスクリプト署名用証明書" `
        -KeyAlgorithm RSA `
        -KeyLength 2048 `
        -Type CodeSigningCert `
        -CertStoreLocation Cert:\CurrentUser\My\ `
        -NotAfter ([datetime]"2099/01/01")
# 信頼済みのルートとして使用
Move-Item "Cert:\CurrentUser\My\$($cert.Thumbprint)" Cert:\CurrentUser\Root

# 証明書への参照を取得
$rootcert = @(Get-ChildItem cert:\CurrentUser\Root -CodeSigningCert)[0]
# スクリプトに署名
Set-AuthenticodeSignature D:\MyScript.ps1 $rootcert

15行目の MyScript.ps1 へのパスが合っている確認する。

SelfSign.ps1のディレクトリでPowerShell起動し、SelfSign.ps1 を実行します。

すると、自己署名証明書が付いた MyScript.ps1 が得られます。

MyScript.ps1 をエディタで開くと、以下の文字列の追加を確認できます。

# SIG # Begin signature block
# MIIGCwYJKoZIhvcNAQcCoIIF/DCCBfgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
(省略)
# SIG # End signature block

3. MyScript.ps1 を NASの該当フォルダにコピーして実行

MyScript.ps1 を NASの該当フォルダにコピーします。

デジタル署名されているので、NAS上で MyScript.ps1 が実行できます。

備考

D:\で起動した PowerShell を cd で NAS に移動できませんでした。

cd ではなく Set-Location だと移動できました。

-ブログ

© 2022 墾田ええねん! Powered by AFFINGER5