2015-01-31 193 views
0

我正在嘗試編寫一個腳本,該腳本搜索特定類型的文件的目錄,然後在命令中使用該文件。 .bat文件是從cmd執行的,並且該目錄作爲參數傳遞。CMD執行BAT執行CMD

@echo off 
setlocal enableextensions enabledelayedexpansion 

set real_parent_path_unformated=%1% 
set real_parent_path=!real_parent_path_unformated:%%20= ^%! 

for /R "%real_parent_path%\" %%S in (*.pts) do (
    set /a ptscount+=1 
    set ptsfile=!ptsfile! "%%S" 
    if !ptscount!==1 (
     START "run PTGUI" /wait cmd.exe /c "S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe -batch -x !ptsfile!" 
     set ptscount=0 
     set "ptsfile=" 
    ) 
) 
exit 

real_parent_path_unformated =從服務器

real_parent_path =目錄通過與%% 20目錄中刪除

ptsfile =完整的文件路徑例如從日誌:

「S:\生產\來電\ CHI_TEST_City_Newsstand_4018_North_Cicero_Avenue_60641 __ \ PANO_ \ 1 \ RAW \ DSC_0529_PANORAMA.pts「

但是,程序沒有執行,給我這個錯誤:

SHGetFolderPath失敗:指定的路徑無效。 (0xa1)

任何幫助將不勝感激!

+0

你確定這會產生所需的結果:set real_parent_path =!real_parent_path_unformated:%% 20 = ^%!'。你能迴應'!real_parent_path!'並看看它是否正常嗎? – npocmaka 2015-01-31 20:53:33

回答

0

出於某種原因,您向我們提供了一條不包含潛在目標字符串替換的路徑(「%% 20」,「%20」或空間),我們已經不知道你是否將該字符串提供給「引用」的過程,或者你只是簡單地採取了the actual string you are passing並且引用它以優先考慮它。

所以 - 一些猜測。

set real_parent_path_unformated=%1% 

終端%不正確。參數n被稱爲%n。如果您想刪除密封報價,請使用~n

批次對SET語句中的空格敏感。 SET FLAG = N設置一個名爲「FLAG 空間」變量的「空間 N」

語法SET "var=value"(其中值可以是空的)用於確保任何雜散尾部空格不包括在所述值的值分配。 set /a可以安全地使用「無引號」。

在代碼中,你可能會被設置的報價爲價值一部分被分配因此,如果real_parent_path包含"a big string"然後

for /R "%real_parent_path%\" %%S in (*.pts) do (

將被解釋爲

用於/ R值(* .pts)do(

「這是一個很大的字符串」\「%% S,它可能會或可能不會提供錯誤,它在您的機器上,而不是我的機器上,因此測試只能在理論上進行。

接下來的問題是

set real_parent_path=!real_parent_path_unformated:%%20= ^%! 

對於上述原因,這是更好,因爲

set "real_parent_path=!real_parent_path_unformated:%%20= ^%!" 

但你代什麼什麼還不清楚。

  • %逃脫%所以%%成爲%
  • ^不逃避%

這是完全OK使用空間在字符串替換命令,如果這就是你想要的。

最後,它可能是ptsfile本身包含處理後的引號,所以"cmd /c...!ptsfile!" would result in「cmd /c..."contents_of_variable_ptsfile」「 - 可能不是你想要的。

START "run PTGUI" /wait "S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe" -batch -x !ptsfile! 

(其中圍繞S:\Production\CrushFTP7_PC\modules\PTGUI\ptgui.exe引號是可選的,因爲該字符串中沒有分隔符)應該執行必要的程序。