2015-08-30 7 views
6

के माध्यम से विंडोज कमांड खोल में बनाई गई तिथि के अनुसार फ़ाइलों को लोड करने के लिए कैसे करें SQL सर्वर में, मैं एक विशिष्ट निर्देशिका से सभी ".jpg" फ़ाइल नाम लोड करने के लिए नीचे एक क्वेरी का उपयोग कर रहा हूं (उदाहरण के लिए z :) एक तालिका में ।एसक्यूएल सर्वर के xp_cmdshell

मैं वहाँ के लिए बनाया गया दिनांक बजाय संशोधित विंडोज कमांड प्रॉम्प्ट में दिनांक अनुसार फ़ाइलों को लोड करने का कोई तरीका है जानना चाहते हैं। xp_cmdshell निष्पादित करते समय नीचे दी गई क्वेरी केवल संशोधित दिनांक के साथ काम करती है।

-- Create the table to store file list 
CREATE TABLE myFilesTable (myFileID INT IDENTITY, myFileName NVARCHAR(256)) 

-- Insert file list from directory to SQL Server 
DECLARE @Command varchar(1024) = 'z: & forfiles /m *.jpg /s /d 07/16/2015 /c "cmd /c echo @fdate @ftime @path"' 

INSERT INTO myFilesTable 
    EXEC MASTER.dbo.xp_cmdshell @Command 

-- Check the list 
SELECT * FROM myFilesTable 
GO 

चर @Command में 07/16/2015संशोधित तिथि है। स्पष्ट रूप से कमांड forfiles में द्वारा फ़ाइलों को फ़िल्टर करने के लिए कोई सुराग नहीं है बनाया गया।

नीचे दिए गए प्रश्न से कुछ परिणाम नीचे दिए गए हैं जिसमें फ़ाइल नाम संशोधित दिनांक द्वारा उपसर्ग किए गए हैं।

myFileID | myFileName 
---------------------- 
1  | NULL 
2  | 8/18/2015 11:13:08 AM "Z:\LDB1 App Export\Top Star_Aluminium Frames & Furniture (B)-31267.jpg" 
3  | 8/19/2015 5:44:41 PM "Z:\LDB2 App Export\Soe Tint_Hardware Merchants & Ironmongers-31435.jpg" 
4  | 8/19/2015 10:37:13 AM "Z:\Cover App Export\Taw Win Tun_Electrical Goods Sales & Repairing (A) -31382.jpg" 
5  | 8/24/2015 10:34:33 AM "Z:\CP1 App Export\Thiri May_Fabric Shop (B)-30646.jpg" 
6  | 8/17/2015 10:08:39 AM "Z:\CP2 App Export\Ko Tin Aung_Building Materials (B)-31300.jpg" 

मैं भी

EXEC MASTER.dbo.xp_cmdshell 'dir z: *.jpg /t:c /s' 

तरह timefield /t:c (निर्माण के समय) कुछ के साथ dir आदेश का उपयोग कर यह मेरे बनाया गया दिनांक देता है, लेकिन यह मुझे निम्न परिणाम जो के रूप में नहीं है से पता चलता की कोशिश की है अपेक्षित होना। मैं पिछले परिणाम में दिखाए गए अनुसार पूर्ण पथ/निर्देशिका नाम वाले फ़ाइल नाम चाहता हूं। किसी भी मदद की बहुत सराहना की जाएगी

myFileID | myFileName 
---------------------- 
1  | Volume in drive Z is Publication 
2  | Volume Serial Number is 3EF0-5CE4 
3  | NULL 
4  | Directory of Z:\ 
5  | NULL 
6  | 07/28/2015 06:41 PM <DIR>   . 
7  | 07/28/2015 07:06 PM <DIR>   .. 
8  | 03/05/2015 11:42 AM <DIR>   LDB1 App Export 
9  | 03/05/2015 05:31 PM <DIR>   LDB2 App Export 
10  |   0 File(s)    0 bytes 
11  | NULL 
12  | Directory of Z:\LDB1 App Export 
13  | NULL 
14  | 03/05/2015 11:42 AM <DIR>   . 
15  | 07/28/2015 06:41 PM <DIR>   .. 
16  | 07/28/2015 06:49 PM   2,981,526 Kyaw Phay_Dental Equipment (A)-30998.jpg 
17  | 08/31/2015 03:10 PM   3,126,629 Venus_Fashion Shops-31438.jpg 
18  | 07/28/2015 06:49 PM   3,544,247 Marvellous_Tourism Services-30986.jpg 
...  | ... 

अपेक्षित परिणाम, नीचे की तरह कुछ होना चाहिए

myFileID | CreatedDate   | myFileName 
---------------------------------------------- 
1  | 8/10/2015 11:24:16 AM | "Z:\LDB1 App Export\Top Star_Aluminium Frames & Furniture (B)-31267.jpg" 
2  | 8/10/2015 11:24:27 AM | "Z:\LDB2 App Export\Soe Tint_Hardware Merchants & Ironmongers-31435.jpg" 
3  | 8/12/2015 10:05:22 AM | "Z:\Cover App Export\Taw Win Tun_Electrical Goods Sales & Repairing (A) -31382.jpg" 
4  | 8/12/2015 10:05:22 AM | "Z:\CP1 App Export\Thiri May_Fabric Shop (B)-30646.jpg" 
5  | 8/12/2015 10:05:22 AM | "Z:\CP2 App Export\Ko Tin Aung_Building Materials (B)-31300.jpg" 

:)

+0

धन्यवाद संपादित :) उदासी कोई भी मेरे सवाल का उत्तर दे रहा है के लिए @marc_s: \ – kolunar

+1

आप 'बैच-file' टैग जो आप WMIC जो और अधिक नियंत्रण प्रदान करता है के साथ की कोशिश कर सकते अधिक forfiles की popular.Instead हो रहा है जोड़ सकते हैं, लेकिन मुझे एक प्रश्न बनाने के लिए कुछ समय लगेगा, – npocmaka

+0

रेफरी: डीआईआर कमांड का उपयोग करके http://superuser.com/questions/355771/windows-listing-of-files-from-command-line – kolunar

उत्तर

5

यहाँ एक तरीका है आप DIR आदेश के उत्पादन में पार्स कर सकते हैं:

--Create the table to store file list 
CREATE TABLE myFilesTable (myFileID INT IDENTITY, myFileCreateDate datetime, myFileName NVARCHAR(256)) 

--Create temporary table to store output of DIR command 
CREATE TABLE #DirectoryOutput (LineID INT IDENTITY, LineData NVARCHAR(256)) 

--Insert file list from directory to SQL Server 
DECLARE @Command varchar(1024) = 'dir z: *.jpg /t:c /s' 

INSERT INTO #DirectoryOutput 
    EXEC MASTER.dbo.xp_cmdshell @Command 

--Check the list 
insert into myFilesTable 
select 
    convert(Datetime,(left(LineData, 20))) CreateDate, 
    FilePath2.FilePath + '\' + right(LineData,len(LineData)-39) Filename 
from #DirectoryOutput 
cross apply 
    (
    select Max(LineID) LineID 
    from #DirectoryOutput FilePaths 
    where LEFT(LineData,14)=' Directory of ' 
     and FilePaths.LineID < #DirectoryOutput.LineID 
    ) FilePath1 
join 
    (
    select LineID, RIGHT(LineData, LEN(LineData)-14) FilePath 
    from #DirectoryOutput FilePaths 
    where LEFT(LineData,14)=' Directory of ' 
    ) FilePath2 
on FilePath1.LineID = FilePath2.LineID 
where ISDATE(left(LineData, 20))=1 
order by 1 

select * from myFilesTable 

GO 
+0

फाइलों की एक सूची देता है धन्यवाद, आपका उत्तर मेरी अपेक्षा के करीब है :) – kolunar

2

forfiles केवल संशोधित तिथि फिल्टर (see docs) प्रदान करता है। इसके बजाय आप PowerShell को SQL (उदा। like this) से निष्पादित कर सकते हैं और चूंकि PowerShell में बहुत अच्छे फ़िल्टर हैं, इसलिए बनाई गई तिथि (उदा। like this) के आधार पर ऐसा करना आसान होगा।

4

मैं थोड़ा निर्माण तिथि के लिए एक अलग कॉलम शामिल करने के लिए अपने टेबल बदल दिया है:

CREATE TABLE myFilesTable (myFileID   int IDENTITY 
          , myFileName   nvarchar(256) 
          , myFileCreationDate datetime 
         ) 

आप उपयोग कर सकते हैं निर्देशिका जानकारी प्राप्त करने के लिए PowerShell स्क्रिप्ट का पालन करें और इसे SQL तालिका में लिखें:

Import-Module "C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\SQLPS" -DisableNameChecking 
$files = Get-ChildItem "z:\" -Filter "*.jpg" -recurse | Where-Object { $_.CreationTime -ge "07/16/2015" } | Select-Object FullName, CreationTime 
foreach ($file in $files) 
{ 
    $creationTime = $file.CreationTime -f "dd-MM-yyyy hh:mm:ss" 
    $file.FullName = $file.FullName -replace "'", "''" 
    Invoke-Sqlcmd -ServerInstance "YourInstance" ` 
       -Database "YourDatabase" ` 
       -Query ("INSERT INTO {0} (myFileName, myFileCreationDate) VALUES ('{1}', '{2}')" ` 
          -f "myFilesTable", $file.FullName, $creationTime) 
} 

अपने इंस्टेंस नाम के साथ YourInstance मान और YourDatabase मान को अपने डेटाबेस के नाम से बदलें।

मैं दृढ़ता से xp_cmdshell का उपयोग करने की सलाह देता हूं क्योंकि यह SQL सर्वर सेवा खाते के समान सुरक्षा संदर्भ के साथ एक विंडोज कमांड खोल खोलता है। यह एक सुरक्षा जोखिम है और xp_cmdshell कमांड को अक्षम करना सबसे अच्छा है।

आप SQL सर्वर पर PowerShell कमांड को सबसे अच्छा निष्पादित कर सकते हैं। पूर्व शर्त यह है कि SQLPS मॉड्यूल उपलब्ध है (Invoke-SqlCmd कमांडलेट के लिए)। जब आप SQL सर्वर स्थापित करते हैं तो यह पूर्वापेक्षाएँ पूरी होती है।

संपादित करें:

तो अगर आप वास्तव में xp_cmdshell के माध्यम से यह करना चाहते हैं, तो आप अपने एसक्यूएल सर्वर पर PowerShell स्क्रिप्ट बचाने के लिए और यह निम्नलिखित तरीके से निष्पादित कर सकते हैं (मैं में SQLPS फ़ाइल का पथ संशोधित PowerShell स्क्रिप्ट, यह सोचते हैं आप एसक्यूएल सर्वर 2012) है:

EXEC xp_cmdshell 'powershell.exe -file "C:\FileList.ps1" -ExecutionPolicy Unrestricted' 

कहाँ C: \ FileList.ps1 अपने सहेजे गए PowerShell स्क्रिप्ट है।

+1

यदि आपको वास्तव में xp_cmdshell की आवश्यकता है, तो कृपया मुझे बताएं मैं कुछ काम करने की कोशिश करूंगा। –

+0

धन्यवाद सर, वास्तव में आपके उत्तर की सराहना करते हैं। मैं आपके स्निपेट को आजमाऊंगा, हालांकि मुझे एक और जवाब स्वीकार करना है क्योंकि सवाल पूछे जा रहे हैं कि xp_cmdshell का उपयोग विंडोज़ cmd प्रॉम्प्ट के साथ किया जा रहा है जिसे अब बाउंटी के लिए पर्याप्त उचित नहीं होने के लिए बदला जा सकता है। – kolunar

+1

मेरा जवाब संपादित किया गया है, इसलिए यह xp_cmdshell के माध्यम से काम करता है। –

1

आप @echo बंद

DECLARE @Command varchar(1024) = '@echo off 
For /f "tokens=1-6 delims= " %%a in (''dir *.png /t:c /o:d'') do (if exist %%e (echo %%a %CD%%%e))' 

करने के लिए अपने @Command बदलते हैं, तो सुनिश्चित करता है कि आदेशों प्रदर्शित नहीं होते हैं और इस लाइन एक अलग लाइन पर होना चाहिए। मैं 'साथ' को बदलकर एसक्यूएल में एकल उद्धरण से बच निकला (2 सिंगल कोट्स डबल कोट नहीं)।

Date  FileNameWithPath 
07/15/2015 [Drive]:\[Path]\image.jpg 

मुझे आशा है कि यह आपकी मदद करता है कि आप क्या जरूरत की ओर बढ़ते जाएंगे:

डॉस आदेश के बाद उत्पादन पैदा करता है।

+0

मैंने कमांड प्रॉम्प्ट में आपके आदेश को 'वाई: \> फॉर/एफ "टोकन = 1-6 delims =" %% a in (' dir * .png/t: c/o: d ') के रूप में करने की कोशिश की है (यदि मौजूद है %% ई (echo %%% cd %%% ई)) 'फिर यह दिखाता है कि इस समय '%% एक अप्रत्याशित था – kolunar

+0

याद रखें कि यह बैच फ़ाइल प्रोग्रामिंग है। कोड को बैच फ़ाइल के अंदर रखें, यानी, DirPicList.bat और यह काम करेगा। –

+0

फ़ाइल बनाने के लिए कमांड प्रॉम्प्ट पर निम्न टाइप करें DirPicList.bat: कॉपी कॉन DirPicList.bat [Enter] @echo off [Enter] /f "टोकन = 1-6 delims =" %% a में ('डीआईआर *।पीएनजी/टी: सी/ओ: डी ') करें (यदि %% ई मौजूद है (echo %%% cd %%% ई)) [Enter] [Ctrl-Z दबाएं] [Enter] संपादित करें: शामिल करें कमांड प्रॉम्प्ट से बैच फ़ाइल। –

संबंधित मुद्दे