如何以这样的格式导出到 CSV datetime;hostname;username1;username2;

How to export to CSV in format like this datetime;hostname;username1;username2;

请帮助我将某些内容解析为 CSV。我已经知道如何使用 Powershell 来完成,但我需要使用批处理文件。

我需要得到这样的输出:

datetime;hostname;username1;username2;

其中 username1 username2 等是本地管理员组的用户名。

我做了这个:

@echo off
echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%
for /f "tokens=* skip=6" %%a in ('net localgroup Administrators') do (
echo %%a >> "c:\temp\%datetimef%.csv")
pause

然而输出文件名是:

2021_ 1_Fr__11_42_18.csv

返回的日期是:

Administrator 
Usr1
The command completed successfully

如何从生成的输出文件中删除 The command completed successfully

我想你想要这样的东西?

@echo off
setlocal enabledelayedexpansion
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
set "var=%datetimef%"
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do set "var=!var!;%%a"
(echo %var%)>>"c:\temp\%datetimef%.csv"

谢谢大家!最后我在你的帮助下解决了这个问题:

@echo off
setlocal enabledelayedexpansion
rem set mydate=%:/date:/=%
rem set mytime=%time::=%
rem set mytimestamp=%mydate: =_%_%mytime:.=_%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
set mytimestamp=%mydate%_%mytime%
for /f "skip=6delims=" %%a in ('net localgroup Administrators ^| findstr /v "successfully"') do (
set param=!param!%%a;)
echo %mytimestamp%;%computername%;!param! >> "c:\temp\%mydate%.csv"

您报告的输出的主要问题是,它似乎假设了您的 %DATE%%TIME% 变量的返回输出。这些值可以针对语言环境、机器 and/or 登录用户进行不同的配置,并且在您的情况下不匹配 dd#MM#yyyy%DATE% 假设,(其中 # 代表项目分隔符)。你的显然是 ddd d#M#yyyyddd dd#MM#yyyyddd M#d#yyyy。或 ddd MM#dd#yyyy

此站点上已有许多问题和答案显示使用 none 语言环境或其他配置格式获取日期和时间的方法,最有用的非 PowerShell 方法使用内置-在 WMIC.exe 实用程序中。


只是为了一些不同的东西,即根本不使用 net.exe,而是使用 WMIC.exe:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get CSName^,LocalDateTime /Format:MOF 2^>NUL') Do If Not Defined { (Set "{=%%G") Else (SetLocal EnableDelayedExpansion
    Set "}=%%G"
    For %%H In ("!}:~,4!_!}:~4,2!_!}:~6,2!__!}:~8,2!_!}:~10,2!_!}:~12,2!;!{!") Do (EndLocal
        Set "{=%%~H"))
For /F "Tokens=1,* Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Group Where "Name='Administrators'" Assoc:List /ResultClass:Win32_UserAccount 2^>NUL ^| %SystemRoot%\System32\findstr.exe "^Name="') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Defined } (Set "}=%%I") Else (SetLocal EnableDelayedExpansion
    For %%J In ("!}!") Do (Endlocal
        Set "}=%%~J;%%I"))
Set "CSVBaseName=%{:;="&:"%"
(Echo %{%;%}%;) 1>"C:\Temp\%CSVBaseName%.csv"

如果您仍想使用 net.exe,即 'a little bit different' 不是您想要的,那么以下应该执行相同的任务:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "{="
Set "}="
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\net.exe LocalGroup
 Administrators 2^>NUL') Do (If Not Defined { (Set "{=%%G") Else (
        SetLocal EnableDelayedExpansion
        For /F Delims^= %%H In ("!{!") Do (EndLocal
            Set "{=%%H;%%G"
            Set "}=%%H"))
    Set /P "=%%G" 0<NUL | %SystemRoot%\System32\findstr.exe "^\-\-*$" 1>NUL && (
        Set "{="))
If Not Defined } GoTo :EOF
For /F Delims^=^ EOL^= %%G In ('%SystemRoot%\System32\HOSTNAME.EXE'
) Do Set "{=%%G;%}%"
For /F Tokens^=6^ Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get
 LocalDateTime /Format:MOF 2^>NUL') Do Set "}=%%~nG"
Set "}=%}:~,4%_%}:~4,2%_%}:~6,2%__%}:~8,2%_%}:~10,2%_%}:~-2%"
(Echo %}%;%{%;) 1>"C:\Temp\%}%.csv"

与此不同的是,它不假定要跳过的特定行数,它不期望最终用户语言是英语,它使用报告的主机名,而不是计算机名,(可能不一定匹配),并且再次不依赖最终用户计算机配置来定义日期和时间字符串。

通过 cmd 在 .bat batch-file 运行 中执行此操作非常容易。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。

powershell.exe -NoLogo -NoProfile -Command ^
    $DatetimeF = Get-Date -Format 'yyyy_MM_ddThh_mm_ss'; ^
    $Users = (Get-LocalGroupMember -Name Administrators).Name; ^
    $DatetimeF + ';' + $Env:COMPUTERNAME + ';' + ($Users -join ';') ^| ^
        Out-File -FilePath ($DatetimeF + '.csv')