SQL利用CMD及RAR命令实现将某一压缩文件解压到指定的路径

--说明:首先要将RAR以及UNRAR复制到system32下,或者设计环境变量
/*
declare @t nvarchar(256)
EXEC p_cmd_unrar_copy 'D:\xxxx.rar','D:',@t output
select @t
*/
Create proc p_cmd_unrar_copy
(
@fullfilepath nvarchar(256),--要解压的RAR文件
@tofilepath nvarchar(256),--要复制到的文件夹(不加\)
@filetime nvarchar(256) output,--输出解压的文件夹的时间及大小以及文件名,不截取时间了
@iscopychildCover bit=1--是否复制子目录并覆盖
)
as
set nocount on
declare @isok int,@childfile nvarchar(256)
set @isok=-1;
if isnull(@fullfilepath,'')='' or isnull(@tofilepath,'')=''
begin
	select '输入不正确'
	return @isok;
end
else
begin
		declare @r int 
		exec master..xp_fileexist @fullfilepath,@r output
		if @r=0
		begin
				select @fullfilepath+'文件不存在!'
				return @isok
		end
		
		if OBJECT_ID('tempdb..#tofilepath') is not null
		drop table #tofilepath
		create table #tofilepath(col nvarchar(max))
		
		declare @sql nvarchar(4000)--CMDSHELL不能用NVARCHAR(MAX)类型
		set @sql='dir '+@tofilepath+'\'--如果只是检验是否存在可以考虑加/B 选项
		--select @sql;
		begin try 
		
				EXEC sp_configure 'show advanced options', 1
				RECONFIGURE
				EXEC sp_configure 'xp_cmdshell', 1
				RECONFIGURE
				
				insert into #tofilepath exec master..xp_cmdshell @sql--,no_output --插入这里不能加
				if exists(select 1 from #tofilepath where col is not null and col like '%dir%')
				begin
						if ISNULL(@iscopychildCover,0)=0--直接解压覆盖到解压路径下
						begin
							set @sql='unrar x  -o+ '+@fullfilepath+' '+@tofilepath+'\';
							exec master..xp_cmdshell @sql,no_output 
						end
						else
						begin
							declare @currfilepath nvarchar(256),@rarfilename nvarchar(256),@unrarfilepath nvarchar(256)
							
							set @currfilepath=SUBSTRING(@fullfilepath,1,LEN(@fullfilepath)-charindex('\',reverse(@fullfilepath)));
							set @rarfilename=REPLACE(@fullfilepath,@currfilepath+'\','');--包含文件类型
							--set @rarfilename=SUbstring(@rarfilename,1,CHARINDEX('.',@rarfilename)-1);--文件名也是文件夹名
							--不能这样判断文件夹,因为也有可能包含.这样的字符。用倒数
							set @rarfilename=LEFT(@rarfilename,LEN(@rarfilename)-charindex('.',reverse(@rarfilename)))
							set @unrarfilepath=@currfilepath+'\'+@rarfilename;--解压后的文件夹路径
							
							-- -ad表示将文件名当成解压后的文件夹名 -o+表示覆盖
							set @sql='unrar x -ad -o+ '+@fullfilepath+' '+@currfilepath+'\';--先解压到当前文件的路径
							exec master..xp_cmdshell @sql,no_output 
							
							truncate table #tofilepath
							select @sql='DIR '+@unrarfilepath;
							insert into #tofilepath exec master..xp_cmdshell @sql--,no_output --主要是要获取时间,否则用/B选项
							
							select TOP 1 @childfile=col from #tofilepath where col like '%<DIR>%' AND COL NOT LIKE '%.%'--执行查找是否有子目录
							--SELECT * FROM #tofilepath
							if(ISNULL(@childfile,'')<>'')--有子目录--则COPY子目录下的所有文件夹及文件到指定目录
							begin	
									
									select @filetime=RTRIM(LTRIM(@childfile))
									--RTRIM(LTRIM(SUBSTRING(@childfile,1,charindex('<',@childfile)-1)))--子目录文件夹时间返回任意一个
									--select @childfile=RTRIM(LTRIM(STUFF(@childfile,1,CHARINDEX('>',@childfile),'')))--子目录文件夹名
									--1.copy子目录下的东西过去
									--2.copy目录下的文件过去
									truncate table #tofilepath
									set @sql=@unrarfilepath +'/B';
									insert into #tofilepath exec master..xp_cmdshell @sql--,no_output ;--只显示名称
									
									declare cur_file cursor fast_forward
									for
									select col from #tofilepath
									--循环copy所有文件
									OPEN cur_file
									FETCH NEXT FROM cur_file INTO @childfile
									WHILE @@FETCH_STATUS=0
									BEGIN
											--不用判断了.都copy
											--if(@childfile like '%.%')--表示是文件
											--begin
											--		set @sql='Xcopy '+@unrarfilepath+'\'+@childfile+' '+@tofilepath+' /E /H /R /G /Y';
											--end
											--else--否则是文件夹
											--begin
													set @sql='Xcopy '+@unrarfilepath+'\'+@childfile+' '+@tofilepath+' /E /H /R /G /Y';
											--end
											exec master..xp_cmdshell @sql,no_output 
											FETCH NEXT FROM cur_file INTO @childfile
									END
									CLOSE cur_file
									DEALLOCATE cur_file;								
							
							
							end
							ELSE--没有子目录就直接把文件全COPY过去--与直接解压一样的
							BEGIN	
									
									select TOP 1 @childfile=col 
									from #tofilepath where col NOT like '%<DIR>%' AND COL  LIKE '%.%' and col not like '%'+@unrarfilepath+'%'
									select @filetime=RTRIM(LTRIM(@childfile))
									
									set @sql='Xcopy '+@unrarfilepath+' '+@tofilepath+' /E /H /R /G /Y';--把解压后的子目录文件COPY到指定位置
									--select @sql;
									exec master..xp_cmdshell @sql,no_output 
							END	
							--删除解压的目录
							set @sql='RD '+@unrarfilepath+' /S /Q';
							exec master..xp_cmdshell @sql,no_output 
							--select @sql;
						end
						
						set @isok=0;
						
				end
				else
				begin
					 select top 1 * from #tofilepath
				end
		end try
		begin catch
				select 'MESSAGE:'+ERROR_MESSAGE()+' ProcName:'+ERROR_PROCEDURE();
		end catch
		--关闭CMDSHELL
		EXEC sp_configure 'xp_cmdshell', 0
		RECONFIGURE
		EXEC sp_configure 'show advanced options', 0
		RECONFIGURE
		
end
return @isok;
go


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页