这是我的批处理文件中的命令setpath.bat
set workdir="%cd%"
timeout 30
set path="C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;"
timeout 30
每次我在 Windows 10 上的 cmd.exe 中运行此批处理时,都会出现此错误
E:\>setpath.bat
E:\>set workdir="E:\"
E:\>timeout 30
Waiting for 29 seconds, press a key to continue ...
E:\>set path="C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;"
E:\>timeout 30
'timeout' is not recognized as an internal or external command,
operable program or batch file.
我知道set
会修改当前 shell(窗口)的环境值,并且更改立即可用,但只是暂时的;而会setx
永久修改该值,这会影响所有未来的 shell,但不会修改已经运行的 shell 的环境。
我只是想知道是否可以在 Windows 10 上为环境值 %path% 分配值,以便我可以立即在 shell 内运行某些命令。
以下是使用这些命令的另一个实验
echo %path%
set workdir="%cd%"
timeout 30
set path="C:\Windows\system32;"
echo %path%
timeout 30
C:\Windows\system32\timeout 30
和这个输出
E:\>setpath.bat
E:\>echo E:\Miniconda3\condabin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;E:\Miniconda3;E:\Miniconda3\Scripts;E:\Miniconda3\Library\bin;C:\Users\AlbertD\AppData\Local\Microsoft\WindowsApps;e:\Program Files\JetBrains\PyCharm Community Edition 2020.3\bin
E:\Miniconda3\condabin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;E:\Miniconda3;E:\Miniconda3\Scripts;E:\Miniconda3\Library\bin;C:\Users\AlbertD\AppData\Local\Microsoft\WindowsApps;e:\Program Files\JetBrains\PyCharm Community Edition 2020.3\bin
E:\>set workdir="E:\"
E:\>timeout 30
Waiting for 30 seconds, press a key to continue ...
E:\>set path="C:\Windows\system32;"
E:\>echo "C:\Windows\system32;"
"C:\Windows\system32;"
E:\>timeout 30
'timeout' is not recognized as an internal or external command,
operable program or batch file.
E:\>C:\Windows\system32\timeout 30
Waiting for 29 seconds, press a key to continue ...
E:\>
这意味着当前 shell 无法找到 timeout.exe,即使 %path% 变量只有一个值,通过完整路径调用它也可以正常工作。
我做过很多其他实验,包括set path="%workdir%;%path%"
,但都没有成功。
答案1
您的路径中有“”。不应添加它们。
尝试
set path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;
另外,为什么不像这样改变路径?
set path=C:\mydir;%path%
这可以确保您的路径保留所有原始路径设置并且仅添加您想要添加的内容......
答案2
开始对批处理文件中的环境变量进行本地化。本地化将持续进行,直到遇到匹配的 endlocal 命令或到达批处理文件的末尾。*
如果在脚本或批处理文件之外使用 setlocal,则它不起作用。 运行批处理文件时,使用 setlocal 更改环境变量。运行 setlocal 后所做的环境更改仅限于批处理文件。当 Cmd.exe 程序遇到 endlocal 命令或到达批处理文件末尾时,它会恢复以前的设置。
批处理程序中可以有多个 setlocal 或 endlocal 命令(即嵌套命令)。
- 您还可以使用系统变量来定义您的“替代”路径:
rem :: %~DP0% == > Drive + Path from where your bat file is
rem :: %__CD__%
rem :: %Windir%
rem :: %__AppDir__%
rem :: %ProgramFiles%
rem :: %ProgramFiles(x86)%
rem :: %AppData:Roaming=Local% == > Replace Roaming to Local in: %Userprofile%\AppData\Roaming to %Userprofile%\AppData\Local
for %%i in ("%~DP0%","%__CD__%","%Windir%","%__AppDir__%","%ProgramFiles%","%ProgramFiles(x86)%","%AppData:Roaming=Local%")do echo\%%~i
- 输出/结果:
F:\Q1615715\
F:\Q1615715\
C:\WINDOWS
C:\Windows\System32\
C:\Program Files
C:\Program Files (x86)
C:\Users\ecker\AppData\Local
- 观察:
""
在您的使用set "path=....strings;strings;..."
仅有的:
↧ ↧
set "path=%__AppDir__%;%Windir%;%__AppDir__%Wbem;....\WindowsApps;"
@echo off
setlocal
set "workdir=%__CD__%"
timeout 30
set "path=%__AppDir__%;%Windir%;%__AppDir__%Wbem;%__AppDir__%WindowsPowerShell\v1.0\;%ProgramFiles(x86)%\NVIDIA Corporation\PhysX\Common;%ProgramFiles%\NVIDIA Corporation\NVIDIA NvDLISR;%AppData:Roaming=Local%\Microsoft\WindowsApps;"
echo.your alternative and current %%path%%
echo\%path:;=&echo\%
timeout 30
endlocal
echo.your system and current %%path%%
echo\%path:;=&echo\%
- 输出:
Waiting for 0 seconds, press a key to continue ...
your alternative and current %path%
C:\Windows\System32\
C:\WINDOWS
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
C:\Users\ecker\AppData\Local\Microsoft\WindowsApps
Waiting for 0 seconds, press a key to continue ...
your system and current %path%
C:\Program Files\Python39\Scripts\
C:\Program Files\Python39\
C:\Python38\Scripts\
C:\Python38\
C:\Program Files\ImageMagick-7.0.10-Q16-HDRI
C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64_win\mpirt
C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\ia32_win\mpirt
C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64_win\compiler
C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\ia32_win\compiler
C:\Program Files (x86)\Common Files\Oracle\Java\javapath
C:\WINDOWS\system32
C:\WINDOWS
C:\WINDOWS\System32\Wbem
C:\WINDOWS\System32\WindowsPowerShell\v1.0\
C:\WINDOWS\System32\OpenSSH\
C:\Program Files (x86)\QuickTime\QTSystem\
C:\Program Files\dotnet\
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\
C:\Program Files\nodejs\
C:\ProgramData\chocolatey\bin
C:\Program Files\Microsoft VS Code\bin
C:\Program Files (x86)\Gpg4win\..\GnuPG\bin
C:\Program Files (x86)\Sennheiser\SenncomSDK\
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common
C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR
C:\Program Files (x86)\HP\IdrsOCR_15.2.10.1114\
C:\Program Files\Git\cmd
C:\Program Files (x86)\PDFtk\bin\
C:\Ruby30-x64\bin
C:\Users\ecker\AppData\Local\Microsoft\WindowsApps
C:\Users\ecker\AppData\Roaming\npm
C:\Users\ecker\.dotnet\tools