2017-08-02 44 views
0

我想爲下面的場景創建一個批處理文件/ Windows命令:創建一個從文件名模式的文件夾和文件移動到這些文件夾

我有文件的列表文件夾中有一個特定文件說。 ... XXXX_XX 其中X大多是一個數字。 這裏的主要問題是這種模式的位置實際上並沒有固定,並且可能發生在文件名的任何地方。

例如:

這些文件名:
1. ABCD-33-21234- 4652_00 -2017-03.txt
2. SECA -11- 4652_00 -2017-03。 TXT
3. 8888 asde0-DSWC-33- 4444_55 -2016-05.txt

我需要將這些文件移動到目錄(創建他們,如果不存在)與名XXX X_XX

所以基本上我需要將其移動到文件夾爲:

.... \ 4652_00 \ ABCD-33-21234- 4652_00 -2017-03.txt
... 。\ 4652_00 \ SECA -11- 4652_00 -2017-03.txt
.... \ 4444_55 \ 8888-asde0-DSWC-33- 4444_55 -2016-05.txt

我試了很多,但無法得到解決方案。感謝你的幫助。

+0

由於[SO]不是腳本編寫服務,您應該顯示您在編碼時付出的努力,以便在遇到困難時獲得幫助。由於不存在真正的RegEx功能,因此使用'-'分隔的各種元素很難批量分析。但是你可以使用j-/vbscipt或者PowerShell。 – LotPings

回答

1

這是一個cmd行解決方案,包裝一個PowerShell一個班輪。
批量使用時,%-必須加倍%%。在我的RAM盤甲

示例輸出:

> tree /F 
A:. 
    8888-asde0-dswc-33-4444_55-2016-05.txt 
    ABCD-33-21234-4652_00-2017-03.txt 
    SECA-11-4652_00-2017-03.txt 

powershell -NoP -C "dir *.txt|where {$_.BaseName -match '-(\d{4}_\d{2})-20'}|%{MD $matches[1] -EA 0;$_|Move -Dest {$matches[1]}}" 

> tree /F 
A:. 
├───4444_55 
│  8888-asde0-dswc-33-4444_55-2016-05.txt 
└───4652_00 
     ABCD-33-21234-4652_00-2017-03.txt 
     SECA-11-4652_00-2017-03.txt 

Essential是正則表達式-(\d{4}_\d{2})-20其中圖案-xxxx_xx-20匹配並圍繞括號( xxxx_xx)標記我們感興趣的羣組。

一個更詳細的版本,而PowerShell腳本的別名:

Get-ChildItem *.txt | 
    Where-Object BaseName -Match '-(\d{4}_\d{2})-20'| 
    ForEach-Object { 
     mkdir $matches[1] -ErrorAction SilentlyContinue 
     $_ | Move-Item -Destination {$matches[1]} 
    } 
+0

在線:1個字符:49 + Dir * .pdf |? BaseName -match' - (\ d {4} _ \ d {2}) - 20'| {MD $ matches [1] -EA 0; $ _ | Move -D ... + ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~表達式只允許作爲管道的第一個元素。 + CategoryInfo:ParserError:(:) [],ParentContainsErrorRecordException + FullyQualifiedErrorId:ExpressionsMustBeFirstInPipeline – Shatir

+0

你有什麼powershell版本? '$ psversiontable' – LotPings

+0

我對PowerShell一無所知。我怎樣才能找到版本。這是主要的:3,次要的:0 – Shatir

1
@ECHO Off 
SETLOCAL enabledelayedexpansion 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*-????_??-*.txt" ' 
) DO (
SET "filename=%%a" 
SET "filename=!filename:-= !" 
SET "moved=" 
FOR %%b IN (!filename!) DO IF NOT DEFINED moved (
    FOR /f "tokens=1*delims=_" %%p IN ("%%b") DO IF "%%q" neq "" (
    ECHO MD "%destdir%\%%p_%%q" 2>NUL 
    ECHO MOVE "%sourcedir%\%%a" "%destdir%\%%p_%%q\" 
    SET "moved=Y" 
) 
) 
) 

GOTO :EOF 

你需要改變的sourcedirdestdir設置以適合你的情況。

爲了測試目的,所需的MD命令僅僅是ECHO驗證命令是否正確後,將ECHO(MD更改爲MD以實際創建目錄。附加2>nul以抑制錯誤消息(例如,當目錄已經存在時)

爲了測試目的,所需的MOVE命令僅僅是ECHO確認命令正確後,將ECHO(MOVE更改爲MOVE以實際移動文件。附加>nul抑制報告消息(例如。1 file moved

dir命令返回每個文件匹配匹配%%a,從那裏向filename文件名。

然後filename中的每個-都被一個空格替換,並且for..%%b將文件名處理爲空格分隔字符串的列表。

%%b。每一串標記化和第一字符串匹配 _ 被分配給%%p%%q。如果%%q非空,然後我們發現 _ 這樣做mdmove並設置moved標誌,以確保發現被忽略的是更多的匹配。

注意,這不會與處理情況,你有一個像東西 -abc_d-EFGH_JK-文件名東西 - 它假定所需的目標是 _ 字符串的第一次亮相這在這種情況下將是abc_d,而不是EFGH_JK。如果需要,這很容易修復。


修訂中校正的光以文件名結構(無下劃線 - 僅破折號)

@ECHO Off 
SETLOCAL enabledelayedexpansion 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\????-*-????-??-*.txt" ' 
) DO (
SET "filename=%%a" 
CALL :newname !filename:-= ! 

IF DEFINED newdir (
    ECHO MD "!newdir!" 2>NUL 
    ECHO MOVE "%sourcedir%\%%a" "%destdir%\!newdir!\" 
) 
) 

GOTO :EOF 

:newname 
IF "%5" neq "" shift&GOTO newname 
SET "newdir=%1-%2" 
IF "%newdir:~4,1%" equ "-" IF "%newdir:~7%" equ "" IF "%newdir:~6,1%" neq "" GOTO :EOF 
SET "newdir=" 
GOTO :eof 

新的代碼查找一個序列 - ???? - ?? - - 字符串並挑選其中的最後一個。

+0

謝謝。但是代碼似乎是爲目錄中的每個文件創建一個與該文件名稱相同的文件夾,而不是將它們分組到文件夾中。 – Shatir

+0

請提供示例。代碼'回聲'正確的創作和移動給我。 – Magoo

+0

也許這與文件名實際上有更多下劃線(_)而不是破折號( - ) – Shatir

相關問題