在本文中,将探讨如何使用PowerShell脚本从SQL数据库中读取文件路径,并根据当前日期对文件进行重命名。这是一个常见的需求,尤其是在需要自动化文件管理任务时。
首先,需要一个数据库表来存储文件路径。以下是一个简单的SQL脚本,用于创建这样一个表:
USE [SachaTest];
GO
CREATE TABLE [dbo].[Files](
[FilePath] NVARCHAR(MAX) NOT NULL
) ON [PRIMARY];
接下来,将向这个表中插入一些文件路径:
INSERT INTO [SachaTest].[dbo].[Files] ([FilePath])
VALUES ('C:\Users\barbers\Desktop\PowerShellTest\dummy1.txt');
GO
INSERT INTO [SachaTest].[dbo].[Files] ([FilePath])
VALUES ('C:\Users\barbers\Desktop\PowerShellTest\dummy2.txt');
GO
这些文件路径将作为接下来脚本处理的基础。
接下来,将编写一个PowerShell脚本来处理这些文件。脚本的主要任务是:
以下是完整的PowerShell脚本:
# 建立SQL连接,并从"Files"表中获取数据
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Data Source=omnidev;Initial Catalog=SachaTest;Integrated Security=True;Timeout=180;MultipleActiveResultSets=true;"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "select * from Files"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
# 处理每个DataRow,获取FilePath列的值,并创建新文件
Function ProcessFile (){
Process {
$fileOnDisk = New-Object -TypeName System.IO.FileInfo($_["FilePath"])
write-host "full name is: " + $fileOnDisk.FullName
$datePartForFile = (Get-Date -format d).Replace("/","")
$justFileName = [System.IO.Path]::GetFileNameWithoutExtension($fileOnDisk.FullName)
$newFileName = $fileOnDisk.DirectoryName + '\' + $justFileName + '_' + $datePartForFile + $fileOnDisk.Extension
write-host "new file name is: " + $newFileName
If (Test-Path $newFileName){
Remove-Item $newFileName
}
[System.IO.File]::Copy($fileOnDisk.FullName, $newFileName);
}
}
# 跳过空对象的过滤器
filter Skip-Null { $_|?{ $_ } }
# 遍历DataSet.Tables[0](即Files表),然后处理每个文件
$DataSet.Tables[0] | Select-Object $_.Rows | Skip-Null | ProcessFile