2013-01-04 78 views
2

我正在創建一個將在服務器上運行的GPO。 在批處理中,我設置了變量SourcePath=%~0\..,該變量很好地允許我從批處理本身運行的位置訪問文件。將值存儲在批處理文件中的問題

%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion 
set /p filever= < fileversion 

此代碼工作得很好,以檢查文件file.exe把它變成fileversion的版本。 fileversion然後被讀入變量filever

所以這段代碼做了我希望它做的一切,但有一個問題。在GPO文件夾(%sourcepath%)中創建一個名爲fileversion的文件。除非多臺服務器同時執行批處理,否則它們都會好起來,但它們都將嘗試同時創建該文件,並且可能會覆蓋該文件或導致錯誤。一旦將該值讀入變量filever中,就不再需要該值,但將其刪除是不夠的,因爲兩個系統應該能夠同時執行腳本。

是否有另一種方法將值捕獲到一個不會有這個問題的變量?我想在fileversion之前放置一個本地路徑,所以它存儲在本地,但我不喜歡這個選項。

回答

1

不要使用文件,然後使用FOR /F循環直接讀取命令的輸出。下面是一個例子:

FOR /F "delims=" %%L IN (
    '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion' 
) DO (
    SET "filever=%%L" 
) 

單引號表示一個命令來運行和讀取的輸出。在運行該命令後,其輸出由循環逐行迭代。

如果輸出只包含一行,上面的內容就足夠了:變量被賦值並且循環終止。如果可能有更多的行(並且只想記住第一個行,並且防止其他行覆蓋第一個值),則至少有兩個選項:

1)僅在變量尚未存在時才存儲該值設置(定義):

SET filever= 
FOR /F "delims=" %%L IN (
    '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion' 
) DO (
    IF NOT DEFINED filever SET "filever=%%L" 
) 

請注意,該變量需要先取消設置(第一行)。

2)存儲的值和跳躍外循環:

FOR /F "delims=" %%L IN (
    '%sourcepath%\Sigcheck\sigcheck.exe /accepteula -q -n "c:\path\file.exe" >fileversion' 
) DO (
    SET "filever=%%L" 
    GOTO out 
) 

:out 

這會記住的第一行和退出循環力,以防止過其他行迭代。

您可以在內置幫助(FOR /?HELP FOR)中瞭解更多關於FOR /F循環的信息。