0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellで安易にファイル操作を試みた結果

Last updated at Posted at 2020-07-07

※個人的なメモです

確認事項
PowerShellでファイル操作困難な文字
 []
PowerShellでエスケープ必須の文字
 半角' 全角´
 半角& 全角&
 ※PowerShellは全角も特殊文字として扱う

コマンドプロンプトで特筆すべき禁止文字
 半角&

概要
PowerShellでフォルダ内の特定のファイルを探して子フォルダを作成して移動する簡単なスクリプトを書いた
ファイル名に[]が含まれているためフォルダ作成はできてもファイル移動が不可能
代替手段としてバッチに引数を渡して実行することにした
バッチに引数を渡すことはできたがバッチから戻り値( EXIT /B "文字列" )を得られなかった
PowerShellで与えた引数に全角&が含まれていると引数を""でエスケープしても
バッチ側でコマンドの区切りとして扱われて正常に動作しなかった
通常バッチは全角&を認識しないがPowerShellが引数を渡す時に半角&に変換するようだ

感想
PowerShell のコマンドレットだけではファイル操作は容易ではなかった
バッチだけで書いたほうが短いし簡単

追記
コメントでご指摘いただいた部分改修できました
-LiteralPath がタブ補完で出てこなかったので悩んでいました
バッチを通さないので上記の煩雑な引数の問題がすべて無くなしました
頭の整理のためコードを残しておきます

ファイルをフォルダに入れてアレするやつ.ps1(ver.7.0.2)
# ドラッグドロップでディレクトリのパスを取得(ショトカ起動)
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
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?