本帖最后由 axelia 于 2024-11-21 16:22 编辑
使用场景:
比如有些程序,写死了原来的路径,不方便修改,程序会在原盘写 日期 20241121 这种文件夹,windows支持使用mklink链接,可以外接一个大容量存储盘来存储,不修改程序,写了个脚本来实现自动创建(可以挂计划任务,每个月执行一次)
直接上代码:
config.txt (用于定义文件夹和链接文件夹) 下面样例:在S盘创建文件夹,链接到D盘
S:\Deployment\文件存储服务\app1 D:\Deployment\文件存储服务\app1
S:\Deployment\文件存储服务\app2 D:\Deployment\文件存储服务\app2
create_folder_and_link.ps1 读取上面的config.txt 创建文件夹和链接
#使用方法:powershell .\create_folder_and_link.ps1 因为创建链接文件需要管理员权限,需要使用管理员权限执行脚本
#修改config.txt 文件,内容格式: 源文件夹路径 空格 链接文件夹路径 例如:C:\test C:\test2
# 确保以管理员身份运行
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Host "This script must be run as an administrator."
exit 1
}
# 获取当前日期
$today = Get-Date
# 计算下一个月的第一天
$nextMonthFirstDay = (Get-Date -Year $today.Year -Month ($today.Month + 1) -Day 1).Date
# 计算下一个月的最后一天
$nextMonthLastDay = (Get-Date -Year $nextMonthFirstDay.Year -Month $nextMonthFirstDay.Month -Day 1).AddMonths(1).AddDays(-1)
# 读取配置文件
$configFile = "config.txt"
$paths = Get-Content -Path $configFile
# 初始化日期变量
$currentDate = $nextMonthFirstDay
# 循环生成下一个月的所有日期
while ($currentDate -le $nextMonthLastDay) {
# 格式化日期为yyyyMMdd
$formattedDate = $currentDate.ToString("yyyyMMdd")
foreach ($path in $paths) {
# 分割路径
$folderPath, $linkPath = $path -split ' '
# 创建文件夹
$fullFolderPath = Join-Path -Path $folderPath -ChildPath $formattedDate
if (-not (Test-Path -Path $fullFolderPath)) {
New-Item -ItemType Directory -Path $fullFolderPath
}
# 创建符号链接
$fullLinkPath = Join-Path -Path $linkPath -ChildPath $formattedDate
if (-not (Test-Path -Path $fullLinkPath)) {
New-Item -ItemType SymbolicLink -Path $fullLinkPath -Target $fullFolderPath
}
}
# 移动到下一天
$currentDate = $currentDate.AddDays(1)
}
Write-Output "All folders and symbolic links created successfully."
|