iT邦幫忙

1

MS-DOS command如何取得檔案路徑並設定為變數

Hi各位大大,

想請問如何寫batch能夠取得某個檔案存在的路徑,然設定為變數?
用where可以取得路徑,但也會取得檔案名稱,希望有大大能夠傳授只取得路徑的指令!

感謝。

eigen iT邦新手 1 級 ‧ 2017-12-14 13:03:19 檢舉
基本上你要用的檔案,你應該要明確知道檔案在那~~~
不知道的情況下,用尋找的,『很佔資源』,你不會想這樣寫BAT

結果跑起來很花時間。 個人會建議將 所有可能的位置列出來,然後再檢查檔案是否存在。這樣比較快

EX: PROGRAM FILES 的程式,就有可能出現在兩個目錄目 (X86 或 64 位元)
nobi30072 iT邦新手 5 級 ‧ 2017-12-14 22:44:21 檢舉
檔案的位置是知道的, 但是因為每次會因為不同的情況, 位置稍微有變化, 如果列舉出來的話可能也不清楚所有可能的路徑, 所以才想用變數的方式去對應每次不同的路徑。
cancelpc iT邦新手 4 級 ‧ 2017-12-15 08:47:04 檢舉
看看 https://ss64.com/nt/syntax-args.html
我大部分都用 batch 完成所有的工作。
找檔案其實用 Dir 很快,檔案系統本身就有 index。

如:
@echo off
setlocal

rem
rem 刪除過期的(只保留5筆最新的)
rem
for /f "skip=5" %%a in ('dir /B /O:-N C:\Apps\WMContact\Data\*_FP.txt') do (
echo 刪除 %%a...
del /Q C:\Apps\WMContact\Data\%%a
)


rem 刪目錄: dir /A:D /B /O:-N
for /f "skip=5" %%a in ('dir /A:D /B /O:-N "W:\TEMP\synoreport\Duplicate File\*.*"') do (
echo 刪除 %%a...
rd /S /Q "W:\TEMP\synoreport\Duplicate File\%%a"
)

endlocal
2
haoming
iT邦好手 1 級 ‧ 2017-12-14 11:06:56
最佳解答

這個問題不錯唷,試試看以下方法:

最後的 _name 就是你要的變數

@echo off
:: set path as variable
:: haoming --2017-12-14 09:42:08

set theFile=20171211084103-0001.pdf
set _name=

echo before: %_name%

setlocal enableDelayedExpansion
for /f %%G in ('forfiles /s /m %theFile% /c "cmd /c echo @path"') do (
    set _name=%%G
    
)

echo after: %_name%
endlocal

本來想直接在 forfiles 裡面接set , 但好像沒辦法這樣做。
所以多包一層。

參考這篇改的:

https://superuser.com/questions/1014835/variable-for-getting-absolute-path-in-windows-batch-script

nobi30072 iT邦新手 5 級 ‧ 2017-12-14 23:09:28 檢舉

感謝大大, 試用後真的可以達成需求!!!/images/emoticon/emoticon41.gif

0
兩津勘吉
iT邦新手 5 級 ‧ 2017-12-14 08:51:58

@Echo Off
CD C:\Windows\System32
Echo %CD%
--顯示結果--
C:\Windows\System32

nobi30072 iT邦新手 5 級 ‧ 2017-12-14 09:18:41 檢舉

抱歉, 需求沒有說清楚。
目前知道檔案名稱是123.exe, 路徑不知道(也有可能case by case變化)
比方說是C:\123\123\123\123.exe
或是C:\123\456\123\123.exe

所以想知道有沒有辦法用cmd找到123.exe的檔案路徑(最好能因應每次變化取得正確路徑), 然後將路徑設為變數

後續可以利用變數去執行123.exe

感謝!!

需求還是很亂,為何路徑每次都會不同?有自己先寫好的虛擬碼嗎...
如果你確定檔案名稱都會是固定,就是加個迴圈去找,但這樣浪費效能,所以先說說為何路徑為何每次都要不同

nobi30072 iT邦新手 5 級 ‧ 2017-12-14 22:37:50 檢舉

用途主要是會將zip解壓縮, 不過壓縮包的名稱不固定, 所以解壓縮後的資料夾名稱不定, 導致要尋找壓縮包中的exe時, 檔案路徑是不固定的。不過第一層路徑是固定的, 因為有用7za解到固定的資料夾中。

WilliamHuang
iT邦研究生 1 級 ‧ 2017-12-14 09:25:06
【**此則訊息已被站方移除**】
0
Daniel
iT邦新手 2 級 ‧ 2017-12-14 11:15:22

試試看這個,PowerShell 的方式,$myDirectory 就是你要的答案了
$env:SystemRoot 改成你可能放檔案的最上層目錄名稱
notepad.exe 改成你的檔名

$myDirectory = Get-ChildItem $env:SystemRoot -Include "notepad.exe" -Recurse -ErrorAction SilentlyContinue | % { $_.DirectoryName }
nobi30072 iT邦新手 5 級 ‧ 2017-12-14 22:33:55 檢舉

請問Powerhell的話前頭須設定ExecutionPolicy對吧? 謝謝。

Daniel iT邦新手 2 級 ‧ 2017-12-15 10:28:26 檢舉

是,一般推薦使用 RemoteSigned。

我要發表回答

立即登入回答