我已将批处理文件设置为默认打开.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" %*
我唯一抱怨的是,有一种情况,%*
没有返回带引号的路径。所以我正在寻找最终的解决方案。这样的事情"%~*"
但这不起作用。
提前致谢
答案 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