以下は、PowerShellで robocopy
を使用して指定のフォルダからカレントフォルダ配下の指定フォルダにファイルをコピーし、コピーまたは削除されたファイル名のみを表示するスクリプト例です。
# ユーザープロファイル配下のコピー元フォルダを指定
$sourceFolder = "$env:USERPROFILE\\\\Documents\\\\SourceFolder"
# カレントディレクトリ配下のコピー先フォルダを指定
$destinationFolder = ".\\\\DestinationFolder"
# コピー先フォルダが存在しない場合は作成
if (-not (Test-Path -Path $destinationFolder)) {
New-Item -ItemType Directory -Path $destinationFolder | Out-Null
}
# robocopyオプションの設定
# /S : サブフォルダもコピー(空フォルダは含まない)
# /Z : 再開可能モード
# /COPY:DAT : ファイル属性のコピー(デフォルト)
# /NP : 進捗表示を省略
# /LOG+: 書き込むログファイル(エラー情報をファイルに記録可能)
$robocopyOptions = "/S /Z /COPY:DAT /NP /LOG+:robocopy.log"
# robocopyの実行
Write-Host "Copying files from $sourceFolder to $destinationFolder..."
$copyResult = robocopy $sourceFolder $destinationFolder $robocopyOptions
# 実際にコピーされたファイルの出力
$copyResult | ForEach-Object {
if ($_ -match '^\\\\s+\\\\d+\\\\s+\\\\d+\\\\s+(.*)$') {
$fileName = $matches[1].Trim()
Write-Host "Copied: $fileName"
}
}
# ログファイルの削除(必要に応じて削除)
Remove-Item -Path "robocopy.log" -Force
$env:USERPROFILE
を使用してユーザーのプロファイルフォルダを動的に取得。robocopy
のオプションで進捗や検査情報を抑制し、結果ログからコピーされたファイル名を抽出。$sourceFolder
と $destinationFolder
を適切なパスに変更してください。robocopy
の動作環境を確認し、権限エラーを防ぐために適切な権限で実行してください。このスクリプトをPowerShellで実行すれば、指定の動作が実現できます。
以下は、PowerShellでコピー処理を関数化したスクリプト例です。関数名を COPY
として、コピー元フォルダ名とコピー先フォルダ名を引数として渡す形式にしています。
# COPY関数の定義
function COPY {
param (
[string]$SourceFolderName, # コピー元フォルダ名(UserProfile配下)
[string]$DestinationFolderName # コピー先フォルダ名(カレントディレクトリ配下)
)
# ユーザープロファイル配下のコピー元フォルダ
$sourceFolder = Join-Path -Path $env:USERPROFILE -ChildPath $SourceFolderName
# カレントディレクトリ配下のコピー先フォルダ
$destinationFolder = Join-Path -Path (Get-Location) -ChildPath $DestinationFolderName
# コピー先フォルダが存在しない場合は作成
if (-not (Test-Path -Path $destinationFolder)) {
New-Item -ItemType Directory -Path $destinationFolder | Out-Null
}
# robocopyオプションの設定
# /S : サブフォルダもコピー(空フォルダは含まない)
# /Z : 再開可能モード
# /COPY:DAT : ファイル属性のコピー(デフォルト)
# /NP : 進捗表示を省略
# /LOG+ : ログを保存(結果の解析用)
$robocopyOptions = "/S /Z /COPY:DAT /NP /LOG+:robocopy.log"
# robocopyの実行
Write-Host "Copying files from $sourceFolder to $destinationFolder..."
$copyResult = robocopy $sourceFolder $destinationFolder $robocopyOptions
# 実際にコピーされたファイルの出力
$copyResult | ForEach-Object {
if ($_ -match '^\\\\s+\\\\d+\\\\s+\\\\d+\\\\s+(.*)$') {
$fileName = $matches[1].Trim()
Write-Host "Copied: $fileName"
}
}
# ログファイルの削除(必要に応じて削除)
Remove-Item -Path "robocopy.log" -Force
}
# サンプル呼び出し
# コピー元: UserProfile配下の "Documents\\\\SourceFolder"
# コピー先: カレントディレクトリ配下の "DestinationFolder"
COPY "Documents\\\\SourceFolder" "DestinationFolder"