将命令的输出保存在命令行中的变量或临时文件中
Hold the output of a command in a variable or temp file in command line
我正在 运行 宁一个像
这样的命令
nssm.exe get MyWindowsService AppParameters
它的输出是
--client-version 6.1.0
现在我想像这样向这个输出附加一些文本
--client-version 6.1.0 --baseUrl helloworld.txt
然后 运行 一个新命令和这个新输出
nssm.exe set MyWindowsService AppParameters = --client-version 6.1.0 --baseUrl helloworld.txt
我想在一个批处理文件中完成所有这些,所以我只需要添加“--baseUrl helloworld.txt”,它应该处理与第一个命令的输出的连接,并用第二个命令自行执行.
我一直在使用 {for /f} 来保存命令返回的输出值,然后使用该输出。但是事情并没有像附图中描述的那样进行
我已经使用这种方法(从文件中读取文本)几次,它似乎工作正常,但有时当我试图通过命令行从文件中读取文本时,"output(ted)"它不会工作。请指导我如何处理这种情况以及造成这种情况的原因
您可以在此处找到输出文件
https://www.dropbox.com/s/yr6s7eo8d8uwhey/output.txt?dl=0
您的问题是检索 AppParameters 时的 unicode 输出。您可以将其处理为
nssm get MyWindowsService AppParameters > tempFile
for /f "delims=" %%a in ('
^< tempFile find /v ""
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
或
nssm get MyWindowsService AppParameters > tempFile
for /f "delims=" %%a in ('
more tempFile
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
或者,没有临时文件
for /f "delims=" %%a in ('
nssm get MyWindowsService AppParameters ^| sort
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
已编辑 包含如何处理引号的示例代码。
@echo off
setlocal enableextensions disabledelayedexpansion
set "svc=MyWindowsService"
nssm install "%svc%" "c:\windows\system32\cmd.exe"
nssm set "%svc%" Start SERVICE_DEMAND_START
nssm set "%svc%" AppParameters "--client-version ""6.1.0"""
echo ---------------------------------------------------------------
nssm get "%svc%" AppParameters
echo ---------------------------------------------------------------
for /f "delims=" %%a in ('
nssm get "%svc%" AppParameters ^| sort
') do (
set "appParams=%%a"
setlocal enabledelayedexpansion
nssm.exe set "%svc%" AppParameters "!appParams:"=""!" "--baseUrl=""C:\ProgramData\"""
endlocal
)
echo ---------------------------------------------------------------
nssm get "%svc%" AppParameters
echo ---------------------------------------------------------------
nssm remove "%svc%" confirm
我正在 运行 宁一个像
这样的命令nssm.exe get MyWindowsService AppParameters
它的输出是
--client-version 6.1.0
现在我想像这样向这个输出附加一些文本
--client-version 6.1.0 --baseUrl helloworld.txt
然后 运行 一个新命令和这个新输出
nssm.exe set MyWindowsService AppParameters = --client-version 6.1.0 --baseUrl helloworld.txt
我想在一个批处理文件中完成所有这些,所以我只需要添加“--baseUrl helloworld.txt”,它应该处理与第一个命令的输出的连接,并用第二个命令自行执行.
我一直在使用 {for /f} 来保存命令返回的输出值,然后使用该输出。但是事情并没有像附图中描述的那样进行
我已经使用这种方法(从文件中读取文本)几次,它似乎工作正常,但有时当我试图通过命令行从文件中读取文本时,"output(ted)"它不会工作。请指导我如何处理这种情况以及造成这种情况的原因
您可以在此处找到输出文件 https://www.dropbox.com/s/yr6s7eo8d8uwhey/output.txt?dl=0
您的问题是检索 AppParameters 时的 unicode 输出。您可以将其处理为
nssm get MyWindowsService AppParameters > tempFile
for /f "delims=" %%a in ('
^< tempFile find /v ""
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
或
nssm get MyWindowsService AppParameters > tempFile
for /f "delims=" %%a in ('
more tempFile
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
或者,没有临时文件
for /f "delims=" %%a in ('
nssm get MyWindowsService AppParameters ^| sort
') do (
nssm.exe set MyWindowsService AppParameters "%%a --baseUrl helloworld.txt"
)
已编辑 包含如何处理引号的示例代码。
@echo off
setlocal enableextensions disabledelayedexpansion
set "svc=MyWindowsService"
nssm install "%svc%" "c:\windows\system32\cmd.exe"
nssm set "%svc%" Start SERVICE_DEMAND_START
nssm set "%svc%" AppParameters "--client-version ""6.1.0"""
echo ---------------------------------------------------------------
nssm get "%svc%" AppParameters
echo ---------------------------------------------------------------
for /f "delims=" %%a in ('
nssm get "%svc%" AppParameters ^| sort
') do (
set "appParams=%%a"
setlocal enabledelayedexpansion
nssm.exe set "%svc%" AppParameters "!appParams:"=""!" "--baseUrl=""C:\ProgramData\"""
endlocal
)
echo ---------------------------------------------------------------
nssm get "%svc%" AppParameters
echo ---------------------------------------------------------------
nssm remove "%svc%" confirm