相关疑难解决方法(0)

为什么批处理文件中的延迟扩展在这种情况下不起作用?

这段代码

@echo off
setlocal EnableDelayedExpansion

set myvar=first
set first=second

echo myvar:!myvar!
set myvar=!myvar!
echo myvar:!myvar!
Run Code Online (Sandbox Code Playgroud)

myvar:first
myvar:first
Run Code Online (Sandbox Code Playgroud)

在Windows Vista SP2上.

我预期的输出是

myvar:first
myvar:second
Run Code Online (Sandbox Code Playgroud)

为什么差异以及如何获得理想的效果?

windows batch-file

3
推荐指数
1
解决办法
6278
查看次数

在Batch中读取带有特殊字符的文件

如何在批处理中读取和解析具有特殊字符的文件?我有一个名为test.txt的文本文件,只有foo!!!bar一个批处理文件:

@echo off
setlocal enabledelayedexpansion enableextensions

FOR /F "tokens=* delims=" %%a IN (.\test.txt) DO (
    echo Unquoted is %%a
    echo Quoted is "%%a"
    set "myVar=%%a"
    echo myVar is still !myVar! or "!myVar!"
)
exit /b 0
Run Code Online (Sandbox Code Playgroud)

我希望并期望它以foo!!!bar某种方式输出,但这输出:

Unquoted is foobar
Quoted is "foobar"
myVar is still foobar or "foobar"
Run Code Online (Sandbox Code Playgroud)

当然我可以type test.txt,但我想处理文件的每一行.

io for-loop batch-file special-characters

3
推荐指数
1
解决办法
4386
查看次数

如何正确转义Windows cmd.exe中的文件名?

如果您有一个包含空格的文件名,通常在Windows命令shell(cmd.exe)上引用它.

dir "\Program Files"
Run Code Online (Sandbox Code Playgroud)

这也适用于其他特殊字符^&;,=.但它不适用于百分号,因为它们可能是变量替代的一部分.例如,

mkdir "%os%"
Run Code Online (Sandbox Code Playgroud)

将创建一个名为的目录Windows_NT.要逃脱百分号,可以使用插入符号:

mkdir ^%os^%
Run Code Online (Sandbox Code Playgroud)

但不幸的是,插入符号在双引号中失去了意义:

mkdir "^%os^%"
Run Code Online (Sandbox Code Playgroud)

创建一个名为的目录^%os^%.

这是我到目前为止发现的(Windows 7命令shell):

  • 字符^&可与插入符号或双引号进行转义.
  • 字符;,,,=,和空间只能用双引号转义.
  • 角色%只能用插入符号进行转义.
  • '`+-~_.!#$@()[]{}显然,这些字符不必在文件名中进行转义.
  • <>:"/\|?*无论如何,这些字符在文件名中都是非法的.

这似乎使得引用文件名的通用算法相当复杂.例如,要创建一个名为的目录My favorite %OS%,您必须编写:

mkdir "My favorite "^%OS^%
Run Code Online (Sandbox Code Playgroud)

问题1:是否有更简单的方法来安全地引用空格和百分比字符?

问题2:'`+-~_.!#$@()[]{}如果没有逃脱,角色是否真的可以安全使用?

filenames cmd escaping

3
推荐指数
1
解决办法
5965
查看次数

在Windows批处理文件中的字符串变量中使用%2*

我正在尝试批量创建一个简单的脚本以在Windows中运行,该脚本有3个变量:

  1. 要打开的URL
  2. 要打开的窗口数
  3. 等待新窗口打开的时间

该脚本工作正常,除非URL包含%20或%2F等字符,其中我猜cmd.exe试图将它们用作变量,我将URL的值放在引号之间,但这没有帮助.

如果我使用地址:

set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"
Run Code Online (Sandbox Code Playgroud)

浏览器打开这个:

https://domain.com/app.html?path=FFlocalhostFcode&do_pause=false&go=true
Run Code Online (Sandbox Code Playgroud)

有没有办法可以设置变量或处理它的值,这样它就不会将这些符号解释为变量名?

在此先感谢,这里是代码供参考.这是我第一次尝试批量编写脚本,所以任何建议都会非常感激.

@echo off

echo "Setting variables..."
set iterations=2
set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"
set time=5

set browser="C:\Program Files\Google\Chrome\Application\chrome.exe"

echo "Running the browser..."
FOR /L %%i IN (1,1,%iterations%) DO (
%browser% %url%
timeout %time%
)

ECHO Browsers are running, press Enter when ready to close this window. . .
pause
Run Code Online (Sandbox Code Playgroud)

windows batch-file variable-assignment

2
推荐指数
1
解决办法
7464
查看次数

Python timeit命令行错误:"SyntaxError:EOL扫描字符串文字时"

我一直在使用Python timeit模块,但它只是通过交互式Python会话或Unix shell.现在,我正在尝试在Windows命令提示符(cmd.exe)中测量一些代码片段,但它显示以下错误:

C:\Users\Me>python -m timeit '"-".join(map(str, range(100)))'
Traceback (most recent call last):
  File "C:\Python33\lib\runpy.py", line 160, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "C:\Python33\lib\runpy.py", line 73, in _run_code
    exec(code, run_globals)
  File "C:\Python33\lib\timeit.py", line 334, in <module>
    sys.exit(main())
  File "C:\Python33\lib\timeit.py", line 298, in main
    t = Timer(stmt, setup, timer)
  File "C:\Python33\lib\timeit.py", line 131, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 6
    '-.join(map(str,
                   ^
SyntaxError: EOL while scanning string literal
Run Code Online (Sandbox Code Playgroud)

这是相当令人困惑的,因为我没有在字符串中插入任何换行符 - 相反,我实际上直接从timeit模块文档粘贴了示例.

在玩这个时,我尝试测试没有任何空格的片段,因为错误标记了它们之前的字符.即使现在没有异常,模块也会报告相同的执行时间,就像我传递了一个pass …

python windows command-line cmd timeit

2
推荐指数
1
解决办法
2682
查看次数

如何在批处理文件中检查变量是否包含特殊字符

如何检查批处理文件中的变量是否包含特殊字符?例如,如果我的变量包含文件名,则文件名不应包含\/ < > | : * " ?此类字符。

@echo off
set param="XXX"
echo %param%| findstr /r "^[^\\/?%*:|"<>\.]*$">nul

if %errorlevel% equ 0 goto :next
echo "Invalid Attribute"

:next
echo correct
Run Code Online (Sandbox Code Playgroud)

我使用此链接作为参考正则表达式来验证文件夹名称和文件名

windows batch-file

2
推荐指数
1
解决办法
6211
查看次数

如何通过 Windows 上的 system() 函数将换行符作为参数传递?

通常可以用来^在命令行中转义字符。但我无法让它工作。

这是一个测试程序,CommandArguments.exe,它打印它得到的参数。

int main(int argc, char *argv[])
{
    int i, j;
    for (i = 0; i < argc; ++i) {
        printf("%d: %s\n", i, argv[i]);
        for (j = 0; j < strlen(argv[i]); ++j) {
            printf("  ");
            printf("%d ", argv[i][j]);
        }
        printf("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

有问题的程序 LineBreakCommandArguments.exe 如下所示:

void main(void)
{
    system("CommandArguments ^\n"); // ^\n does not really pass a line break...
}
Run Code Online (Sandbox Code Playgroud)

LineBreakCommandArguments.exe 的输出:

>LineBreakCommandArguments.exe
0: CommandArguments
  67   111   109   109   97   110   100   65   114   103   117   109   101 …
Run Code Online (Sandbox Code Playgroud)

c windows command-line parameter-passing command-line-arguments

2
推荐指数
1
解决办法
688
查看次数

Order-Ambiguous Shell I/O重定向的一致性如何?

这个引人入胜的帖子:

这个命令如何合法?"> file1 <file2 cat"

在一个看似格式错误的cat"shell"(一个Linux shell,大概是BASH)的调用中突出了令人惊讶的行为.基本上,shell似乎能够从一系列字符串中的模糊位置获取可执行文件,然后使用I/O重定向到流/文件描述符.

根据我的理解,基本过程是:

  1. 查找重定向模式并将其读入或读出适当的流/文件描述符(例如:1>(stdout))(这发生在命令中启动可执行进程之前!(例如cat调用))
  2. 在字符串列表中查找可执行进程.
  3. 启动该可执行过程
  4. 暂停进程完成或继续(根据需要)在步骤1中检测到的各种输出.

这导致了一些令人惊讶的逻辑.例如,在执行后的新目录中echo "dog" > cat:

  • <cat cat >dog:从文件中写入"狗" catdog使用shell工具cat

  • <cat cat> cat cat:覆盖第一个命令,留下一个空白cat文件(不确定在第二个命令的中间发生了什么).

  • <cat cat> cat cat >dog 2>more:创建空文件,dog并用空文件more覆盖cat文件.

  • <cat >dog cat cat <dog >cat(创建空文件dog,覆盖catw /空文件)

  • <cat cat >dog 2>much 1>more:用cat空文件覆盖; 创建文件dog/ …

bash shell parsing cmd io-redirection

2
推荐指数
1
解决办法
132
查看次数

如何在批处理中没有新行的情况下将双引号回显到文件中?

我想"在文件中使用 Batch编写符号。

echo| set /p=""" >> abc.txt
Run Code Online (Sandbox Code Playgroud)

这不能按预期工作,因为它将数据发送到我的文件时出错。

有任何想法吗?

cmd batch-file echo

2
推荐指数
1
解决办法
76
查看次数

批处理脚本:此时\MyProg 出乎意料

我有一个简单的批处理脚本test.bat,它通过命令行参数进行迭代:

@echo off
set prefix=C:\Program Files\MyProg
for %%x in (%*) do (
    echo %prefix%
)
Run Code Online (Sandbox Code Playgroud)

这个版本的脚本在 cmd.exe 中没有问题:

C:\>test a b
C:\Program Files\MyProg
C:\Program Files\MyProg
Run Code Online (Sandbox Code Playgroud)

但是,如果我修改批处理文件以具有不同的prefix值,则添加(x86)

set prefix=C:\Program Files (x86)\MyProg
Run Code Online (Sandbox Code Playgroud)

脚本失败:

C:\>test a b
\MyProg was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

这悲剧!我该如何解决这个问题?

windows batch-file

2
推荐指数
1
解决办法
278
查看次数