首页 > 解决方案 > 系统找不到指定的路径 - 批处理到exe

问题描述

早上好。我编写了一个批处理文件,通过 audit.csv 文件更新组策略。以前我正在通过更改策略,auditpol但这些更改并没有持续,所以我想出了这个解决方案。

:: Write the correct audit settings to audit.csv
set "auditFile="C:\Windows\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv""

echo Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting,Setting Value > %auditFile%
echo ,System,Audit Credential Validation,{0cce923f-69ae-11d9-bed3-505054503030},Success and Failure,,3 >> %auditFile%
…

它做了一些其他的事情,但这就是我得到错误的地方。

昨天,像常规批处理脚本文件一样运行它运行良好。现在我得到了The system cannot find the path specified.错误。我看过一些有同样问题的帖子,解决方案是运行cmd /c file.bat,这对我现在不起作用。创建帖子时,我没想到运行批处理文件会出现这个问题。当我昨天测试时,批处理文件工作正常,但是当我转换为 exe(使用 PowerArchiver 和 iexpress)时,我得到了错误。所以我不知道为什么它在 .bat 版本中不起作用,但我想如果我能解决这个问题,它应该修复转换后的 exe。

我的主要问题是为什么我会收到这个错误?是因为 echo 命令吗?由于我试图访问的文件,它是否给了我错误?这是权限的事情吗?

标签: batch-filecmdexe

解决方案


批处理文件由 64 位cmd.exe存储在使用Windows 文件资源管理器%SystemRoot%\System32双击批处理文件时执行。在这种情况下,该目录最有可能存在(不在我的 Windows 计算机上)。%SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit

但是在将批处理文件打包成一个 32 位可执行文件后,该文件在执行时将其提取到%TEMP%或临时创建的子目录中,然后运行 ​​Windows 命令处理器以执行临时提取的批处理文件,执行存储%TEMP%的 32 位是因为Windows文件系统重定向器cmd.exe%SystemRoot%\SysWOW64

在 x86 应用程序的执行环境中活动的文件系统重定向器%SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv现在将对文件的写访问重定向到文件%SystemRoot%\SysWOW64\GroupPolicy\Machine\Microsoft\Windows NT\Audit\audit.csv的整个目录树,并且很可能audit.csv在这种情况下不存在文件的整个目录树。

一个解决方案是使用以下代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Define Windows system folder path and make sure the right path is used
rem if this batch file is executed on 64-bit Windows in 32-bit environment.
set "SystemFolder=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%" == "" if exist %SystemRoot%\Sysnative\cmd.exe set "SystemFolder=%SystemRoot%\Sysnative"
set "AuditFilePath=%SystemFolder%\GroupPolicy\Machine\Microsoft\Windows NT\Audit"

rem Create the directory with suppressing the error message on missing
rem permissions to create this directory or on directory existing already.
md "%AuditFilePath%" 2>nul
if not exist "%AuditFilePath%\" (
    echo ERROR: Failed to creeate the directory:
    echo        %SystemRoot%\System32\GroupPolicy\Machine\Microsoft\Windows NT\Audit
    echo        The batch file "%~nx0" must be run as administrator.
    goto EndBatch
)

rem Write the correct audit settings to file audit.csv.
set "FullAuditFileName=%AuditFilePath%\audit.csv"
(
echo Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting,Setting Value
echo ,System,Audit Credential Validation,{0cce923f-69ae-11d9-bed3-505054503030},Success and Failure,,3
) >"%FullAuditFileName%"

rem More commands to execute.

:EndBatch
endlocal

此批处理文件还audit.csv使用两行 CSV 行创建文件,两行末尾都没有尾随空格。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?...解释%~nx0...名称+批处理文件的扩展名
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • md /?
  • rem /?
  • set /?
  • setlocal /?

也可以看看:


推荐阅读