2016-08-12 48 views
1

變量我有一個問題如何設置多個文件作爲批處理文件變量?我試圖做一些下面的腳本:設置文件名作爲批處理文件

move c:\*.gpg q:\ 
for %%F in ("q:\*.gpg") do (set file=%%~nxF) 
if exist q:\*.gpg echo done copying files: %file% 

以上正常工作只有一個文件。如果有超過兩個,它只會迴響其中一個。如何在一行中回顯所有複製的文件?

+2

首先,你應該組中的兩個你的命令:'set'和'if'在同一個塊(既每個'for'迭代執行)。其次,它似乎是一個[延遲擴展](http://ss64.com/nt/delayedexpansion.html)問題。檢查[這篇文章](http://stackoverflow.com/questions/10558316/example-of-delayed-expansion-in-batch-file)或[這一個](http://stackoverflow.com/questions/22278456/啓用 - 禁用 - 延遲 - 擴展 - 它做了什麼)(或_Google_ing顯示的其他許多人)。 – CristiFati

回答

1

有多個問題與您的代碼

for %%F in ("q:\*.gpg") do (set file=%%~nxF) 
if exist q:\*.gpg echo done copying files: %file% 

首先,你要指定新值變量文件中的每個循環,然後每一次覆蓋它沒有做任何事情。因此,在循環後file將只包含在最後一個循環的價值。移動echo部分內環路,而不是

另一個問題是變量在默認情況下,分析時展開。您需要enable delayed expansion和使用!代替%,使其在運行時

Setlocal EnableDelayedExpansion 
for %%F in ("q:\*.gpg") do (
    set file=%%~nxF 
    echo done copying file: !file! 
) 

擴大如果你想呼應一次,然後所有文件設置file變量包含的文件列表

for %%F in ("q:\*.gpg") do (
    set file=!file!, %%~nxF 
) 
echo done copying files: %file% 

的檢查文件存在是多餘的。移動後可以檢查退出代碼,如果文件沒有移動,可以退出。

0

的變量是不恆定所以記得要激活擴張延遲變量,這裏的變量file的擴大必須延遲。

延遲擴展將導致變量在執行時,而不是在分析時被擴展,這個選項是打開與SETLOCAL命令。當延遲擴展是有效的變量可以使用!variable_name!(除了正常%variable_name%)引用

延遲與FOR循環工作時,通常爲整個FOR變量擴展通常是有用即使循環跨越批處理腳本的多行,循環也會被評估爲單個命令。 這是一個FOR循環的默認行爲:

例子:

@echo off 
setlocal 
:: count to 5 storing the results in a variable 
set _tst=0 
FOR /l %%G in (1,1,5) Do (echo [%_tst%] & set /a _tst+=1) 
echo Total = %_tst% 


C:\> demo_batch.cmd 
[0] 
[0] 
[0] 
[0] 
[0] 
Total = 5 

注意,當FOR循環結束,我們得到正確的總,所以變量正確遞增,但在循環 的每次迭代期間,變量被卡在它的初始值0處0

EnableDelayedExpansion相同的腳本,給出相同的最終結果也顯示中間值:

@echo off 
setlocal EnableDelayedExpansion 
:: count to 5 storing the results in a variable 
set _tst=0 
FOR /l %%G in (1,1,5) Do (echo [!_tst!] & set /a _tst+=1) 
echo Total = %_tst% 

C:\> demo_batch.cmd 
[0] 
[1] 
[2] 
[3] 
[4] 
Total = 5 

注意內部的for循環,我們使用!variable!,而不是%variable%

而且你的批處理腳本可以寫成這樣:

@echo off 
Set "Ext=*.gpg" 
set /a Count=0 
Setlocal EnableDelayedExpansion 
for %%F in ("q:\%Ext%") do (
    SET /a Count+=1 
    set "file=%%~nxF" 
    echo Done copying file [!Count!] : !file! 
) 
SET /a "COUNT_TOT=%Count%" 
ECHO. 
ECHO Total of [%EXT%] files(s) : %Count% file(s) 
pause