iT邦幫忙

0

透過命令提示字元抓取檔案

現在碰到一個問題,想透過命令提示字元CMD或Powershall抓取某特定資料夾得檔案

舉例:

資料夾
\Test\A\01.txt~100.txt
\Test\B\01.txt~100.txt
\Test\C\01.txt~100.txt
\Test\D\01.txt~100.txt
\Test\E\01.txt~100.txt

希望實現的功能是跳出一個輸入視窗讓我輸入起始B,結束D,然後分別把B,C,D資料夾內得第75.txt複製到

\Test-backup\B\75.txt
\Test-backup\C\75.txt
\Test-backup\D\75.txt

不知道有沒有高手有類似經驗?

謝謝

小魚 iT邦研究生 2 級 ‧ 2018-01-18 12:02:59 檢舉
複製貼上改關鍵字...
要不然自己寫個程式...
批次參數定義好就能做了
haoming iT邦好手 1 級 ‧ 2018-01-18 14:42:54 檢舉
我覺得用bat做好像有點困難, 不知道怎麼判斷 A..D
0
tyudfg1682
iT邦新手 4 級 ‧ 2018-01-18 22:38:32
最佳解答

不是很懂你的問題,不過查詢與選擇Powershell綽綽有餘,微軟開發給IT管理的語言沒這麼爛

只是有沒有用過而已,我不是很清楚你的問題,所以我把指令給你,你要自己GOOGLE去看說明

自己本身就在用Powershell工作

1.查詢資料夾或檔案:用 Get-ChildItem 這個指令,請記得丟到變數去存檔,方便過濾跟處理

微軟 https://technet.microsoft.com/zh-tw/library/hh847897.aspx

2.輸入視窗用的話,底下只是其中一種方法,呼叫VB創造一個視窗物件而已
打開Powershell,一行一行輸入
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$title = 'IT 服務表單'
$msg='請輸入內容:'
$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

3.複製資料用: robocopy 這個請GOOGLE 很多人的部落格有寫 不然你就打開Powershell
敲這個指令: robocopy /? | out-file D:\robocopy.txt
到D磁碟去找robocopy.txt文字檔看吧


你如果沒一點程式底的話,你應該很難完成你想要的,不然你就要再補上清楚一點的描述

你問題裡面提到的希望跳出視窗輸入起始B結束D,是指依造輸入的內容去找檔案嗎?

那打算要輸入幾次? 輸入1次? 輸入10次? 輸入100次? 還是一個視窗多行輸入?

把下面的指令複製後,貼到Powershell去執行看看,這是可以用來選擇的表單之一

@(0..100) | Out-GridView -PassThru -Title "請選擇一個數字" | ForEach-Object {$temp00=$_};(New-Object -ComObject WScript.Shell).popup("您選擇的數字為:$temp00",0,"系統服務",3+32)

我本身用Powershell指令工作也不過1年多而已,多GOOGLE你會發現一片天,不過要有時間。

看更多先前的回應...收起先前的回應...
froce iT邦研究生 5 級 ‧ 2018-01-19 09:28:37 檢舉

powershell的中文資源其實蠻少的,看英文的比較多。
我深深覺得台灣的MIS其實很強,居然能用bat做到大部分的事。我個人是絕對做不到。

powershell真的很強大,還可以call .net framework的物件,對於管理windows真的是神器。

感謝您的說明,我會朝這麼方向努力:)

一年前我在摸索可以用來管理Windows系統用的程式的時候,也是用CMD傳統的命令提示字元工作,後來用了快半年覺得應該要朝向新的語言邁進才行,因為這個CMD實在太古老了,有些管理工作現在找到的都是要用Powershell才行。

不過Powershell做為新的管理用程式,在中文化的市場上一直沒有很熱門,所以中文的資源非常少,很多我都是用中文翻譯成英文去找資源,中文最多資源的還是在微軟自己的論壇上或者是中國那邊的部落客,不過靠著現在GOOGLE的線上翻譯,大多英文翻譯過後都有辦法慢慢看得懂,就算看不懂你自己看著程式碼去敲去看他回應了什麼內容給你 你大概也可以慢慢弄懂這些指令在做什麼。

蟹老闆 iT邦大師 1 級 ‧ 2018-01-20 04:53:31 檢舉

這點工作還用不到牛刀,老人家還是可以很好的工作,。
如要正式運作請將

call,Echo Copy 某路徑\%%Str:~%%i,1%%\%FileName% \Test-backup\%%Str:~%%i,1%%\

Echo去除並將某路徑改成正確位置

@Echo off
SetLocal ENABLEEXTENSIONS
:Head
Cls
Set Str=ABCDEFGHIJKLMNOPQRSTUVWXYZ
Echo 選擇開始的資料夾
Choice /C %Str%
Set /A Start=%Errorlevel%-1
Call,Set End=%%Str:~%Start%,26%%
Set /A Start=%Start%
Echo 選擇結束的資料夾
Choice /C %End%
Set /A Ending=%Errorlevel%+%Start%-1
Set /P FileName=輸入檔名:
If "%FileName%"=="" Echo 未輸入檔名&Pause&Goto :Head
For /L %%i in (%Start%,1,%Ending%) Do (
    call,Echo Copy 某路徑\%%Str:~%%i,1%%\%FileName% \Test-backup\%%Str:~%%i,1%%\
)

我知道CMD的指令庫還是可以做到這些,抓檔案這種絕對沒問題。

1
runan5678
iT邦新手 2 級 ‧ 2018-01-18 14:58:08

powershll我的經驗會使用

  1. copy-item複製檔案
  2. Test-Path確認檔案是否存在及複製檔案後確認是否成功
  3. 可能會需要New-Item的指令建立資料夾
  4. 至於起始和結束點的判斷我會利用array寫死在script裡面
    例如: $a={'A','B','C','D','E'},讀取a{1}時,值會是A
    做個迴圈應該就行了
    5.跳視窗輸入不會用,但在執行powershell時可以傳參數處理

以上供做參考

froce iT邦研究生 5 級 ‧ 2018-01-18 15:30:16 檢舉

起始和結束點可以透過強制轉換成大(或小)寫,然後用

[int][char]'字母'

來得到ascii code來做迴圈。

runan5678 iT邦新手 2 級 ‧ 2018-01-18 16:39:48 檢舉

轉ASCII Code是個好方法,不過真實的資料夾名稱可能沒那麼單純
也可以建csv檔案維護,然後用Import-csv方式處理

看起來似乎不是這麼簡單可以實現這個想法,我再找找資源

0
ali
iT邦新手 4 級 ‧ 2018-01-18 19:25:11

可以用 PHP 寫 command-line 程式,讀取參數,驗證參數,然後做你想做的事情。

在 Windows 環境下,或在 Linux 環境下都可以做。

建議在 Linux 環境下做比較快而且簡單方便,不用去處理 Windows 路徑中的斜線跳脫。

froce iT邦研究生 5 級 ‧ 2018-01-19 09:30:50 檢舉

用php的話不如用python,反正都要裝環境,python裡的 os.path 在處理路徑的時候還會自動判別OS,對斜線去做正確的處理。

ali iT邦新手 4 級 ‧ 2018-01-23 11:16:48 檢舉

謝謝提供 python 知識。又長知識了,謝謝。

0
何必問
iT邦好手 3 級 ‧ 2018-01-18 21:51:00

DOS

@tree d:\test
@set a=
@set /p a=輸入指定目錄執行複製 1.txt 檔案(以空格方式區別 ig. a b d)
@set b=(%a%)
@for %%i in %b% do @copy d:\test\%%i\1.txt d:\testbackup\%%i\

我要發表回答

立即登入回答