如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]

Posted

技术标签:

【中文标题】如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]【英文标题】:How to export to CSV in format like this datetime;hostname;username1;username2; [closed] 【发布时间】:2022-01-15 02:51:49 【问题描述】:

请帮助我将某些内容解析为 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

【问题讨论】:

noo 因为我需要批量进行 作为旁注,flamixx %COMPUTERNAME% 不一定会扩展为与分配给“主机名”的字符串相同的字符串。 【参考方案1】:

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

此站点上已有许多问题和答案,其中显示了使用非区域设置或其他配置格式获取日期和时间的方法,最有用的非 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,即“有点不同”不是您想要的,那么以下应该执行相同的任务:

@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"

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

【讨论】:

这不是“有点不同”,这是一种使另一个工作更简单的答案复杂化的令人困惑的方式。你没有帮助或让任何人通过这个学习一些东西...... 无论如何,我当然明白,这回答你自己,如果你以后需要编辑它,打开一个新问题会更容易......,我明白这里的方式是教人们解决自己的问题,而不是完全创造/改变它们.. 这与工作与否无关,也与限制无关,如果是的话,编辑子字符串变量以在必要时进行调整会更容易。但是请理解,对您的答案进行任何编辑,其中字符汤、转义和倍数 for,对于比您想象的更多的用户来说,它会变得复杂 100 倍,但它仍然有效。 当然是关于“工作”@Io-oI!正如您所说,我的代码有效,并且与 OP 的“答案”内容以及 Gerhard 提供的内容不同,它不限于最终用户的语言、日期和时间设置,也不假设要跳过的预设行数.由于这是一个国际网站,因此不限于语言或区域设置的答案比您认为的更有用。 两者都有效,但如果没有您的国际参与,则无法在必要时编辑您的。更改有效的方法(必要时进行一些简单的编辑),因此“国际有效”要复杂 100 倍,【参考方案2】:

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')

【讨论】:

【参考方案3】:

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

@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"

【讨论】:

您不能随意发布答案,这不是它的工作方式,请按照您在网站上注册时应该阅读的内容重新阅读。【参考方案4】:

我想你想要这样的东西?

@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"

【讨论】:

以上是关于如何以如下格式导出为 CSV 日期时间;主机名;用户名 1;用户名 2; [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

数据从 SQL Developer 导出到 CSV

如何以CSV格式输出数据

关于导出csv格式文件的身份证号日期的处理

Codeigniter - 使用日期格式将表记录导出为 CSV

如何以 csv 格式导出 redhsift 卸载命令的输出?

如何以 dd/mm/yyyy hh:mm 格式从 CSV 导入日期到 R 中的通用数字字符串