2017-07-26 55 views
2

我試圖教自己足夠的PowerShell或批處理編程,想要實現以下目標(我已經搜索並瀏覽了幾個小時的Youtube教程,但可以' t完全把它拼湊在一起,找出我需要的東西 - 例如,我沒有獲得令牌,但它們在For循環中似乎是必需的)。另外,不確定下面是否最好通過robocopy或xcopy來實現。從網絡位置複製列表中定義的文件

任務:

定義文件的列表以CSV檢索(文件名稱將被列爲13位號碼,分機將是未知的,但通常是.JPG,但有時可能會被png格式 - 這可以用通配符來實現)

名單將讀取類似:?

9780761189931 
9780761189988 
9781579657159 

對於這個文本文件中的每一行,這樣做:

搜索一個網絡文件夾和所有子文件夾

如果找到確切的文件名,複製到任意目標(比如在桌面上創建一個新的文件夾)

(不是100%必要的,但最好有)一旦For循環已完成,輸出複製到一個文本文件中的新創建的目標文件夾中的文件列表

據我瞭解,我也許需要做兩件事第一,像定義源和目標變量文件夾?我在其他地方發現了下面的內容,但無法完全理解它。

set src_folder=O:\2017\By_Month\Covers 
set dst_folder=c:\Users\%USERNAME&\Desktop\GetCovers 
for /f "tokens=*" %%i in (ISBN.txt) DO (
    xcopy /K "%src_folder%\%%i" "%dst_folder%" 
) 

在此先感謝!

回答

0

順便說一句,這個解決方案在powershell中。

要獲取文件夾的所有子文件,請使用Get-ChildItem和管道,然後可以將名稱與CSV的內部進行比較(順便提一下,您可以使用import-CSV獲得該名稱)。

Get-ChildItem -path $src_folder -recurse | foreach{$_.fullname} 

我個人則用一個函數來編輯的字符串名字,但我知道這可能不是做的最好的方式。管道之外創建一個功能,並將它以這樣一種方式,你可以繼續前行這樣返回修改後的路徑:

Get-ChildItem -path $src_folder -recurse | foreach{$_.CopyTo (edit-path $_.fullname)} 

其中「編輯目錄」是你的函數,它的路徑,並修改它以返回目標路徑。另外,你也可以使用robocopy或xcopy來代替CopyTo,但是Copy-Item是一個本地powershell,不需要太多的字符串操作(在我的經驗中,越少越好)。

編輯:下面是可以做的伎倆功能:

function edit-path{ 
Param([string] $path) 
    $modified_path = $dst_folder + "\" 
    $modified_path = $path.substring($src_folder.length) 
    return $modified_path 
} 

編輯:下面是如何從CSV進口集成,使副本只發生於寫在CSV文件(這是我剛走出去,哎呀呀):

$csv = import-csv $CSV_path 
Get-ChildItem -path $src_folder -recurse | where-object{$csv -contains $_.name} | foreach{$_.CopyTo (edit-path $_.fullname)} 

請注意,你必須把整個CSV路徑在$ CSV_path變量,取決於如何該文件的內容寫入,您可能需要使用$ _。全名或其他參數。

0

這似乎是一個平均足夠的問題:

$Arr = Import-CSV -Path $CSVPath 

Get-ChildItem -Path $Folder -Recurse | 
    Where-Object -FilterScript { $Arr -contains $PSItem.Name.Substring(0,($PSItem.Length - 4)) } | 
    ForEach-Object -Process { 
    Copy-Item -Destination $env:UserProfile\Desktop 
    $PSItem.Name | Out-File -FilePath $env:UserProfile\Desktop\Results.txt -Append 
    } 

我不是偉大的字符串操作,因此串位是有點混亂,但這裏的一切都列明。