2015-02-17 104 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 
相关问题