※個人的なメモです
確認事項
PowerShellでファイル操作困難な文字
[]
PowerShellでエスケープ必須の文字
半角' 全角´
半角& 全角&
※PowerShellは全角も特殊文字として扱う
コマンドプロンプトで特筆すべき禁止文字
半角&
概要
PowerShellでフォルダ内の特定のファイルを探して子フォルダを作成して移動する簡単なスクリプトを書いた
ファイル名に[]が含まれているためフォルダ作成はできてもファイル移動が不可能
代替手段としてバッチに引数を渡して実行することにした
バッチに引数を渡すことはできたがバッチから戻り値( EXIT /B "文字列" )を得られなかった
PowerShellで与えた引数に全角&が含まれていると引数を""でエスケープしても
バッチ側でコマンドの区切りとして扱われて正常に動作しなかった
通常バッチは全角&を認識しないがPowerShellが引数を渡す時に半角&に変換するようだ
感想
PowerShell のコマンドレットだけではファイル操作は容易ではなかった
バッチだけで書いたほうが短いし簡単
追記
コメントでご指摘いただいた部分改修できました
-LiteralPath がタブ補完で出てこなかったので悩んでいました
バッチを通さないので上記の煩雑な引数の問題がすべて無くなしました
頭の整理のためコードを残しておきます
# ドラッグドロップでディレクトリのパスを取得(ショトカ起動)
Set-Location -Path $Args[0]
# ファイルだけ
$childlist = Get-ChildItem | ? { ! $_.PSIsContainer }
# フルパス
$fulllist = $childlist | Select-Object FullName | Format-Table -Wrap | Out-String -Stream
# 条件絞る
$matchlist = $fulllist -match 'sm[0-9]{8}.(flv|mp4)$'
# 再帰処理
foreach ($a in $matchlist) {
[string]$b = Split-Path $a -LeafBase
$c = $b.Substring($b.Length-10,10)
mkdir $b
Move-Item -LiteralPath $a -Destination $b
Push-Location -LiteralPath $b
get-Location | Out-String -Stream
Start-Sleep -s 5
"$cを使う処理"
Pop-Location
Start-Sleep -s 15
}
Read-Host "終了 Enter キーを押してください..."
Exit