我以為這很簡單,但它似乎比我想像的更具挑戰性。
我想要複製並貼上一個文件並附加時間戳。我使用以下程式碼獲取時間戳:
set hournum=%time:~0,2%
if %hournum% gtr 9 (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%h%time:~3,2%m%time:~6,2%s) else (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%h%time:~3,2%m%time:~6,2%s)
Set FileAffected=%1
echo %FileAffected:~0,-1%%timeback%
這將使該文件FILE.TXT
成為FILE.TXT_2015-03-05_11h56m32s
但我顯然希望它是FILE_20150305_11h56m32s.TXT
檔案副檔名可以是任何副檔名或任何長度。謝謝你的幫忙。
編輯:FileAffected 是用引號傳遞的,所以我只是用 ~0,-1 刪除它們。
我確實發現如果我這樣做:
FOR /f %%i IN (%FileAffected%) DO (
ECHO filename=%%~fi
ECHO fileextension=%%~xi
)
如果我回顯 FileAffected,我會得到帶有空格的完整路徑名。但如果我使用 FOR /F 命令,檔案名稱會截斷空格後的任何內容。即使在“IN”命令中向“%FileAffected”變數添加額外的引號,仍然無法解決問題,在 fi 或 xi 周圍添加引號也無法解決問題。
答案1
如何將日期和時間作為後綴添加到檔案名稱中?
使用以下批次檔:
@echo off
set hournum=%time:~0,2%
if %hournum% gtr 9 (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%h%time:~3,2%m%time:~6,2%s) else (set timeback=_%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%h%time:~3,2%m%time:~6,2%s)
echo %~n1%timeback%%~x1
輸出:
F:\test>test file.txt
file_3/01_18h07m40s.txt
例如,如果您的檔案名稱包含空格,file with space.txt
那麼您需要稱呼"
文件名周圍帶有 s 的批次文件,如下所示:
F:\test>test "file with space.txt"
file with space_3/01_18h07m56s.txt
參數擴充
%~n1
將 %1 展開為不含檔案副檔名 C:\utils\MyFile 的檔案名,或如果僅存在路徑(不含尾部反斜線)- 此路徑中的最後一個資料夾。
%~x1
僅將 %1 擴展為檔案副檔名 - .txt
使用“雙引號
如果單一參數包含空格,您仍然可以透過用「引號」括起來將其作為一項傳遞 - 這對於長檔名非常有效。
如果使用參數來提供以下檔案名稱:
MyBatch.cmd "C:\Program Files\My Data File.txt"
此參數將是:
%0 = 我的批次
%1 = "C:\Program Files\我的資料檔.txt"
進一步閱讀
- Windows CMD 命令列的 AZ 索引- 與 Windows cmd 行相關的所有內容的絕佳參考。
- 參數- 命令列參數(或參數)是傳遞到批次腳本中的任何值。
- 句法- 轉義字元、分隔符號和引號。