[英]Batch file variable filenames and editing
這是游戲的新手,並花了許多時間尋找幫助和示例。 盡管我想通過使用單個輸入文件'computer_listc.txt'來簡化此過程,但我已經有了一個可以正常工作的版本。 我基本上想讀取一系列文件夾路徑(來自computer_listc.txt),並使用路徑的一部分來編寫其他cmd表達式。
我的問題是fname和comp_id的設置不正確。 我想使它們等於T(文件名),然后對其進行編輯。
fname必須是已刪除前12個字符的文件路徑。 當comp_id需要等於文件路徑中指定的計算機名時,例如
fname = c_modelling\model\slave1
comp_id = VOSTRO460-1
這是腳本。 你能看到我的錯誤嗎?
for /f "usebackq tokens=*" %%T in ("C:\c_modelling\Model\cal21_cal\Computer_ListC.TXT") do (
set fname = %%T
ren fname "%fname%" "C:\%fname%:~12%"
set comp_id = %%T
%comp_id% = %{comp_id:0:12}
mkdir %%T > NUL 2>&1
echo cd %fname% >\\%%T\beo_insC.cmd
echo beo >>\\%%T\beo_insC.cmd
robocopy c:\c_modelling\model\cal21_cal \\%%T\ /s /e
start cmd.exe /c psexec \\%comp_id% -c c:\c_modelling\model\cal21_cal\beo_insC.cmd
del \\%%T\beo_insC.cmd
)
Computer_ListC.txt包含以下文件名:這最終將具有一長串計算機文件夾路徑。
VOSTRO460-1\c_modelling\model\slave1
VOSTRO460-1\c_modelling\model\slave2
我正在創建一個* .cmd文件以與“ psexec”一起使用,因為當我將進程定向到本地計算機時,該路徑默認為\\ system32。
任何幫助都將非常有幫助!
第一個問題是字符串SET
語句中的空格很重要。 變量名和分配的值都將包含任何空格,因此set fname = %%T
將設置一個名為"fname "
而不是"fname"
的變量-其值將包含%%T
值之前的前導空格
接下來是永久的延遲擴展問題。 在一個block
(帶括號的語句序列)內,任何%var%
都將在PARSE時被其值替換-在循環開始執行之前。
要訪問RUN-TIME值,您需要執行SETLOCAL ENABLEDELAYEDEXPANSION
語句,並在調用delayedexpansion
!var!
訪問RUN -time變量值。
但是請注意,您不能在有罪不罰的循環內簡單地調用delayedexpansion
。 一次可以打開的數量是有限制的,因此您需要使用ENDLOCAL
命令“將括號ENDLOCAL
(達到邏輯End-Of-File等效於ENDLOCAL
),缺點是ENDLOCAL
可以恢復調用匹配的SETLOCAL
時將環境恢復為其值。 因此,通常在批處理開始時(通常在@echo off
之后)執行SETLOCAL ENABLEDELAYEDEXPANSION
下期是
ren fname "%fname%" "C:\%fname%:~12%"
重命名命令的語法為ren sourcename newname
恰好兩個參數,將任何包含空格的參數括在"rabbit's ears"
此外,目標名稱僅是NAME-而不是路徑。
然后是這個:
%comp_id% = %{comp_id:0:12}
假設您已修復此問題以刪除變量名中的空格,並且已為comp_id
分配了值fred
並且您已經意識到您正在處理comp_id
的RUN -time值,那么現在將顯示為
!comp_id!=%{comp_id:0:12}
批處理將解釋為
fred=%{comp_id:0:12}
並及時放棄。
您可能期望做的是
set comp_id=!comp_id:~0,12!
也就是說,從第一個字符( 0
)到12
字符,將comp_id
設置為comp_id
的運行時值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.