批处理%1获取具有空格的路径

时间:2015-02-17 22:48:44

标签: batch-file whitespace

我已将批处理文件设置为默认打开.txt文件。在之前的一个问题中,我发现%1为我提供了实际调用批处理文件的文件的路径。问题是:如果文件名包含空格,则会将其解释为多个参数。

示例:

  

打开文件“C:\ Users \ Desktop \ space true.txt”

     

%1给出:“C:\ Users \ Desktop \ space”然后%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" %*

我唯一抱怨的是,有一种情况,%*没有返回带引号的路径。所以我正在寻找最终的解决方案。这样的事情"%~*"但这不起作用。

提前致谢

5 个答案:

答案 0 :(得分:0)

调用批处理文件时,如果参数中有空格,则必须将参数括在引号中。

例如:Batch.cmd" C:\ Users \ Desktop \ space true.txt"

埃里克

答案 1 :(得分: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.

答案 2 :(得分: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

除非你被关闭,否则Echo已经开启。

我们不会无缘无故地把事情变成变量,而且它已经在%*中了。它只会产生复杂的代码并从变量的名称中删除含义。

编程时(与输入不同)我们不会更改路径(而cd /d C:\Users\MyText Editor无论如何都会改变路径。)

我们在命令行上指定完整路径。这使你的意思非常清楚。

主要问题是.jar和%var%以及启动命令之间没有空格线上的第一个引号被假定为CMD的窗口标题。我会编写javaw的路径而不是使用start。开始是要求Windows的图形shell启动文件,而不是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

答案 3 :(得分:0)

以下内容不太正确 - 我认为文件关联会在文件名周围加上引号,就像拖放一样。但我错了

此行是问题的根源:

set var= "%*"

将文件拖到批处理脚本上,或双击文本文件时,任何包含空格的文件名都会自动括在引号内。

当您添加自己的附加引号时,它会违反引号的目的 - 不再引用该空格。

例如,像"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

编辑 - 以下内容应该有效

好的,我做了一些测试,我相信你最好的办法是修改与.txt文件相关的命令。

我通过命令行测试了关联更改。这必须通过具有管理员权限的提升命令提示符来完成。在我的机器上,我转到开始菜单,单击&#34;所有程序&#34;,单击&#34;附件&#34;单击文件夹,右键单击&#34;命令提示符&#34;,然后选择&#34;以管理员身份运行&#34;,然后单击&#34;是&#34;允许程序对系统进行更改。

以下命令将显示需要修改的文件类型

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"

答案 4 :(得分:0)

您的问题实际上是您的set命令的语法错误。在一批 文件,set命令如下所示:

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