2015-02-17 145 views
1

我已經設置了一個默認打開.txt文件的批處理文件。在之前的問題中,我發現%1給出了實際調用批處理文件的文件的路徑。問題是:如果文件名包含空格,它將被解釋爲多個參數。批處理%1用空格獲取路徑

實施例:

開口文件 「C:\ Users \用戶桌面\空間true.txt」

%1給出: 「C:\ Users \用戶桌面\空間」,然後%2給出:「true.txt」

我怎麼能得到公正的名稱和空白完整的文件路徑,但不嘗試做一個循環,試圖通過合併%1%2%3%獲得的完整路徑4 ...

UPDATE -----------------------

對不起,有一個錯過的溝通。下面的代碼正在工作。訣竅是把「%*」,而不是「%1」

這裏的代碼:

@echo on 
set var= "%*" 
c: 
cd "C:\Users\MyText Editor" 
start javaw -jar "MyTextEditor.jar"%var% 
pause 

我做整體改變路徑,因爲文件,我雙擊與該批次文件在不同的目錄中。我不得不改變它。

更新2 --------------------------

這工作對我最好的解決方案是從這個罰款紳士dbenham。

@echo off 
pushd "C:\Users\MyText Editor" 
start javaw -jar "MyTextEditor.jar" %* 

唯一的抱怨我已經是,有一個情況下,如果%*不返回引號的路徑。所以我正在尋找最終解決方案。像這樣的"%~*"但這不起作用。

在此先感謝

+0

那麼讀完我的答案吧。它解釋了爲什麼它不起作用。 – Serenity 2015-02-18 02:57:18

回答

0

以下是不完全正確 - 我以爲文件關聯會把引號將文件名像拖放一樣。但是我錯了

此行是你的問題的根源:

set var= "%*" 

當文件拖動到你的批處理腳本,或者如果一個文本文件被雙擊,任何文件名(S)包含空格將自動包含在引號內。

當您添加自己的附加引號時,它會打敗引號的用途 - 空格不再被引用。

例如,像"name with space.txt"這樣的字符串被視爲單個arg,但添加了引號後,""name with space.txt""變爲三個參數。

有沒有必要爲您的var變量。您可以直接在您的START命令中使用%*

@echo on 
pushd "C:\Users\MyText Editor" 
start javaw -jar "MyTextEditor.jar" %* 
pause 

我不確定上面的工作是否正常,如果多個文件傳遞。我懷疑你可能想要以下內容:

@echo on 
pushd "C:\Users\MyText Editor" 
for %%F in (%*) do start javaw -jar "MyTextEditor.jar" %%F 
pause 

有一個潛在的問題。 Windows有一個錯誤,即包含&的文件名不會自動引用。有關更多信息,請參閱"Droplet" batch script - filenames containing ampersands

編輯 - 下面應該工作

OK,我做了一些測試,我相信你最好的選擇是修改與.txt文件相關聯的命令。

我通過命令行測試了關聯的變化。這必須通過具有管理權限的提升命令提示符完成。在我的機器上,我進入開始菜單,點擊「所有程序」,點擊「附件」文件夾,右鍵點擊「命令提示符」,選擇「以管理員身份運行」,然後點擊「是」對系統的改變。

下面的命令會顯示文件類型需要修改

assoc .txt 

在我的機器它報告.txt=txtfile,所以txtfile就是必須用FTYPE進行修改。

我認爲以下應爲你工作:

ftype txtfile="C:\pathToYourScrpt\yourScript.bat" "%1" 

很明顯,你需要的路徑解決您的批處理腳本:-)

一旦你做出的改變,文件名會自動每次通過文件關聯調用腳本時都要引用它。

你的批處理腳本就可以如下所示,它應該工作,不管它是如何調用(除拖放含有&文件名,但沒有下降空間):

@echo off 
pushd "C:\Users\MyText Editor" 
for %%F in (%*) do start javaw -jar "MyTextEditor.jar" %%F 

在我看來,你應該能夠消除批處理腳本並配置FTYPE TXTFILE來直接打開你的java編輯器。我應該這樣想:

ftype txtfile="c:\pathToJava\javaw.exe" -jar "C:\Users\MyText Editor\MyTextEditor.jar" "%1" 
+0

謝謝你的回答。你在我有機會更新操作之前發佈了。我需要的修復只是「%*」。但正如你所說,我發現,將文件拖放到批處理時,引號實際上混淆了所有內容。但是,當正常打開時,%*返回沒有引號的路徑,所以我需要它們。那麼我看到「%〜1」修復了報價問題,但是我無法得到「%〜*」的工作...我必須將它傳遞給臨時變量,因爲批處理文件和實際.txt文件在不同的目錄中。 – Haeri 2015-02-17 23:39:53

+0

好的。好吧,我印象深刻。您的代碼工作得很好,除了:%*不帶引號只有在將.txt文件拖放到批處理文件時纔有效。如果我雙擊.txt,那麼路徑字符串不包含引號,這會引起java的混亂。我看到一個簡單的「〜」就像「%〜1」可以解決這些問題,但這不適用於「%〜*」。任何想法? – Haeri 2015-02-17 23:55:56

0

當調用批處理文件,則必須如果在它的空間用引號括起來的參數。

例如爲:Batch.cmd 「C:\用戶\桌面\空間true.txt」

埃裏克

+0

那麼我不親自調用批處理文件..就像我說的,我已經將批處理文件設置爲處理時打開的標準「程序」。txt文件....我現在只是雙擊.txt文件...所以我沒有辦法把路徑放在「」... – Haeri 2015-02-17 22:55:44

0
%* 

這裏有字符的列表。

& seperates commands on a line. 

&& executes this command only if previous command's errorlevel is 0. 

|| (not used above) executes this command only if previous command's errorlevel is NOT 0 

> output to a file 

>> append output to a file 

< input from a file 

| output of one command into the input of another command 

^ escapes any of the above, including itself, if needed to be passed to a program 

" parameters with spaces must be enclosed in quotes 

+ used with copy to concatinate files. E.G. copy file1+file2 newfile 

, used with copy to indicate missing parameters. This updates the files modified date. E.G. copy /b file1,, 

%variablename% a inbuilt or user set environmental variable 

!variablename! a user set environmental variable expanded at execution time, turned with SelLocal EnableDelayedExpansion command 

%<number> (%1) the nth command line parameter passed to a batch file. %0 is the batchfile's name. 

%* (%*) the entire command line. 

%<a letter> or %%<a letter> (%A or %%A) the variable in a for loop. Single % sign at command prompt and double % sign in a batch file. 
+0

好吧非常有用。謝謝!只要我可以實現它,我會立即採取解決方案xD – Haeri 2015-02-17 22:59:10

+0

我可以問你可能在更新後的操作中瀏覽一下我的代碼嗎?我現在不得不多次改變它,因爲我發現了越來越多的小錯誤,例如白色的步伐和雙引號以及其他的東西。既然你看起來像一個懂得cmd命令的人,也許你可以給我一個反饋並糾正任何愚蠢的錯誤? – Haeri 2015-02-17 23:08:10

0
@echo on 
set var= "%*" 
c: 
cd "C:\Users\MyText Editor" 
start javaw -jar "MyTextEditor.jar"%var% 
pause 

變爲刪除冗餘的命令

start "" javaw -jar "C:\Users\MyText Editor\MyTextEditor.jar" "%*" 
pause 

回聲已經上,除非你關閉。

我們不會把事情變成無理由的變量,它已經在%*。它只是製造令人費解的代碼,並從變量的名稱中刪除含義。

編程時(與打字不同),我們不更改路徑(並且cd /d C:\Users\MyText Editor確實是驅動器和文件夾)。

我們在命令行中指定完整路徑。這使你的意思非常清楚。

主要問題是有.jar和VAR%%和啓動命令上線第一引號假設到CMD的窗口標題之間沒有空格。我會將路徑編碼爲javaw,而不是使用start。開始是要求Windows的圖形化外殼啓動文件,而不是CMD。

這是一個啓動vbs文件的批處理文件。我沒有指定cscript的路徑,因爲它是Windows的命令。

它的複雜性是使用相當白癡證明,並容易爲他人。

@echo off 


Rem Make sure filter.vbs exists 
set filter= 
set filterpath= 
Call :FindFilter filter.vbs 

Rem Add filter.bat to the path if not in there, setx fails if it's already there 
setx path %~dp0;%path% 1>nul 2>nul 




Rem Test for some command line parameters 
If not "%1"=="" goto main 

echo. 
echo ------------------------------------------------------------------------------- 
echo. 
echo Filter.bat 

echo ========== 
echo. 
echo  The Filter program is a vbs file for searching, replacing, extracting, and 
echo  trimming console output and text files. 
echo. 
echo  Filter.bat makes Filter.vbs easily usable from the command line. It 
echo  controls unicode/ansi support and debugging. 
echo. 
echo   Type Filter Help or Filter HTMLHelp for more information. 
echo. 
cscript //nologo "%filter%" menu 
Goto :EOF 

:Main 


echo %date% %time% %~n0 %* >>"%~dp0\FilterHistory.txt" 



rem echo Batch file ran 
rem echo %* 
Rem /ud Unicode and Debug 
If %1==/ud FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //u //x %%j&Goto :EOF 

Rem /u Unicode 
If %1==/u FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //u %%j&Goto :EOF 

Rem /d Ansi Debug 
If %1==/d FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //x %%j&Goto :EOF 

Rem -ud Unicode and Debug 
If %1==-ud FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //u //x %%j&Goto :EOF 

Rem /u Unicode 
If %1==-u FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //u %%j&Goto :EOF 

Rem -d Ansi Debug 
If %1==-d FOR /F "tokens=1*" %%i IN ("%*") DO cscript "%filter% 
" //nologo //x %%j&Goto :EOF 

Rem ANSI 
cscript "%filter% 
" //nologo %*&Goto :EOF 

Goto :EOF 

:FindFilter 

If Exist "%~dpn0.vbs" set filter=%~dpn0.vbs&set filterpath=%~dp0&goto :EOF 

echo find filter 1 
If Not "%~dpnx$PATH:1" == "" set filter=%~dpnx1&set filterpath=%~dp1&goto :EOF 

echo find filter 2 
If Exist "%temp%\filter.vbs" set filter=%temp%\filter.vbs&set filterpath=%temp%&goto :EOF 

copy "%~dpnx0" "%~dpn0.bak" 
if not errorlevel 1 (
    echo creating "%~dpn0.vbs" 
    goto :EOF 
) 

copy "%~dpnx0" "%temp%\filter.bak" 

echo Error %errorlevel% 
if not errorlevel 1 (
    echo creating "%temp%\filter.bak" 
    Goto :EOF 
) 
Goto :EOF 
+0

不,空間在'var'的定義中。另外,''%*「'中的引號是問題的實際來源。請參閱[我的答案](http://stackoverflow.com/a/28573172/1012053) – dbenham 2015-02-17 23:26:50

+0

'c:\ Java路徑\ JavaW.exe -Jar「C:\ Users \ MyText Editor \ MyTextEditor.jar」「%1 「'只要把這個註冊表就行了。沒有批處理文件需要。 – Serenity 2015-02-18 03:36:38

+0

是的,在我的編輯答案中,在您發表評論前不久,我得出了相同的結論。 – dbenham 2015-02-18 05:55:25

0

你的問題是真的,你的設置命令的語法是錯誤的。在一個批處理文件 ,一組命令如下:

set "var=%1" 

如收到這將會給你準確的變量。如果用戶引用它, 那麼變量的值將會有引號。要刪除引號, 你把~在號碼前:

set "var=%~1" 

注意引號怎麼去圍繞整個分配,而不是僅僅圍繞 值要爲其分配。它不是set var="%1"

如果您使用set var= "%*",您還沒有真正解決基本問題 您的語法錯誤。此外,通常您確實需要%1,而不是整個命令行的 。

下面是一個示例腳本測試各種報價行爲:

@echo off 
set var="%*" 
echo 1. var="%%*" --^> [%var%] (wrong) 

set "var=%*" 
echo 2. "var=%%*" --^> [%var%] 

set "var=%1" 
echo 3. "var=%%1" --^> [%var%] 

set "var=%~1" 
echo 4. "var=%%~1" --^> [%var%] 

set "var=%~2" 
echo 5. "var=%%~2" --^> [%var%] 

set "var=%~3" 
echo 6. "var=%%~3" --^> [%var%] 

這裏是該腳本的輸出。注意ARG1,ARG2,以及如何ARG3都 報價:

C:\batch> all_args.cmd "arg 1" "this is arg 2" "arg 3" 

1. var="%*" --> [""arg 1" "this is arg 2" "arg 3""] (wrong) 
2. "var=%*" --> ["arg 1" "this is arg 2" "arg 3"] 
3. "var=%1" --> ["arg 1"] 
4. "var=%~1" --> [arg 1] 
5. "var=%~2" --> [this is arg 2] 
6. "var=%~3" --> [arg 3] 

你可以看到數字4,5和6正確地掏出自己的報價參數 和保存價值爲VAR。您通常希望保存不帶引號的參數,然後在您的腳本中使用它時引用它。換句話說,你的腳本應該看起來像這樣:

@echo on 
set "var=%~1" 
c: 
cd "C:\Users\MyText Editor" 
start javaw -jar "MyTextEditor.jar" "%var%" 
pause