分かりやすく、使いやすく。

ファイルを移動する方法

スポンサーリンク

Powershell でファイルを移動するには Move-Item コマンドレットを使用します。

  1. 移動先にファイルが存在する場合、移動を行わない
  2. 移動先にファイルが存在する場合、上書きで移動する
  3. 移動先にファイルが存在する場合、名前を変更して移動する


移動先にファイルが存在する場合、移動を行わない

移動先にファイルが存在する場合、処理を中止してエラー処理を行う場合のサンプルコードは次の通りです。

PowerShell(実行可能なサンプルコード)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$path_from = 'd:\temp\移動元\test.txt'
$path_to   = 'd:\temp\移動先\test.txt'
 
$path_to_folder = Split-Path $path_to -parent
 
# 移動元ファイルの存在チェック
if(-not(Test-Path($path_from))){
  Write-Host '移動元ファイルが存在しないので終了します'
  exit
}
 
# 移動先ファイルを格納するフォルダの存在チェック
if(-not(Test-Path($path_to_folder))){
  Write-Host '移動先ファイルを格納するフォルダが存在しないので終了します'
  exit
}
 
try{
  # 実行時のエラーを catch できるように ErrorAction に Stop を設定
  Move-Item $path_from $path_to -ErrorAction Stop
  
}catch [Exception]{
  Write-Host 'エラーが発生しました。'
  Write-Host $Error
  
  # 以下、エラー処理を記述
  Write-Host 'エラー処理'
} 

移動先にファイルが存在する場合、上書きで移動する

移動先にファイルが存在する場合、移動先のファイルを上書きして移動する場合のサンプルコードは次の通りです。上書きの場合、 Move-Item に -force を指定します。

PowerShell(実行可能なサンプルコード)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
$path_from = 'd:\temp\移動元\test.txt'
$path_to   = 'd:\temp\移動先\test.txt'
 
$path_to_folder = Split-Path $path_to -parent
 
# 移動元ファイルの存在チェック
if(-not(Test-Path($path_from))){
  Write-Host '移動元ファイルが存在しないので終了します'
  exit
}
 
# 移動先ファイルを格納するフォルダの存在チェック
if(-not(Test-Path($path_to_folder))){
  Write-Host '移動先ファイルを格納するフォルダが存在しないので終了します'
  exit
}
 
try{
  # 実行時のエラーを catch できるように ErrorAction に Stop を設定
  Move-Item $path_from $path_to -force -ErrorAction Stop
  
}catch [Exception]{
  Write-Host 'エラーが発生しました。'
  Write-Host $Error
  
  # 以下、エラー処理を記述
  Write-Host 'エラー処理'
} 

移動先にファイルが存在する場合、名前を変更して移動する

次のサンプルコードは、移動先に同名のファイルが存在する場合、名前を変更して移動します。例えば test.txt を移動する場合、同じ名前のファイルがあれば test_1.txt とします。もし test_1.txt も存在する場合は、 test_2.txt、 test_3.txt と名前の後の数字をインクリメントさせます。このサンプルコードでは最大 1000 までインクリメントしますが、 for 文を書きかえればインクリメントの上限は変更可能です。

PowerShell(実行可能なサンプルコード)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
$path_from = 'd:\temp\移動元\test.txt'
$path_to   = 'd:\temp\移動先\test.txt'
 
$path_to_folder = Split-Path $path_to -parent
 
# 移動先に同名ファイルが存在する場合のリネーム用の変数
$path_to_basename_with_path = [System.IO.Path]::GetDirectoryName($path_to) `
                            + '\' `
                            + [System.IO.Path]::GetFileNameWithoutExtension($path_to)
                            
$path_to_extension = [System.IO.Path]::GetExtension($path_to)
 
# 移動元ファイルの存在チェック
if(-not(Test-Path($path_from))){
  Write-Host '移動元ファイルが存在しないので終了します'
  exit
}
 
# 移動先ファイルを格納するフォルダの存在チェック
if(-not(Test-Path($path_to_folder))){
  Write-Host '移動先ファイルを格納するフォルダが存在しないので終了します'
  exit
}
 
try{
  for($i = 0; $i -lt 1000; $i++){
 
    if($i -gt 0){
      # ファイルが存在する場合、ファイル名をカウント変数付きに変更。
      $path_to = $path_to_basename_with_path + '_' + $i + $path_to_extension
    }
    
    # ファイルが存在しない場合のみ移動する。
    # ファイルが存在する場合は、ループしてファイル名を変更して再度チェック。
    if(-not(Test-Path($path_to))){
      # 実行時のエラーを catch できるように ErrorAction に Stop を設定
      Move-Item $path_from $path_to -force -ErrorAction Stop
      
      # ループ終了
      break
    }
  }
  
}catch [Exception]{
  Write-Host 'エラーが発生しました。'
  Write-Host $Error
  
  # 以下、エラー処理を記述
  Write-Host 'エラー処理'
} 
スポンサーリンク
スポンサーリンク